GestureOverlayView 給你的 WebView 添加手勢控制

歡迎到我的博客 一杯劉 觀看哦~愛你比心(*  ̄3)(ε ̄ *)

這兩天做了個小項(xiàng)目,其中客戶需求就是在 webview 中添加手勢控制,比如說畫個 L 返回上一級之類的,就像這樣:

帥不帥呀

上圖就是這次的 Demo 的效果

Talk is cheap,show me the code

GestureOverlayView 的使用

這東西就是本次的主角了,一個繼承 FrameLayout 的 view,他可以接收你的手勢,并通過監(jiān)聽接口判斷出你所畫的手勢和預(yù)定的手勢是否相同,直接上代碼吧,在 XML 文件里 like this

<android.gesture.GestureOverlayView
        android:id="@+id/gestureview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gestureColor="@color/colorAccent"
        android:uncertainGestureColor="@color/colorPrimary">
        <WebView
            android:id="@+id/webview"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
</android.gesture.GestureOverlayView>

我們把 WebView 包裹起來,讓她感受男人的溫暖,然后,在 MainActivity 中調(diào)用 initGestureOverlay()

// 我把全局變量拿出來方便大家看
private GestureOverlayView mGestureview;
private GestureLibrary mGestureLib;

private void initGestureOverlay() {
        //從 raw 文件夾里取出我們預(yù)制的手勢文件
        mGestureLib = GestureManager.getInstance(getBaseContext()).getGestureLib();
        //設(shè)置筆畫為單筆,也就是一筆畫
        mGestureview.setGestureStrokeType(GestureOverlayView.GESTURE_STROKE_TYPE_SINGLE);
        //畫完筆畫后到消失的間隔
        mGestureview.setFadeOffset(0);
        //筆畫粗細(xì)
        mGestureview.setGestureStrokeWidth(15);
        //重點(diǎn)啊啊啊,設(shè)置 GestureOverlayView 不攔截觸摸事件,
        // 不設(shè)置的話,webview 是沒法相應(yīng)我們的滑動事件的
        mGestureview.setEventsInterceptionEnabled(false);
        //精髓接口,通過他我們可以判斷用戶的手勢是不是我們想接收的手勢
        mGestureview.addOnGesturePerformedListener(new GestureOverlayView.OnGesturePerformedListener() {
            @Override
            public void onGesturePerformed(GestureOverlayView overlay,
                                           Gesture gesture) {
                //recognize()方法接收用戶的手勢,并返回手勢庫中和該手勢相匹配的手勢
                ArrayList<Prediction> predictions = mGestureLib
                        .recognize(gesture);
                if (predictions.size() > 0) {
                    //我們?nèi)∽钭钕嗨频哪莻€手勢
                    //prediction 里面就是我們預(yù)制的 手勢名稱 和 相匹配的分值 兩個變量
                    Prediction prediction = (Prediction) predictions.get(0);
                    //如果分?jǐn)?shù)大于 1.0 并且 匹配出來的手勢名稱是我們預(yù)制的 “back” 字符串
                    if (prediction.score > 1.0 && prediction.name.equals("back")) {
                        if (mWebview.canGoBack()) {
                            //webview 回退上一級
                            mWebview.goBack();
                        } else {
                            Toast.makeText(MainActivity.this, "已經(jīng)是首頁啦", Toast.LENGTH_SHORT).show();
                        }
                    }
                }
            }
        });
    }

這樣我們就能控制通過手勢控制 webview 的返回啦,當(dāng)然手勢的監(jiān)聽在這里,你想干啥都行

修改手勢

我不說話,就上圖

依舊很帥啊

恩,我們把 L 改成向右滑,其實(shí)改手勢也沒啥,就是把 raw 文件夾下的手勢庫文件更新一下就行

public void changeBackGesture(Gesture gesture){
        mGestureLib.removeEntry("back");
        mGestureLib.addGesture("back", gesture);
        Toast.makeText(mContext, "成功了,快去試試吧", Toast.LENGTH_SHORT).show();
    }

把我們改好的手勢 Gesture 傳進(jìn)來,通過 GestureLibrary 修改一下就好了,那怎么獲取這么手勢呢?

mEditoverlay.addOnGestureListener(new GestureOverlayView.OnGestureListener() {
            @Override
            public void onGestureStarted(GestureOverlayView overlay, MotionEvent event) {

            }

            @Override
            public void onGesture(GestureOverlayView overlay, MotionEvent event) {

            }

            @Override
            public void onGestureEnded(GestureOverlayView overlay, MotionEvent event) {
                mGesture = overlay.getGesture();
            }

            @Override
            public void onGestureCancelled(GestureOverlayView overlay, MotionEvent event) {

            }
        });

我們通過這個 OnGestureListener() 接口來獲取手勢完成時的手勢,傳給剛才的方法就行了

手勢庫

說了半天,raw 下面的這個手勢庫是啥啊,恩,你記不記得

mGestureLib = GestureLibraries.fromRawResource(mContext, R.raw.gestures);

他制定了一個手勢庫的位置讓 GestureLibraries 去加載,GestureLibraries 也可以從文件中獲取

GestureLibraries.fromFile()

位置你可以自己指定,什么?你問我 Demo 里的 Gesture 文件怎么來的?我會告訴你我生成了一個放進(jìn) raw 里面的嗎,啊哈哈哈哈...

更多的細(xì)節(jié),建議直接看代碼,注釋很全,也方便復(fù)制粘貼...

源碼傳送門 Github

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,109評論 25 709
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,408評論 4 61
  • 喧鬧著 吆喝著 奮力的賣弄著 放眼所及的周遭 都是不折不扣的生意人 就連最不可估摸的思想 也都標(biāo)了價 祭無處安葬的...
    不說真話會死星人閱讀 307評論 0 1
  • 故人一桿長篙去,萬點(diǎn)桃色追長虹。 當(dāng)年舊里花開處,半夜飛雪滿屋檐。
    顏深之閱讀 209評論 0 1
  • 單點(diǎn)登錄,簡稱sso,是目前比較流行的企業(yè)業(yè)務(wù)整合的解決方案之一。定義是:在多個應(yīng)用系統(tǒng)中,用戶只需要登錄一次就可...
    ChrisWF閱讀 879評論 0 0

友情鏈接更多精彩內(nèi)容