WebView仿原生app頁面切換效果

前言

在開發(fā)中,有時候我們會在app中使用WebView加載一個web頁面。這樣可以適當減輕我們開發(fā)的難度宴猾。但是弊端是WebView中切換html陡舅,沒有像原生頁面的切換效果抵乓。這里我們就利用動畫,以及
獲取網(wǎng)頁的快照來實現(xiàn)android activity 默認的切換效果(頁面從右往左進入靶衍,從左往右退出)灾炭。

先看看效果:


大體思路

監(jiān)聽webview加載url的進度,在沒到100%之前先獲取當前頁面的截圖颅眶,并用imageview顯示在手機屏幕上蜈出。網(wǎng)頁加載好的時候。讓imageview和webView分別加載對應(yīng)的動畫效果涛酗,以達到從右到左或者從左到右的效果铡原,模擬原生頁面的切換效果。

第一步商叹、創(chuàng)建相關(guān)動畫資源

在animal文件夾下新建以下補間動畫:
1燕刻、頁面進入相關(guān)動畫
translate_in_go.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
    <translate android:fromXDelta="100%" android:toXDelta="0%p"
        android:duration="300" />
</set>

translate_out_go.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="0%" android:toXDelta="-100%p"
        android:duration="300" />
</set>

2、頁面退出相關(guān)動畫
translate_in_back.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
    <translate
        android:fromXDelta="-100%"   android:toXDelta="0%p"
        android:duration="300" />
</set>

translate_out_back.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="0%" android:toXDelta="100%p"
        android:duration="300" />
</set>

第二步剖笙、在webView中調(diào)用動畫達到效果

package com.teprinciple.webviewdemo;

import android.graphics.Bitmap;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ImageView;
import android.widget.RelativeLayout;

public class MainActivity extends AppCompatActivity {

    private WebView mWebView;
    private RelativeLayout root;
    private boolean isGoBack = false;
    private boolean isFirst = true;
    private ImageView iamgeView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mWebView = (WebView) findViewById(R.id.webView);
        root = (RelativeLayout) findViewById(R.id.root);
        initoperation();
    }

    private void initoperation() {
        initWebView();
        mWebView.loadUrl("http://www.reibang.com/u/7c36ad462572");
    }

    private void initWebView() {


        mWebView.setWebChromeClient(new WebChromeClient() {
            
            //url加載進度改變的監(jiān)聽
            @Override
            public void onProgressChanged(WebView view, int newProgress) {
                if (isFirst)return; //剛進入頁面不需要模擬效果卵洗,app自己有
                
                view.setVisibility(View.GONE);//先隱藏webview
                
                if (newProgress == 100) {
                    
                    //加載完畢,顯示webview 隱藏imageview
                    view.setVisibility(View.VISIBLE);
                    if (iamgeView != null)iamgeView.setVisibility(View.GONE);
                    
                    //頁面進入效果的動畫
                    Animation translate_in = AnimationUtils.loadAnimation(MainActivity.this, R.anim.translate_in_go);
                    Animation translate_out = AnimationUtils.loadAnimation(MainActivity.this, R.anim.translate_out_go);
                    
                    //頁面退出的動畫
                    if (isGoBack){
                        translate_in = AnimationUtils.loadAnimation(MainActivity.this, R.anim.translate_in_back);
                        translate_out = AnimationUtils.loadAnimation(MainActivity.this, R.anim.translate_out_back);
                    }
                    translate_in.setFillAfter(true);
                    translate_in.setDetachWallpaper(true);
                    translate_out.setFillAfter(true);
                    translate_out.setDetachWallpaper(true);

                    //開啟動畫
                    if(null!=iamgeView)iamgeView.startAnimation(translate_out);
                    view.startAnimation(translate_in);

                    //動畫結(jié)束后弥咪,移除imageView
                    translate_out.setAnimationListener(new Animation.AnimationListener(){
                        @Override
                        public void onAnimationEnd(Animation animation) {
                            if(null!=iamgeView){
                                root.removeView(iamgeView);
                                iamgeView=null;
                                isGoBack = false;
                            }
                        }

                        @Override
                        public void onAnimationRepeat(Animation animation) {
                            // TODO Auto-generated method stub
                        }

                        @Override
                        public void onAnimationStart(Animation animation) {
                            // TODO Auto-generated method stub
                        }
                    });

                }else{ 
                    //url沒加載好之前过蹂,隱藏webview,在主布局中聚至,加入imageview顯示當前頁面快照

                    if(null==iamgeView){
                        iamgeView=new ImageView(MainActivity.this);
                        view.setDrawingCacheEnabled(true);
                        Bitmap bitmap=view.getDrawingCache();
                        if(null!=bitmap){
                            Bitmap b=   Bitmap.createBitmap(bitmap);
                            iamgeView.setImageBitmap(b);
                        }
                        root.addView(iamgeView);
                    }
                }

            }
        });


        mWebView.setWebViewClient(new WebViewClient(){
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                isFirst = false;
                return super.shouldOverrideUrlLoading(view, url);
            }
        });

        
        //webView的相關(guān)設(shè)置
        WebSettings websettings = mWebView.getSettings();
        websettings.setJavaScriptEnabled(true); // Warning! You can have XSS
        websettings.setSupportZoom(true);
