仿微信Webview 顶部平滑进度条

2017-08-19  本文已影响0人  Luo_XuLiang

/**

public class RateActivity extends BaseActivity {
@BindView(R.id.wv_rate)
WebView webView;
@BindView(R.id.pb_web)
ProgressBar mProgressBar;
private int from; //页面类型
private String URL = "https://www.baidu.com"; //链接地址
private boolean isAnimStart = false;
private int currentProgress=0;

@Override
protected void initViews() {
    from = getIntent().getIntExtra("FROM",0);
    webViewInit(URL);
}

 //webview初始化
 
private void webViewInit(String URL) {
    webView.setWebViewClient(new WebViewClient() {
        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            super.onPageStarted(view, url, favicon);
            mProgressBar.setVisibility(View.VISIBLE);
            mProgressBar.setAlpha(1.0f);
        }
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
           //view.loadUrl(url);
            return true;
        }
    });

    // 获取网页加载进度
    webView.setWebChromeClient(new WebChromeClient() {

        @Override
        public void onProgressChanged(WebView view, int newProgress) {
            if (null==mProgressBar) return;
            currentProgress = mProgressBar.getProgress();
            if (newProgress >= 100 && !isAnimStart) {
                // 防止调用多次动画
                isAnimStart = true;
                mProgressBar.setProgress(newProgress);
                // 开启属性动画让进度条平滑消失
                startDismissAnimation(mProgressBar.getProgress());
            } else {
                // 开启属性动画让进度条平滑递增
                startProgressAnimation(newProgress);
            }
        }
    });
    webView.getSettings().setJavaScriptEnabled(true);
    webView.loadUrl(URL);
}

@Override
protected boolean shouldBindEvent() {
    return false;
}

/**
 * progressBar递增动画
 */
private void startProgressAnimation(int newProgress) {
    ObjectAnimator animator = ObjectAnimator.ofInt(mProgressBar, "progress", currentProgress, newProgress);
    animator.setDuration(300);
    animator.setInterpolator(new DecelerateInterpolator());
    animator.start();
}

/**
 * progressBar消失动画
 */
private void startDismissAnimation(final int progress) {
    ObjectAnimator anim = ObjectAnimator.ofFloat(mProgressBar, "alpha", 1.0f, 0.0f);
    anim.setDuration(1500);  // 动画时长
    anim.setInterpolator(new DecelerateInterpolator());     // 减速
    // 关键, 添加动画进度监听器
    anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {

        @Override
        public void onAnimationUpdate(ValueAnimator valueAnimator) {
            float fraction = valueAnimator.getAnimatedFraction();      // 0.0f ~ 1.0f
            int offset = 100 - progress;
            if (null!=mProgressBar) {
                mProgressBar.setProgress((int) (progress + offset * fraction));
            }
        }
    });

    anim.addListener(new AnimatorListenerAdapter() {

        @Override
        public void onAnimationEnd(Animator animation) {
            // 动画结束
            mProgressBar.setProgress(0);
            mProgressBar.setVisibility(View.GONE);
            isAnimStart = false;
        }
    });
    anim.start();
}

/**
 * 监听up键
 * id = android.R.id.home
 */
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId() == android.R.id.home) {
        finish();
        return true;
    }
    return super.onOptionsItemSelected(item);
}

/**
 * 监听back键
 * 在WebView中回退导航
 */
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {  // 返回键的KEYCODE
        if (webView.canGoBack()) {
            webView.goBack();
            return true;  // 拦截
        } else {
            return super.onKeyDown(keyCode, event);   //  放行
        }
    }
     return super.onKeyDown(keyCode, event);
}

}

上一篇下一篇

猜你喜欢

热点阅读