ViewDragHelper入門系列——實(shí)現(xiàn)懸浮拖動(dòng)View

一:前言

之前在很多項(xiàng)目中發(fā)現(xiàn)了滑動(dòng)退出當(dāng)前頁(yè)面功能蹦肴,但是并未去了解具體實(shí)現(xiàn)使用到了哪些砚哗,直到前不久接手的項(xiàng)目的也使用到了這一功能缸濒,才了解到ViewDragHelper這一強(qiáng)大的自定義ViewGroup神器锅知。包括實(shí)現(xiàn)類似于QQ側(cè)滑妇拯,懸浮按鈕等都離不開(kāi)這一神器幻馁,好記性不如爛筆頭洗鸵,這里記錄一下學(xué)習(xí)ViewDragHelper的過(guò)程,希望大家一起成長(zhǎng)仗嗦!

what膘滨?

ViewDragHelper是什么?我們先看一下谷歌官方的解釋:

what is ViewDragHelper

立馬打開(kāi)我的百度翻譯:

WAHT IS THE FUCKO」铡;鸬恕!德撬!

what the fuck铲咨?好吧,看到這我直接忽略百度翻譯蜓洪,咨詢了一下英語(yǔ)八級(jí)的同學(xué)鸣驱,得到牛逼的翻譯:ViewDragHelper是編寫(xiě)自定義ViewGroups一個(gè)實(shí)用工具類。它定義了一組有用的操作和狀態(tài)追蹤蝠咆,允許用戶在父ViewGroup中拖動(dòng)并且重新定位子View(child view)。

為什么說(shuō)得到了牛逼的翻譯呢北滥,因?yàn)檫@個(gè)工具類牛逼啊刚操,號(hào)稱是自定義ViewGroup拖動(dòng)的一個(gè)神器,比如在DrawerLayout中的一系列拖動(dòng)事件都是利用VDH(ViewDragHelper再芋,簡(jiǎn)稱VDH)完成的菊霜。那么我們就一步一步來(lái)揭開(kāi)它的神秘面紗~~

首先看看他的api:

ViewDragHelper.CallBack

好心熊已經(jīng)給大家打上最簡(jiǎn)單的注釋了,如果需要詳細(xì)了解济赎,還望各位同僚們動(dòng)動(dòng)手指鉴逞,去百度!K狙怠9辜瘛!

哇壳猜,看到了無(wú)數(shù)的api勾徽,那么我們先從最簡(jiǎn)單的開(kāi)始吧。就是實(shí)現(xiàn)一個(gè)DragView繼承LinearLayout统扳,看看如何使用ViewDragHelper實(shí)現(xiàn)DragView吧喘帚。

第一步:新建類繼承LinearLayout,實(shí)現(xiàn)構(gòu)造方法:

public class DragView extends LinearLayout{

public DragView(Context context) {

this(context,null);

}

publicDragView(Context context,@Nullable AttributeSet attrs) {

super(context,attrs,0);

}

public DragView(Context context,@NullableAttributeSet attrs, int defStyleAttr) {

super(context,attrs,defStyleAttr);

init();

}

private void init(){};

}

那么我們?nèi)绾稳?chuàng)建一個(gè)ViewDragHelper呢咒钟,直接new的話會(huì)發(fā)現(xiàn)并沒(méi)有吹由,這是因?yàn)樗臉?gòu)造方法私有化啦。我們觀察其源碼就可以發(fā)現(xiàn)兩個(gè)獲取到其實(shí)例對(duì)象的方法:

通過(guò)create()獲取實(shí)例

看看需要的參數(shù)都是啥朱嘴,ViewGroup:也就是你真在創(chuàng)建的這個(gè)自定義ViewGroup——DragView倾鲫,所以直接傳入this即可。 ?cb是callBack啦,看到前面的方法介紹级乍,大家肯定也知道cb就是用來(lái)處理各類事件觸發(fā)后的回調(diào)處理舌劳。 ?float sensitivity:這個(gè)是敏感度值,一般傳入1.0f玫荣,傳入的值越大甚淡,敏感度越高。

我們還可以看到一個(gè)mTouchSlop捅厂,這個(gè)值是什么贯卦,又在哪里初始化呢?

繼續(xù)追蹤源碼焙贷,可以先后看到如下代碼:

觸發(fā)移動(dòng)時(shí)間的最小值
初始化位置

簡(jiǎn)單理解即為應(yīng)該觸發(fā)移動(dòng)時(shí)間的最短距離撵割,如果小于這個(gè)距離就不觸發(fā)移動(dòng)控件,ViewPager控件就是利用這個(gè)距離來(lái)判斷是否翻頁(yè)辙芍。

額啡彬,。故硅。咱們見(jiàn)好就收庶灿,回到創(chuàng)建ViewDragHelper,那么我們自己先創(chuàng)建一個(gè)試試:

在上面的init方法中創(chuàng)建:

private void init(){

dragHelper=ViewDragHelper.create(this,1.0f, newViewDragHelper.Callback() {

@Override

public booleantryCaptureView(Viewchild, intpointerId) {

return false;

}

});

};