//        websettings.setBlockNetworkImage(true);  //使把圖片加載放在最后來加載渲染
        websettings.setAppCacheEnabled(true);    //開啟H5(APPCache)緩存功能
        websettings.setCacheMode(WebSettings.LOAD_DEFAULT);
        websettings.setAllowFileAccess(true);    // 可以讀取文件緩存(manifest生效)
        websettings.setDatabaseEnabled(true);    //webSettings.setDatabaseEnabled(true);
        websettings.setDomStorageEnabled(true);  // 開啟 DOM storage 功能
        websettings.setDisplayZoomControls(false);
        websettings.setDefaultTextEncodingName("utf-8");
        websettings.setRenderPriority(WebSettings.RenderPriority.HIGH); //提高渲染的優(yōu)先級
    }

    @Override
    public void onBackPressed() {
        if (mWebView.canGoBack()) {
            isGoBack = true;
            mWebView.goBack();
        } else {
            super.onBackPressed();
        }
    }
}

activity的布局文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/root"
    tools:context="com.teprinciple.webviewdemo.MainActivity">
   <WebView
       android:id="@+id/webView"
       android:layout_width="match_parent"
       android:layout_height="match_parent"/>
</RelativeLayout>

這樣就模仿出了app原生的切換效果酷勺。但是當url頁面的很豐富,加載時間會很長扳躬,這樣來實現(xiàn)就會有的卡頓的效果鸥印,不過一般的頁面效果還是很好的。

項目地址

https://github.com/teprinciple/WebViewDemo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末坦报,一起剝皮案震驚了整個濱河市库说,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌片择,老刑警劉巖潜的,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異字管,居然都是意外死亡啰挪,警方通過查閱死者的電腦和手機信不,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來亡呵,“玉大人抽活,你說我怎么就攤上這事∶淌玻” “怎么了下硕?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長汁胆。 經(jīng)常有香客問我梭姓,道長,這世上最難降的妖魔是什么嫩码? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任誉尖,我火速辦了婚禮,結(jié)果婚禮上铸题,老公的妹妹穿的比我還像新娘铡恕。我一直安慰自己,他們只是感情好丢间,可當我...
    茶點故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布探熔。 她就那樣靜靜地躺著,像睡著了一般千劈。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上牌捷,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天墙牌,我揣著相機與錄音,去河邊找鬼暗甥。 笑死喜滨,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的撤防。 我是一名探鬼主播虽风,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼寄月!你這毒婦竟也來了辜膝?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤漾肮,失蹤者是張志新(化名)和其女友劉穎厂抖,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體克懊,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡忱辅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年七蜘,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片墙懂。...
    茶點故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡橡卤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出损搬,到底是詐尸還是另有隱情碧库,我是刑警寧澤,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布场躯,位于F島的核電站谈为,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏踢关。R本人自食惡果不足惜伞鲫,卻給世界環(huán)境...
    茶點故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望签舞。 院中可真熱鬧秕脓,春花似錦、人聲如沸儒搭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽搂鲫。三九已至傍药,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間魂仍,已是汗流浹背拐辽。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留擦酌,地道東北人俱诸。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像赊舶,于是被迫代替她去往敵國和親睁搭。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,500評論 2 359

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,280評論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫笼平、插件园骆、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,119評論 4 61
  • (一) 落日, 點燃天邊的篝火寓调, 連云也燒著遇伞, 掀起滾滾洪波。 華夏五千年捶牢, 流多少平民淚鸠珠,英雄血巍耗, 競沒有把落日...
    曹煥甫閱讀 278評論 1 3
  • JavaScript: 零基礎(chǔ)輕松學(xué)閉包 參考鏈接 JavaScript: 零基礎(chǔ)輕松學(xué)閉包(1)http://w...
    kakukeme閱讀 706評論 0 50