Android使用TouchDelegate增加View的觸摸范圍
本文為大家分享了Android使用TouchDelegate增加View觸摸范圍的方法,供大家參考,具體內(nèi)容如下
還不知道TouchDelegate這個(gè)東西的可以先看一下API,這里大致說一下它的作用:假設(shè)有兩個(gè)View,分別是v1,v2,我們可以通過v1的setTouchDelegate(bounds, v2)來委派觸摸事件,其中bounds是一個(gè)Rect。v1中,落在這個(gè)范圍的TouchEvent都會(huì)傳給v2。
既然是這樣,那我們可以通過設(shè)置某個(gè)view的parent的touchDelegate來達(dá)到擴(kuò)大這個(gè)view觸摸范圍的目的。關(guān)鍵是什么時(shí)候去執(zhí)行parent.setTouchDelegate()方法呢?要設(shè)置這個(gè)委派,必須得知道當(dāng)前view大小以及它在parent的位置。而這些數(shù)據(jù)都是在onLayout才能確定(注:如果不是自定義View,只是在Activity中設(shè)置,請(qǐng)將這些操作置于onWindowFocusChanged()方法中)。至此,實(shí)現(xiàn)的思路已經(jīng)很清晰了,我們通過自定義一個(gè)Button來檢驗(yàn)一下,下面開始上代碼:
為了方便在xml中使用我們自定義的View,并且可以自定義擴(kuò)大的觸摸范圍,我們?cè)僮远x一個(gè)attrs,res/values/attrs.xml:
<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="LargeTouchableAreaView"> <attr name="addition" format="dimension" /> <attr name="additionBottom" format="dimension" /> <attr name="additionLeft" format="dimension" /> <attr name="additionRight" format="dimension" /> <attr name="additionTop" format="dimension" /> </declare-styleable> </resources>
Button實(shí)現(xiàn):
public class LargeTouchableAreasButton extends Button { private final int TOUCH_ADDITION = 0; private int mTouchAdditionBottom = 0; private int mTouchAdditionLeft = 0; private int mTouchAdditionRight = 0; private int mTouchAdditionTop = 0; private int mPreviousLeft = -1; private int mPreviousRight = -1; private int mPreviousBottom = -1; private int mPreviousTop = -1; public LargeTouchableAreasButton(Context context) { super(context); } public LargeTouchableAreasButton(Context context, AttributeSet attrs) { super(context, attrs); init(context, attrs); } public LargeTouchableAreasButton(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(context, attrs); } private void init(Context context, AttributeSet attrs) { TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.LargeTouchableAreaView); int addition = (int) a.getDimension( R.styleable.LargeTouchableAreaView_addition, TOUCH_ADDITION); mTouchAdditionBottom = addition; mTouchAdditionLeft = addition; mTouchAdditionRight = addition; mTouchAdditionTop = addition; mTouchAdditionBottom = (int) a.getDimension( R.styleable.LargeTouchableAreaView_additionBottom, mTouchAdditionBottom); mTouchAdditionLeft = (int) a.getDimension( R.styleable.LargeTouchableAreaView_additionLeft, mTouchAdditionLeft); mTouchAdditionRight = (int) a.getDimension( R.styleable.LargeTouchableAreaView_additionRight, mTouchAdditionRight); mTouchAdditionTop = (int) a.getDimension( R.styleable.LargeTouchableAreaView_additionTop, mTouchAdditionTop); a.recycle(); } @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { super.onLayout(changed, left, top, right, bottom); if (left != mPreviousLeft || top != mPreviousTop || right != mPreviousRight || bottom != mPreviousBottom) { mPreviousLeft = left; mPreviousTop = top; mPreviousRight = right; mPreviousBottom = bottom; final View parent = (View) this.getParent(); parent.setTouchDelegate(new TouchDelegate(new Rect(left - mTouchAdditionLeft, top - mTouchAdditionTop, right + mTouchAdditionRight, bottom + mTouchAdditionBottom), this)); } } }
然后在具體要使用到這個(gè)Button的xml中加上以下代碼:
xmlns:lta="http://schemas.android.com/apk/res/com.xxx.xxx"
其中"lta"這個(gè)名字可以隨便取,最后的是你的app包名。
最后在這個(gè)Button中定義希望增大的尺寸:
<com.xxx.LargeTouchableAreasButton android:layout_width="wrap_content" android:layout_height="wrap_content" lta:addition="30dp" />
大功告成。
但這個(gè)自定義的View并不是完美的,還存在以下問題:
1、必須保證parent足夠大,如果自定義的范圍超出parent的大小,則超出的那部分無效。
2、一個(gè)parent只能設(shè)置一個(gè)觸摸委派,設(shè)置多個(gè)時(shí),只有最后設(shè)置的child有效。如果希望一個(gè)view能設(shè)置多個(gè)委派,需要再自定義parent,具體方法可參考:鏈接地址
總而言之,要觸發(fā)委派,必須保證parent接收到了觸摸事件,并且落在了你定義的范圍內(nèi)。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android判斷touch事件點(diǎn)是否在view范圍內(nèi)的方法
- Android從源碼的角度徹底理解事件分發(fā)機(jī)制的解析(下)
- Android從源碼的角度徹底理解事件分發(fā)機(jī)制的解析(上)
- 解析Android點(diǎn)擊事件分發(fā)機(jī)制
- Android View的事件分發(fā)詳解
- android事件分發(fā)機(jī)制的實(shí)現(xiàn)原理
- Android事件分發(fā)機(jī)制的詳解
- 談?wù)剬?duì)Android View事件分發(fā)機(jī)制的理解
- Android事件分發(fā)機(jī)制(上) ViewGroup的事件分發(fā)
- 如何自己實(shí)現(xiàn)Android View Touch事件分發(fā)流程
相關(guān)文章
Android仿微信實(shí)現(xiàn)首字母導(dǎo)航條
這篇文章主要為大家詳細(xì)介紹了Android仿微信實(shí)現(xiàn)首字母導(dǎo)航條的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-08-08基于Android實(shí)現(xiàn)仿QQ5.0側(cè)滑
本課程將帶領(lǐng)大家通過自定義控件實(shí)現(xiàn)QQ5.0側(cè)滑菜單,課程將循序漸進(jìn),首先實(shí)現(xiàn)最普通的側(cè)滑菜單,然后引入屬性動(dòng)畫與拖動(dòng)菜單效果相結(jié)合,最終實(shí)現(xiàn)QQ5.0側(cè)滑菜單效果。通過本課程大家會(huì)對(duì)側(cè)滑菜單有更深層次的了解,通過自定義控件和屬性動(dòng)畫打造千變?nèi)f化的側(cè)滑菜單效果2015-12-12Android實(shí)現(xiàn)多點(diǎn)觸控,自由縮放圖片的實(shí)例代碼
本篇文章主要介紹了Android實(shí)現(xiàn)多點(diǎn)觸控,自由縮放圖片的實(shí)例代碼,可以自由地對(duì)圖片進(jìn)行縮放和移動(dòng),非常具有實(shí)用價(jià)值,需要的朋友可以參考下。2016-12-12Android啟動(dòng)優(yōu)化之延時(shí)加載的步驟詳解
這篇文章主要給大家介紹了關(guān)于Android啟動(dòng)優(yōu)化之延時(shí)加載的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-02-02Android中將一個(gè)圖片切割成多個(gè)圖片的實(shí)現(xiàn)方法
有種場(chǎng)景,我們想將一個(gè)圖片切割成多個(gè)圖片。比如我們?cè)陂_發(fā)一個(gè)拼圖的游戲,就首先要對(duì)圖片進(jìn)行切割2013-05-05Flutter使用socketIo實(shí)現(xiàn)實(shí)時(shí)通訊
本文主要介紹了Flutter使用socketIo實(shí)現(xiàn)實(shí)時(shí)通訊,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-07-07Android簡(jiǎn)單實(shí)現(xiàn)動(dòng)態(tài)權(quán)限獲取相機(jī)權(quán)限及存儲(chǔ)空間等多權(quán)限
這篇文章主要介紹了Android簡(jiǎn)單實(shí)現(xiàn)動(dòng)態(tài)權(quán)限獲取相機(jī)權(quán)限及存儲(chǔ)空間等多權(quán)限,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下2022-07-07APP添加CNZZ統(tǒng)計(jì)插件教程 Android版添加phonegap
這篇文章主要介紹了APP添加CNZZ統(tǒng)計(jì)插件教程,Android版添加phonegap,感興趣的小伙伴們可以參考一下2015-12-12