在页面加载时启动动画,在页面加载时停止

时间:2012-05-08 23:54:36

标签: android android-webview menuitem android-animation

我的MenuItem中有ActionBar,这是一个“重新加载”图标。我的ActivityWebView,我希望图标在WebView开始加载网页时启动动画,并在完成后停止。这包括单击加载的站点中的链接。到目前为止,我第一次打开一个网页时工作,但如果我离开Activity并加载另一个网页,“重新加载”图标似乎加倍,或者我会得到NullReference refreshItem.setActionView(ivRefresh);

上抛出异常

enter image description here

这是我的代码:

public class Browser extends SherlockFragmentActivity {

    private MenuItem refreshItem;
    private WebView mWebView;

    @Override
    public void onCreate(final Bundle icicle) 
    {
        super.onCreate(icicle);
        setContentView(R.layout.browser);

        mWebView = (WebView)findViewById(R.id.webview);
        mWebView.getSettings().setSupportZoom(true);  
        mWebView.getSettings().setBuiltInZoomControls(true);

        mWebView.loadUrl("http://www.google.com");

        mWebView.setWebViewClient(new WebBrowserClient());

        mWebView.setWebChromeClient(new WebChromeClient() {
            public void onProgressChanged(WebView view, int progress) {

                //if (!isFinishing() && progress == 100 && refreshItem != null && refreshItem.getActionView() != null)
                //{
                //refreshItem.getActionView().clearAnimation();
                //refreshItem.setActionView(null);
                //}
            }
        });         
    }

    private class WebBrowserClient extends WebViewClient {

          @Override
          public void onLoadResource(WebView view, String url) {
              //StartAnimation();
          }

          @Override
          public void onPageStarted(WebView view, String url, Bitmap favicon) {
              StartAnimation();
          }

          @Override
          public void onPageFinished(WebView view, String url) {
            if (refreshItem != null && refreshItem.getActionView() != null)
            {
                refreshItem.getActionView().clearAnimation();
                refreshItem.setActionView(null);
            }
          }

         @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);
            return true;
        }
    }

    private void StartAnimation() {
        final LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        final ImageView ivRefresh = (ImageView)inflater.inflate(R.layout.refresh_view, null);

        final Animation rotation = AnimationUtils.loadAnimation(this, R.anim.refresh);
        ivRefresh.startAnimation(rotation);
        refreshItem.setActionView(ivRefresh);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getSupportMenuInflater().inflate(R.menu.menu, menu);

        refreshItem = menu.findItem(R.id.refresh);

        return super.onCreateOptionsMenu(menu);
    }
}

注释掉的代码是我试图让它发挥作用的不同方式。

更新

经过多次调试后,我在StartAnimation函数中设置了一个断点,有时它连续7次被击中,有时则不是。这没有任何意义,因为对我而言,这应该是有效的。令人费解...

解决方案(排序):

将StartAnimation()函数更新为此,似乎解决了这个问题,但似乎更像是一个胶带解决方案:

private void StartAnimation() {
    if (refreshItem != null && refreshItem.getActionView() == null)
    {
        final LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        final ImageView ivRefresh = (ImageView)inflater.inflate(R.layout.refresh_view, null);

        final Animation rotation = AnimationUtils.loadAnimation(this, R.anim.refresh);
        ivRefresh.startAnimation(rotation);
        refreshItem.setActionView(ivRefresh);
    }
}

3 个答案:

答案 0 :(得分:2)

要创建流畅的ui体验,您的“加载轮”动画应该在用户点击链接时开始 - 而不是在新页面开始加载时开始 - 并在新页面加载时结束。这使得应用程序似乎对用户更具响应性,并且是Dolphin Browser中实现的行为,作为示例。

要实现此功能,您需要在WebView中侦听用户的链接点击。如何做到这一点已在SO:

中的答案中涵盖

Detect click on HTML button through javascript in Android WebView

您必须验证点击实际上是指向新网页的链接。您可以通过WebView的HitTestResult类找到单击的HTML元素。 SO上的这个答案为您提供了有关如何验证HitTestResult值的详细信息:

Get the click event from webpage in my android application

您可以从onClick()方法开始动画,并从WebViewClient的onPageFinished()方法结束动画,如果新页面未加载,也可以在onReceivedError()中结束。

答案 1 :(得分:0)

Animation变量设为Browser类的成员,并确保在离开活动之前停止动画。

答案 2 :(得分:0)

您可以使用线程的概念。

直到Web视图加载中的URL,您将显示加载动画 并且当加载URL时停止动画。

您需要使用两个线程,一个用于进度指示器(即URL加载),另一个用于动画的UI线程。

搜索它!