webview跳转动画

情景:

项目里面内容是html,ios和Android是壳,内部实现是当点击webview内部的时候,跳转另一个页面的时候是加载本地的另一个html,那么将这个新加载的html通过addview的方式添加,监听webview的状态,当onpagestart或者finish的时候执行addview的动画

activity里面的布局一定要是通过framlayout的方式add进去webview,不能直接写一个webview进行加载,否者会出现闪屏,原因是因为,你加载的webview会先执行一次加载是本地数据,然后又执行一次加载是ajax数据绑定的时候,这样会导致你的webview再一次执行,出现闪屏的情况

还有一个就是,点击返回键,通过这样addview你会发现只有两个界面,无论怎么添加,所以你需要设置一个listview<webview>,这样你在添加界面的时候就创建一个新的webview,添加到list中,点击返回的时候就移除掉最后一个,在移除的时候再添加一个反向的动画,效果更好。

设置webview跳转动画,webview加载的时候比较操蛋,直接显示,体验太差,通过查看一些博客,总结出自己的方案,目前感觉还行,如果有什么优化,大家可以留言说一下。

以下是我的代码,里面实现了下拉刷新和上拉加载的,如果不需要自行删除,上拉加载是一个自定义view

这个是布局文件

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/white"
    android:orientation="vertical"
    android:overScrollMode="never">

    <com.example.orion.htmltext1.View.PullToRefreshLayout
        android:id="@+id/swipe_refresh_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <android.support.v4.widget.SwipeRefreshLayout
            android:id="@+id/srl"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
        <FrameLayout
            android:id="@+id/ll_bac"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:overScrollMode="never">

        </FrameLayout>
        </android.support.v4.widget.SwipeRefreshLayout>

    </com.example.orion.htmltext1.View.PullToRefreshLayout>

    <ProgressBar
        android:id="@+id/progress"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:visibility="gone" />

</FrameLayout>

这个是activity的代码,但是想用viewpager写,发现动画实现无法从第10个跳第1个,这样隔着几个页面的情况

/**
 * 本类:
 * Created by Orion on 2018/1/5.
 */

public class ViewPagerTbsActivity extends Activity {
    private WebView webView;
    private boolean isFirstView = true;
    private long first_pressed_time;
    private ProgressBar progressBar;
    private FrameLayout root;
    private String APP_CACAHE_DIRNAME = "/webviewcache";
    private Map<String, WebView> webViewMap = new HashMap<>();
    private List<WebView> webViewList = new ArrayList<>();
    private PullToRefreshLayout pullToRefreshLayout;
    private SwipeRefreshLayout swipeRefreshLayout;

