使用android.view.TouchDelegate扩大View的触摸点击区域
Android4.0设计规定的有效可触摸的UI元素标准是48dp,转化为一个物理尺寸约为9毫米。7~10毫米,这是一个用户手指能准确并且舒适触摸的区域。
如下图所示,你的UI元素可能小于48dp,图标仅有32dp,按钮仅有40dp,但是他们的实际可操作焦点区域最好都应达到48dp的大小。

为使小的UI区域获得良好的触摸交互,根据View的特性,目前碰到了两种情况:
1.如ImageView,设置其padding值,可触摸区域将向外扩展;
2.如Button,设置其padding值,可触摸区域不变,其内内容显示区域向内压缩;
情况1的控件,可直接设置其padding值达到目的,如 android:padding="10dp"
情况2的控件,可使用TouchDelegate动态修改其触摸区域,达到扩大点击范围的效果
- /**
- * 扩大View的触摸和点击响应范围,最大不超过其父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);
- }
- }
- });
- }
采取此种方法的两点注意:
1、若View的自定义触摸范围超出Parent的大小,则超出的那部分无效。
2、一个Parent只能设置一个View的TouchDelegate,设置多个时只有最后设置的生效。
若需要恢复该View的触摸范围:
- /**
- * 还原View的触摸和点击响应范围,最小不小于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扩大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的触摸点击区域的更多相关文章
- Android之开源项目view篇
本文转自:http://www.trinea.cn/android/android-open-source-projects-view/ 主要介绍Android上那些不错个性化的View,包括List ...
- 高手速成android开源项目【View篇】
主要介绍那些不错个性化的View,包括ListView.ActionBar.Menu.ViewPager.Gallery.GridView.ImageView.ProgressBar及其他如Dialo ...
- 【Android】自己定义View、画家(画布)Canvas与画笔Paint的应用——绘图、涂鸦板app的实现
利用一个简单的绘图app来说明安卓的图形处理类与自己定义View的应用. 例如以下图,有一个供用户自己随意绘图.涂鸦的app. 这里不做那么花俏了,仅提供黑白两色.但能够改变笔尖的粗细. 实质上这里的 ...
- 【Android】自己定义View
翻译自:http://developer.android.com/training/custom-views/index.html 一)创建view类 一个设计良好的自己定义view与其它的类一样.它 ...
- 【Android - 自定义View】之View的事件分发机制
参考资料: View事件分发:http://blog.csdn.net/pi9nc/article/details/9281829 ViewGroup事件分发:http://blog.csdn.net ...
- Android学习笔记之View
转载: 0.7562018.10.22 21:44:10字数 5,423阅读 189 导图 一.View事件体系 1.什么是 View 和 View的位置坐标 View是什么: View 是一种界 ...
- Android的视图(View)组件
Android的绝大部分UI组件都放在android.widget包及其子包.android,view包及其子包中,Android应用的所有UI组件都继承了View类,View组件非常类似于Swing ...
- Android中实现自定义View组件并使其能跟随鼠标移动
场景 实现效果如下 注: 博客: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的程序猿 获取编程相关电子书.教程推送与免费下载. 实现 新建An ...
- mono for android Listview 里面按钮 view Button click 注册方法 并且传值给其他Activity 主要是context
需求:为Listview的Item里面的按钮Button添加一个事件,单击按钮时通过事件传值并跳转到新的页面. 环境:mono 效果: 布局代码 主布局 <?xml version=" ...
随机推荐
- mysql - 启动错误InnoDB: mmap(137363456 bytes) failed; errno 12
[zsm]下午mysql出现了问题,很纠结,最后找到了原因,原因是内存不够用: 查看内存显示 [root@AY1305070924544 /]# free -m tota ...
- Js中的appenChild,insertBefore--createDocumentFragment
平时项目中会有一些流程,或者是评论相关的东西,这些一般只会是在页面初次加载一部分,剩余部分搞一个更多的标签,当点击更多的时候,ajax请求把所有数据加载完(当然这里也有分页的实现方法,本篇不作讨论), ...
- dumpbin工具的使用
当我们需要查看一个dll或exe文件中的包含的函数或是依赖的函数之类的信息,可以使用Visual Studio自带的工具dumpbin来实现,使用方法为: 1/ 启动Visual Studio 命令行 ...
- web相关
1. html 和 htm 的区别 如果一个网站有index.html和index.htm 默认情况下优先访问.html htm是为了兼容之前dos系统的命名规范. 2. http1.0短连接 htt ...
- Visual C++ 打印编程技术-编程基础-映射模式
映射模式: Visual C++ 中采用的坐标映射方式使得用户图形坐标和输出设别的像素完全一致. eg:当屏幕的像素大小为800X600时,每英寸包含屏幕像素为96,打印机则需要几倍的点数才能达到同样 ...
- 类型与通用语言运行时:System.Object
CLR 要求每个类型最终都要继承自 System.Object 类型 //隐式继承 Object class Employee { ... } //显示继承继承 Object class Employ ...
- JS数值输入控制
在html文本框录入数值时,可用如下方法进行控制判断. 整数:<input type="text" name="aaa" onkeypress=" ...
- C++中delete和delete[]的使用
偶然的机会要使用到动态分配整形数组,怎么删除new出来的东西一时有点模糊(也许一直就不知道),于是在VS上试了试(写代码时经常用这种方法去验证模凌两可的东西),总结出来有两点. 1.基本数据类型new ...
- Constants in C++
The first motivation for const seems to have been to eliminate the use of preprocessor #define for v ...
- python中的gil是什么?
1.gil是什么? 在Python源代码:Python-2.7.10/Python/ceval.c.我看到的Python源代码版本为2.7.10 static PyThread_type_lock i ...