为你的drawable图片添加监听事件----drawableRight增加监听事件
2015-11-17 20:59
246 查看
在android的应用开发中,我认为添加drawable类型的图片非常好用。为TextView或者EditText添加一个drawableLeft图片或者drawableRight图片非常方便,在一些情况下,还能减少布局层数,优化程序性能。比如我们想实现以下效果
我们只要给TextView添加drawableLeft图片就好,不要在TextView的外层在嵌套一层布局了
但是,有时候我们想给这些drawable的图片添加一个监听器,方便我们实现一些业务代码或者跳转逻辑
根据以往我们的开发经验,要给一个控件注册监听器,必须拿到他的实例对象,把监听器注册给这个对象,才能完成回调
但是在现在这种情况下,TextView和左边那张图片明显是一个控件,我们无法在对象层面把它们区分开来
这时候,我们只能在android层面上解决这个问题。
在我之前分享的博客中 Android
事件分发机制详解--真正的解析中已经提到,每个view的事件分发首先会调用dispatchTouchEvent,在这个方法中会调用onTouch事件,根据onTouch的返回值决定是否往下传递,也就是说onClick事件的执行是在onTouch之后,并且是否执行是受到onTouch返回值控制的。那么对我们来说, 只要在onTouch事件中对点击图片还是点击TextView做出区分,那么就能解决这个问题了。那怎么做出区分呢?其实也很简单,通过x轴上的坐标就能做出区分,可以判断点击区域,从而确定把事件交给哪个部分。
那么接下来我们一起看下实现代码,清楚原理之后,其实代码逻辑非常简单。
计算公式就是 整个控件宽度-图片宽度 如果x大于这个值就代表进入了drawableRight的区域了 同理,drawableLeft也可以用这种方式计算。并且由于onTouch返回了一个true,不会对TextView的onClick事件进行干扰
最后在普及下getX()和getRawX()的区别
getX是获取以当前控件左上角为坐标原点计算的X轴坐标直.获得的是一个相对的坐标
getRawX 获取的是以屏幕左上角为坐标原点计算的X轴坐标直.获得的是一个真实的坐标
所以我们这里选取的是getX()的方法
我们只要给TextView添加drawableLeft图片就好,不要在TextView的外层在嵌套一层布局了
但是,有时候我们想给这些drawable的图片添加一个监听器,方便我们实现一些业务代码或者跳转逻辑
根据以往我们的开发经验,要给一个控件注册监听器,必须拿到他的实例对象,把监听器注册给这个对象,才能完成回调
但是在现在这种情况下,TextView和左边那张图片明显是一个控件,我们无法在对象层面把它们区分开来
这时候,我们只能在android层面上解决这个问题。
在我之前分享的博客中 Android
事件分发机制详解--真正的解析中已经提到,每个view的事件分发首先会调用dispatchTouchEvent,在这个方法中会调用onTouch事件,根据onTouch的返回值决定是否往下传递,也就是说onClick事件的执行是在onTouch之后,并且是否执行是受到onTouch返回值控制的。那么对我们来说, 只要在onTouch事件中对点击图片还是点击TextView做出区分,那么就能解决这个问题了。那怎么做出区分呢?其实也很简单,通过x轴上的坐标就能做出区分,可以判断点击区域,从而确定把事件交给哪个部分。
那么接下来我们一起看下实现代码,清楚原理之后,其实代码逻辑非常简单。
//drawable是拿一个数组来保存上下左右4个drawable对象的 分别对应0,1,2,3 private static final int DRAWABLE_RIGHT = 2; //首先获得我们TextView的实例对象 TextView mDemoTv =(TextView) findViewById(R.id.xxx); mDemoTv .setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (mDemoTv .getCompoundDrawables()[DRAWABLE_RIGHT == null){ return false; } //这里一定要对点击事件类型做一次判断,否则你的点击事件会被执行2次 if (event.getAction() != MotionEvent.ACTION_UP){ return false; } if (event.getX() > mDemoRv.getWidth() -mDemoTv.getCompoundDrawables()[DRAWABLE_RIGHT.getBounds.width()) { //do something you want return true; } } });
计算公式就是 整个控件宽度-图片宽度 如果x大于这个值就代表进入了drawableRight的区域了 同理,drawableLeft也可以用这种方式计算。并且由于onTouch返回了一个true,不会对TextView的onClick事件进行干扰
最后在普及下getX()和getRawX()的区别
getX是获取以当前控件左上角为坐标原点计算的X轴坐标直.获得的是一个相对的坐标
getRawX 获取的是以屏幕左上角为坐标原点计算的X轴坐标直.获得的是一个真实的坐标
所以我们这里选取的是getX()的方法
相关文章推荐
- python中的eval函数
- linux下c++读文件夹下的文件及文件夹笔记
- Ubuntu 14.04 安装 flash插件
- 点滴积累【other】---HTTP 错误 404.13 - Not Found,请求筛选模块被配置为拒绝超过请求内容长度的请求(转载)
- Android SystemProperties设置/取得系统属性的用法总结
- C#实现各种格式文件的复制
- JavaScript中清空数组的三种方式
- android Activity的生命周期
- BZOJ 1061 [Noi2008]志愿者招募
- 链表中倒数第k个结点
- 【UML总结】——用例图
- HEVC算法和体系结构:编码框架
- 中序表达式转后序表达式(带括号)
- .a与.so区别
- HEVC算法和体系结构:编码框架
- vxworks入门
- C#在控制台获取应用程序的路径
- UEFI的helloworld程序
- centos7网络连接调试常用命令笔记
- ios数据库之fmdb 使用