    @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);//去掉标题栏
        setContentView(R.layout.activity_viewpagertbs);
        webView = new WebView(this);
        webViewList.add(webView);
        root = findViewById(R.id.ll_bac);
        root.addView(webView);
        progressBar = findViewById(R.id.progress);
        pullToRefreshLayout = findViewById(R.id.swipe_refresh_layout);
        swipeRefreshLayout = findViewById(R.id.srl);
        // 下拉刷新
        swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        webViewList.get(webViewList.size() - 1).loadUrl("javascript:javaCallJs" +
                                "('刷新成功')");
                        swipeRefreshLayout.setRefreshing(false);
                    }
                }, 1000);

            }
        });

        // 上拉加载
        pullToRefreshLayout.setCanRefresh(false);
        pullToRefreshLayout.setRefreshListener(new BaseRefreshListener() {
            @Override
            public void refresh() {
            }

            @Override
            public void loadMore() {
                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        webViewList.get(webViewList.size() - 1).loadUrl("javascript:javaCallJs" +
                                "('加载成功')");
                        pullToRefreshLayout.finishLoadMore();
                    }
                }, 1000);
            }
        });

        initWebView(webView);
        webView.loadUrl("file:///android_asset/www/CollegeHome.html");
    }

    @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
    @SuppressLint({"SetJavaScriptEnabled", "AddJavascriptInterface"})
    private void initWebView(final WebView webView) {
        webView.setOverScrollMode(View.OVER_SCROLL_NEVER);
        webView.addJavascriptInterface(new JsInterface1(), "Android");
        WebSettings settings = webView.getSettings();
        //支持JS
        settings.setJavaScriptEnabled(true);
        settings.setDefaultTextEncodingName("UTF-8");
        // JavaScript可以自动打开windows
        settings.setJavaScriptCanOpenWindowsAutomatically(true);
        // 将图片调整到合适的大小
        settings.setUseWideViewPort(true);
        // webView拓展的api是否打开:
        settings.setDomStorageEnabled(true);
        // 在高版本的时候我们是需要使用允许访问文件的urls        settings.setAllowFileAccessFromFileURLs(true);
        // 设置缓存
        settings.setAppCacheEnabled(true);
        // 设置缓存模式,一共有四种模式
        settings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
        settings.setJavaScriptCanOpenWindowsAutomatically(true); //支持通过JS打开新窗口
        settings.setLoadsImagesAutomatically(true);  //支持自动加载图片
        settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN); //支持内容重新布局
        settings.supportMultipleWindows();  //多窗口
        settings.setAllowFileAccess(true);  //设置可以访问文件

        // 设置不闪白屏的设置
        settings.setCacheMode(WebSettings.LOAD_NO_CACHE);
        settings.setDatabaseEnabled(true);
        settings.setSavePassword(true);

        // 下面是设置缓存的东西
        //        if (isNetworkConnected()) {
        //            settings.setCacheMode(WebSettings.LOAD_DEFAULT);//根据cache-control决定是否从网络上取数据。
        //        } else {
        //            settings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);//没网,则从本地获取,即离线加载
        //        }
        //
        //        settings.setDomStorageEnabled(true); // 开启 DOM storage API 功能
        //        settings.setDatabaseEnabled(true);   //开启 database storage API 功能
        //        settings.setAppCacheEnabled(true);//开启 Application Caches 功能
        //
        //        String cacheDirPath = getFilesDir().getAbsolutePath() + APP_CACAHE_DIRNAME;
        //        settings.setAppCachePath(cacheDirPath); //设置  Application Caches 缓存目录
        webView.setDrawingCacheEnabled(true);

        // 不跳转到其他浏览器
        webView.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {//过时的方法用于sdk版本小于21                view.loadUrl(url);
                return super.shouldOverrideUrlLoading(view, url);
            }

            @Override
            public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
                if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP)//Sdk版本大于21时才能使用此方法
                    view.loadUrl(request.getUrl().toString());
                return super.shouldOverrideUrlLoading(view, request);
            }

            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                progressBar.setVisibility(View.VISIBLE);
                // 当是首页的时候就不再执行动画
                if (isFirstView) {
                    isFirstView = false;
                } else {
                    Animation translate_in = AnimationUtils.loadAnimation(ViewPagerTbsActivity
                            .this, R.anim.translate_in);
                    translate_in.setFillAfter(true);
                    translate_in.setDuration(300);
                    translate_in.setDetachWallpaper(true);
                    //  translate_in.
                    view.setAnimation(translate_in);
                }
            }

            @Override
            public void onPageFinished(WebView view, String url) {
            }

            public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
                // 不要使用super,否则有些手机访问不了,因为包含了一条 handler.cancel()
                // super.onReceivedSslError(view, handler, error);
                // 接受所有网站的证书,忽略SSL错误,执行访问网页
                handler.proceed();
            }
        });
        webView.setWebChromeClient(new WebChromeClient() {
            @Override
            public void onProgressChanged(WebView view, int newProgress) {
                String url = view.getUrl();
                Log.e("webView--Url", url);
                if (newProgress == 100) {
                    progressBar.setVisibility(View.GONE);
                } else {
                    progressBar.setVisibility(View.VISIBLE);
                }
                super.onProgressChanged(view, newProgress);
            }
        });
    }

    @RequiresApi(api = Build.VERSION_CODES.M)
    public boolean isNetworkConnected() {
        ConnectivityManager manager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
        Network activeNetwork = manager.getActiveNetwork();
        if (activeNetwork != null) {
            return true;
        } else {
            return false;
        }
    }

    class JsInterface1 {
        @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
        @JavascriptInterface
        public void go(final String url) {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    WebView webView1 = new WebView(ViewPagerTbsActivity.this);
                    Animation translate_in = AnimationUtils.loadAnimation(ViewPagerTbsActivity
                            .this, R.anim.translate_in);
                    translate_in.setFillAfter(true);
                    translate_in.setDuration(300);
                    translate_in.setDetachWallpaper(true);
                    //  translate_in.
                    webView1.setAnimation(translate_in);
                    webViewList.add(webView1);
                    root.addView(webView1);
                    initWebView(webView1);
                    webView1.loadUrl(url);
                }
            });
        }
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            if (webViewList.size() == 1) {
                doPressBackIcon();
            } else {
                WebView webView1 = webViewList.get(webViewList.size() - 1);
                Animation translate_out = AnimationUtils.loadAnimation(ViewPagerTbsActivity
                        .this, R.anim.translate_out);
                translate_out.setFillAfter(true);
                translate_out.setDuration(300);
                translate_out.setDetachWallpaper(true);
                //  translate_in.
                webView1.setAnimation(translate_out);
                root.removeView(webView1);
                webViewList.remove(webViewList.size() - 1);
            }

            return true;
        }
        return super.onKeyDown(keyCode, event);
    }

    /**
     * 用户点击手机下面的菜单返回键时执行的方法
     */
    public boolean doPressBackIcon() {
        //提示用户在3秒内再按一次返回键退出应用
        if (first_pressed_time == 0) {
            first_pressed_time = System.currentTimeMillis();
            ToastUtil.showShort(this, "3秒内再次点击返回键退出");
            return true;
        }
        long currentTime = System.currentTimeMillis();
        if (currentTime - first_pressed_time > 3000) {
            ToastUtil.showShort(this, "3秒内再次点击返回键退出");
            first_pressed_time = currentTime;
            return true;
        } else {
            //执行退出操作
            finish();
            return false;
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (webView != null)
            webView.destroy();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值