傳遞一個(gè)cb吃衅,重寫(xiě)其抽象方法tryCaptureView往踢,系統(tǒng)會(huì)依次列出這個(gè)父容器的子視圖,你需要指定當(dāng)前傳入的這個(gè)視圖是否可以被拖動(dòng)徘层,如果可以拖動(dòng)就返回true峻呕,否則就返回false”返回兩個(gè)參數(shù),child是正在被捕捉的view趣效,pointerid是當(dāng)前按下點(diǎn)的id瘦癌。

我們返回ture試試,跷敬∨搴叮看看子View能不能滑動(dòng)。

這里我們把代碼補(bǔ)全干花,特別簡(jiǎn)單妄帘。

test_layout.xml:

xml代碼

布局文件中只有兩個(gè)TextView,一個(gè)給它取了個(gè)名字池凄。

我們想實(shí)現(xiàn)滑動(dòng)抡驼,還必須重寫(xiě)兩個(gè)方法:

clampViewPositionHorizontal

clampViewPositionVertical

滑動(dòng)監(jiān)聽(tīng)回調(diào),return的值即為控件要到的位置

我們 還需要攔截事件教給VDH肿仑,在OnTouchEvent中把事件交個(gè)VDH完成:

事件分發(fā)攔截

那么我們運(yùn)行程序致盟,發(fā)現(xiàn)兩個(gè)TextView都可以拖動(dòng)了碎税。


如果我們想要給指定控件拖動(dòng)呢,我們還記得tryCaptureView中的兩個(gè)參數(shù)嗎馏锡,可以通過(guò)child.getId() ==R.id.xxx來(lái)指定可拖動(dòng)控件雷蹂。

總結(jié):我們最簡(jiǎn)單的一個(gè)ViewDragHelper的使用到此已經(jīng)完成了,我們可以自己參閱源碼來(lái)了解各個(gè)api的作用是什么杯道,謝謝匪煌。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市党巾,隨后出現(xiàn)的幾起案子萎庭,更是在濱河造成了極大的恐慌,老刑警劉巖齿拂,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件驳规,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡署海,警方通過(guò)查閱死者的電腦和手機(jī)吗购,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)砸狞,“玉大人捻勉,你說(shuō)我怎么就攤上這事≈捍” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵丰辣,是天一觀的道長(zhǎng)撒强。 經(jīng)常有香客問(wèn)我,道長(zhǎng)笙什,這世上最難降的妖魔是什么飘哨? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮琐凭,結(jié)果婚禮上芽隆,老公的妹妹穿的比我還像新娘。我一直安慰自己统屈,他們只是感情好胚吁,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著愁憔,像睡著了一般腕扶。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上吨掌,一...
    開(kāi)封第一講書(shū)人閱讀 50,084評(píng)論 1 291
  • 那天半抱,我揣著相機(jī)與錄音脓恕,去河邊找鬼。 笑死窿侈,一個(gè)胖子當(dāng)著我的面吹牛炼幔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播史简,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼乃秀,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了乘瓤?” 一聲冷哼從身側(cè)響起环形,我...
    開(kāi)封第一講書(shū)人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎衙傀,沒(méi)想到半個(gè)月后抬吟,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡统抬,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年火本,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片聪建。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡钙畔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出金麸,到底是詐尸還是另有隱情擎析,我是刑警寧澤,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布挥下,位于F島的核電站揍魂,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏棚瘟。R本人自食惡果不足惜现斋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望偎蘸。 院中可真熱鬧庄蹋,春花似錦、人聲如沸迷雪。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)章咧。三九已至蔗包,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間慧邮,已是汗流浹背调限。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工舟陆, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人耻矮。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓秦躯,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親裆装。 傳聞我的和親對(duì)象是個(gè)殘疾皇子踱承,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,867評(píng)論 25 707
  • ¥開(kāi)啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開(kāi)一個(gè)線程,因...
    小菜c閱讀 6,376評(píng)論 0 17
  • 東黎/文 小時(shí)候哨免,我一直是徒步走很遠(yuǎn)的路去上學(xué)茎活。尤其是冬天刮著北風(fēng),天不亮琢唾,父親就喊醒我载荔,拽著我走在曲折蜿蜒的小路...
    納蘭玲瓏閱讀 363評(píng)論 2 13
  • 最近外公生病,從縣醫(yī)院住到市醫(yī)院采桃,再到出院回家懒熙,大概20天吧∑瞻欤總還是記得以前他精神抖擻的模樣工扎,不曾想最兩年身體下挫...
    云淡風(fēng)輕揚(yáng)閱讀 266評(píng)論 0 1
  • 今夜的雨照常落下, 年少的人總要去嘗嘗人間的冷暖的衔蹲。 今夜的雨照常落下肢娘, 流浪的人也裹緊了他心愛(ài)的木吉他。 今夜的...
    我的晴天借你閱讀 165評(píng)論 0 1