Android擴(kuò)大View點(diǎn)擊范圍的方法
如下圖所示,你的UI元素可能小于48dp,圖標(biāo)僅有32dp,按鈕僅有40dp,但是他們的實(shí)際可操作焦點(diǎn)區(qū)域最好都應(yīng)達(dá)到48dp的大小。

為使小的UI區(qū)域獲得良好的觸摸交互,根據(jù)View的特性,目前碰到了兩種情況:
1.如ImageView,設(shè)置其padding值,可觸摸區(qū)域?qū)⑾蛲鈹U(kuò)展;
2.如Button,設(shè)置其padding值,可觸摸區(qū)域不變,其內(nèi)內(nèi)容顯示區(qū)域向內(nèi)壓縮;
情況1的控件,可直接設(shè)置其padding值達(dá)到目的,如 android:padding="10dp"
情況2的控件,可使用TouchDelegate動(dòng)態(tài)修改其觸摸區(qū)域,達(dá)到擴(kuò)大點(diǎn)擊范圍的效果
/**
* 擴(kuò)大View的觸摸和點(diǎn)擊響應(yīng)范圍,最大不超過(guò)其父View范圍
*
* @param view
* @param top
* @param bottom
* @param left
* @param right
*/
public static void expandViewTouchDelegate(final View view, final int top,
final int bottom, final int left, final int right) {
((View) view.getParent()).post(new Runnable() {
@Override
public void run() {
Rect bounds = new Rect();
view.setEnabled(true);
view.getHitRect(bounds);
bounds.top -= top;
bounds.bottom += bottom;
bounds.left -= left;
bounds.right += right;
TouchDelegate touchDelegate = new TouchDelegate(bounds, view);
if (View.class.isInstance(view.getParent())) {
((View) view.getParent()).setTouchDelegate(touchDelegate);
}
}
});
}
采取此種方法的兩點(diǎn)注意:
1、若View的自定義觸摸范圍超出Parent的大小,則超出的那部分無(wú)效。
2、一個(gè)Parent只能設(shè)置一個(gè)View的TouchDelegate,設(shè)置多個(gè)時(shí)只有最后設(shè)置的生效。
若需要恢復(fù)該View的觸摸范圍:
/**
* 還原View的觸摸和點(diǎn)擊響應(yīng)范圍,最小不小于View自身范圍
*
* @param view
*/
public static void restoreViewTouchDelegate(final View view) {
((View) view.getParent()).post(new Runnable() {
@Override
public void run() {
Rect bounds = new Rect();
bounds.setEmpty();
TouchDelegate touchDelegate = new TouchDelegate(bounds, view);
if (View.class.isInstance(view.getParent())) {
((View) view.getParent()).setTouchDelegate(touchDelegate);
}
}
});
}
使用TouchDelegate擴(kuò)大View的觸摸響應(yīng)范圍是一種比較靈活的方法,有時(shí)可與設(shè)置padding的方式結(jié)合使用。
更新
======
后期實(shí)際開(kāi)發(fā)中發(fā)現(xiàn),使用post runnable的方式去設(shè)置Delegate區(qū)域大小的原因是,如該View師在Activity的OnCreate()或Fragment的OnCreateView()中繪制,此時(shí)UI界面尚未開(kāi)始繪制,無(wú)法獲得正確的坐標(biāo);
若將此法應(yīng)用在ListView的getView()中繪制每個(gè)ItemView時(shí),則Delegate的設(shè)置將部分失效,原因是ListView的繪制較特殊,可能無(wú)法獲取到部分還未繪制出的View的正確坐標(biāo)。解決方案具體可參考以下參考閱讀所列。
參考閱讀:
通過(guò)自定義View的方式,及某些其他情況的處理:
1.《Android使用TouchDelegate增加View的觸摸范圍》 //www.dhdzp.com/article/140894.htm
2.《ListView Tips & Tricks #5: Enlarged Touchable Areas》 http://cyrilmottier.com/2012/02/16/listview-tips-tricks-5-enlarged-touchable-areas/
3.《Extend touchable areas #Android》 https://plus.google.com/u/0/+JulienDodokal/posts/8zoV3RQvReS
以上就是Android擴(kuò)大View點(diǎn)擊范圍的方法的詳細(xì)內(nèi)容,更多關(guān)于Android擴(kuò)大View點(diǎn)擊范圍的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- Android 擴(kuò)大 View 的點(diǎn)擊區(qū)域的方法
- 一文搞懂Android RecyclerView點(diǎn)擊展開(kāi)、折疊效果的實(shí)現(xiàn)代碼
- Android實(shí)現(xiàn)WebView點(diǎn)擊攔截跳轉(zhuǎn)原生
- Android開(kāi)發(fā)實(shí)現(xiàn)ListView點(diǎn)擊展開(kāi)收起效果示例
- Android XRecyclerView最簡(jiǎn)單的item點(diǎn)擊事件處理
- Android RecyclerView實(shí)現(xiàn)點(diǎn)擊條目刪除
- Android擴(kuò)大View點(diǎn)擊區(qū)域方案示例
相關(guān)文章
Android嵌套R(shí)ecyclerView左右滑動(dòng)替代自定義view
這篇文章主要介紹了Android嵌套R(shí)ecyclerView左右滑動(dòng)替代自定義view,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-06-06
Android啟動(dòng)APP時(shí)黑屏白屏的解決方法
這篇文章主要為大家詳細(xì)介紹了Android啟動(dòng)APP時(shí)黑屏白屏的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07
詳解Android應(yīng)用main函數(shù)的調(diào)用
Android常識(shí),App主線程初始化了Looper,調(diào)用prepare的地方是ActivityThread.main函數(shù)。問(wèn)題來(lái)了,App的main函數(shù)在哪兒調(diào)用,下面我們來(lái)一起學(xué)習(xí)一下吧2019-06-06
Android媒體通知欄多系統(tǒng)適配實(shí)例講解
對(duì)于Android來(lái)說(shuō)其中一項(xiàng)很方便的操作便是下拉菜單,下拉菜單欄可以快捷打開(kāi)某項(xiàng)設(shè)置,這篇文章主要給大家介紹了關(guān)于Android通知欄增加快捷開(kāi)關(guān)的功能實(shí)現(xiàn),需要的朋友可以參考下2023-04-04
Recycleview實(shí)現(xiàn)無(wú)限自動(dòng)輪播
這篇文章主要為大家詳細(xì)介紹了Recycleview實(shí)現(xiàn)無(wú)限自動(dòng)輪播,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-07-07
Android簡(jiǎn)單使用PopupWindow的方法
這篇文章主要為大家詳細(xì)介紹了Android簡(jiǎn)單使用PopupWindow的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-03-03
Android中ListView分頁(yè)加載數(shù)據(jù)功能實(shí)現(xiàn)
本篇文章主要介紹了Android中ListView分頁(yè)加載數(shù)據(jù)功能實(shí)現(xiàn),具有一定的參考價(jià)值,有需要的可以了解一下。2016-11-11

