为你的drawable图片添加监听事件----drawableRight增加监听事件

在android的应用开发中,我认为添加drawable类型的图片非常好用。为TextView或者EditText添加一个drawableLeft图片或者drawableRight图片非常方便,在一些情况下,还能减少布局层数,优化程序性能。比如我们想实现以下效果

我们只要给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()的方法

你可能感兴趣的:(android自定义控件,事件分析,android,drawable)