使用android.view.TouchDelegate扩大View的触摸点击区域

摘要:
Android4.0设计规定的有效可触摸的UI元素标准是48dp,转化为一个物理尺寸约为9毫米。/***扩大View的触摸和点击响应范围,最大不超过其父View范围**@paramview*@paramtop*@parambottom*@paramleft*@paramright*/publicstaticvoidexpandViewTouchDelegate{.post;}采取此种方法的两点注意:1、若View的自定义触摸范围超出Parent的大小,则超出的那部分无效。

Android4.0设计规定的有效可触摸的UI元素标准是48dp,转化为一个物理尺寸约为9毫米。7~10毫米,这是一个用户手指能准确并且舒适触摸的区域。

如下图所示,你的UI元素可能小于48dp,图标仅有32dp,按钮仅有40dp,但是他们的实际可操作焦点区域最好都应达到48dp的大小。

1 触屏手机点击区域的小秘密

为使小的UI区域获得良好的触摸交互,根据View的特性,目前碰到了两种情况:

1.如ImageView,设置其padding值,可触摸区域将向外扩展;

2.如Button,设置其padding值,可触摸区域不变,其内内容显示区域向内压缩;

情况1的控件,可直接设置其padding值达到目的,如 android:padding="10dp"

情况2的控件,可使用TouchDelegate动态修改其触摸区域,达到扩大点击范围的效果

  1. /**
  2. *扩大View的触摸和点击响应范围,最大不超过其父View范围
  3. *
  4. *@paramview
  5. *@paramtop
  6. *@parambottom
  7. *@paramleft
  8. *@paramright
  9. */
  10. publicstaticvoidexpandViewTouchDelegate(finalViewview,finalinttop,
  11. finalintbottom,finalintleft,finalintright){
  12. ((View)view.getParent()).post(newRunnable(){
  13. @Override
  14. publicvoidrun(){
  15. Rectbounds=newRect();
  16. view.setEnabled(true);
  17. view.getHitRect(bounds);
  18. bounds.top-=top;
  19. bounds.bottom+=bottom;
  20. bounds.left-=left;
  21. bounds.right+=right;
  22. TouchDelegatetouchDelegate=newTouchDelegate(bounds,view);
  23. if(View.class.isInstance(view.getParent())){
  24. ((View)view.getParent()).setTouchDelegate(touchDelegate);
  25. }
  26. }
  27. });
  28. }

采取此种方法的两点注意:

1、若View的自定义触摸范围超出Parent的大小,则超出的那部分无效。
2、一个Parent只能设置一个View的TouchDelegate,设置多个时只有最后设置的生效。

若需要恢复该View的触摸范围:

  1. /**
  2. *还原View的触摸和点击响应范围,最小不小于View自身范围
  3. *
  4. *@paramview
  5. */
  6. publicstaticvoidrestoreViewTouchDelegate(finalViewview){
  7. ((View)view.getParent()).post(newRunnable(){
  8. @Override
  9. publicvoidrun(){
  10. Rectbounds=newRect();
  11. bounds.setEmpty();
  12. TouchDelegatetouchDelegate=newTouchDelegate(bounds,view);
  13. if(View.class.isInstance(view.getParent())){
  14. ((View)view.getParent()).setTouchDelegate(touchDelegate);
  15. }
  16. }
  17. });
  18. }

使用TouchDelegate扩大View的触摸响应范围是一种比较灵活的方法,有时可与设置padding的方式结合使用。

更新

======

后期实际开发中发现,使用post runnable的方式去设置Delegate区域大小的原因是,如该View师在Activity的OnCreate()或Fragment的OnCreateView()中绘制,此时UI界面尚未开始绘制,无法获得正确的坐标;

若将此法应用在ListView的getView()中绘制每个ItemView时,则Delegate的设置将部分失效,原因是ListView的绘制较特殊,可能无法获取到部分还未绘制出的View的正确坐标。解决方案具体可参考以下参考阅读所列。

参考阅读:通过自定义View的方式,及某些其他情况的处理:

1.《Android使用TouchDelegate增加View的触摸范围》http://blog.csdn.net/sgwhp/article/details/10963383

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.view.TouchDelegate扩大View的触摸点击区域》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Python小数向上取整和向下取整C++ 在线工具下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

CSS布局属性

一、CSS布局属性 Width:设置对象的宽度(widteight:设置对象的高度(Height:45px;)。ackground:设置对象的背景颜色、背景图像。 1.背景颜色 background:#09F; 2.背景图像 background:url(file:///C|/Users/Administrator/Desktop/huipu.jpg) r...

Android 自定义View使用示例(三)

转载 http://www.cnblogs.com/crashmaker/p/3549365.html From crash_coder linguowu linguowu0622@gamil.com 前言:   通过Android 自定义View和Android 自定义View使用示例(二),我们知道了如何使用自定义的View,以及Android绘制V...

在ASP.NET MVC中实现一种不同于平常的三级联动、级联方式, 可用于城市、车型选择等多层级联场景

三级或多级联动的场景经常会碰到,比如省、市、区,比如品牌、车系、车型,比如类别的多级联动......我们首先想到的是用三个select来展示,这是最通常的做法。但在另外一些场景中,比如确定搜索条件的时候,对于三级联动来说,可能选择1个,2个,或3个条件,我想,以下的方式可能更适合:     以上,可以只选择品牌,或同时选择品牌、车系,或同时选择品牌、车系...

SwitchButton 开关按钮 的多种实现方式

刚开始接触开关样式的按钮是在IOS系统上面,它的切换以及滑动十分帅气,深入人心。 所谓的开关按钮,就是只有2个状态:on和off,下图就是系统IOS 7上开关按钮效果。 起初我在android上我只会使用CheckBox去满足对应的功能。后来,查看开发文档发现,android也有了自己的原生态开关控件,并且在4.0版本中又优化加入了新的类似控件--Swi...

教育培训APP和小程序多端开发项目源码分享讲解

简介 本项目的一个教育培训服务APP。提供在线浏览机构信息、名师风采和课程预约订购等功能。 项目前端使用了avm.js多端开发技术,可同时编译为Android&iOSApp以及微信小程序; 后端使用APICloud数据云3.0云函数自定义接口。 技术要点 本项目在开发过程中,在“能拆就拆”的思想下,对项目进行细粒度的组件化拆解。 可以从中了解到组...

JS获取IMG图片高宽

前段时间在LJW写的touchslider.js轮播代码里添加自适应屏幕大小的功能时,遇到一个问题。不管用什么样的方法都无法获取到IMG标签的高宽,最后只有给图片定一个高宽的比例值;趁今天有空我就写了几个demo测试了下,找了下原因;且听我细细说来,如有哪里说的不对的,欢迎拍砖~~~  首先获取高宽的方法具我所知有:obj.style.width(heig...