GestureOverlayView 給你的 WebView 添加手勢(shì)控制

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

這兩天做了個(gè)小項(xiàng)目皂冰,其中客戶需求就是在 webview 中添加手勢(shì)控制闯团,比如說(shuō)畫(huà)個(gè) L 返回上一級(jí)之類的剃氧,就像這樣:

帥不帥呀

上圖就是這次的 Demo 的效果

Talk is cheap,show me the code

GestureOverlayView 的使用

這東西就是本次的主角了但指,一個(gè)繼承 FrameLayout 的 view静袖,他可以接收你的手勢(shì)觉鼻,并通過(guò)監(jiān)聽(tīng)接口判斷出你所畫(huà)的手勢(shì)和預(yù)定的手勢(shì)是否相同,直接上代碼吧队橙,在 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 包裹起來(lái)坠陈,讓她感受男人的溫暖,然后捐康,在 MainActivity 中調(diào)用 initGestureOverlay()

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

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

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

修改手勢(shì)

我不說(shuō)話乌昔,就上圖

依舊很帥啊

恩,我們把 L 改成向右滑壤追,其實(shí)改手勢(shì)也沒(méi)啥磕道,就是把 raw 文件夾下的手勢(shì)庫(kù)文件更新一下就行

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

把我們改好的手勢(shì) Gesture 傳進(jìn)來(lái)行冰,通過(guò) GestureLibrary 修改一下就好了溺蕉,那怎么獲取這么手勢(shì)呢?

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) {

            }
        });

我們通過(guò)這個(gè) OnGestureListener() 接口來(lái)獲取手勢(shì)完成時(shí)的手勢(shì)悼做,傳給剛才的方法就行了

手勢(shì)庫(kù)

說(shuō)了半天疯特,raw 下面的這個(gè)手勢(shì)庫(kù)是啥啊,恩肛走,你記不記得

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

他制定了一個(gè)手勢(shì)庫(kù)的位置讓 GestureLibraries 去加載漓雅,GestureLibraries 也可以從文件中獲取

GestureLibraries.fromFile()

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

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

源碼傳送門(mén) Github

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末梢褐,一起剝皮案震驚了整個(gè)濱河市徘层,隨后出現(xiàn)的幾起案子峻呕,更是在濱河造成了極大的恐慌,老刑警劉巖趣效,帶你破解...
    沈念sama閱讀 221,548評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瘦癌,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡跷敬,警方通過(guò)查閱死者的電腦和手機(jī)讯私,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)西傀,“玉大人斤寇,你說(shuō)我怎么就攤上這事∮倒樱” “怎么了娘锁?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,990評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)饺鹃。 經(jīng)常有香客問(wèn)我莫秆,道長(zhǎng),這世上最難降的妖魔是什么悔详? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,618評(píng)論 1 296
  • 正文 為了忘掉前任镊屎,我火速辦了婚禮,結(jié)果婚禮上茄螃,老公的妹妹穿的比我還像新娘缝驳。我一直安慰自己,他們只是感情好归苍,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,618評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布用狱。 她就那樣靜靜地躺著,像睡著了一般拼弃。 火紅的嫁衣襯著肌膚如雪齿拂。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,246評(píng)論 1 308
  • 那天肴敛,我揣著相機(jī)與錄音署海,去河邊找鬼。 笑死医男,一個(gè)胖子當(dāng)著我的面吹牛砸狞,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播镀梭,決...
    沈念sama閱讀 40,819評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼刀森,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了报账?” 一聲冷哼從身側(cè)響起研底,我...
    開(kāi)封第一講書(shū)人閱讀 39,725評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤埠偿,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后榜晦,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體冠蒋,經(jīng)...
    沈念sama閱讀 46,268評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,356評(píng)論 3 340
  • 正文 我和宋清朗相戀三年乾胶,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了抖剿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,488評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡识窿,死狀恐怖斩郎,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情喻频,我是刑警寧澤缩宜,帶...
    沈念sama閱讀 36,181評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站甥温,受9級(jí)特大地震影響锻煌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜窿侈,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,862評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望秋茫。 院中可真熱鬧史简,春花似錦、人聲如沸肛著。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,331評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)枢贿。三九已至殉农,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間局荚,已是汗流浹背超凳。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,445評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留耀态,地道東北人轮傍。 一個(gè)月前我還...
    沈念sama閱讀 48,897評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像首装,于是被迫代替她去往敵國(guó)和親创夜。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,500評(píng)論 2 359

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

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