DrawableLeft,DrawableTop,Right,Bottom点击事件的实现

  • Post author:
  • Post category:其他


DrawableListener


作者:

丁创世


原文地址

相信大家和我一样,在很多地方都会用到DrawableLeft,或者DrawableRight,DrawableTop,DrawableBottom的点击事件的问题,但是呢?遗憾的是原生的控件并没有给出这样的接口,所以呢,今天我就拿出我自己写的一个控件来和大家一起分享一下,如果有更好的方法还请多多指教。

一、功能简介

对DrawableLeft,DrawableTop,DrawableRight,DrawableBottom,分别自定义事件,

二、需求分析

这里写图片描述

在我们遇到上述这样的需求的时候,当我们点击右侧的显示密码,就会将密码显示出来,那么如果实现这一功能,首先我们就必须做好对右侧图标的事件监听,很明显右侧可能是一个DrawableRight,那么我们现在就需要自定义控件实现这一功能,下面,我们根据EditText控件进行讲解。

三、原理分析

  1. 首先我们来看一下一个View的控件由那几部分组成

这里写图片描述

2.如上图所示,假设他是一个Button,它分别设置了layout_margin,padding,drawableLeft,Top,Right,Bottom,以及,drawablePadding,我们来一次看一个他们分别位于那个位置

3.上图1,2, 3, 4 分别表示他的四个drawable,并且从左到右依次为


    layout_marginLeft

    paddingLeft 

    drawableLeft 

    drawablePadding 

    button//本身 

    drawablePadding 

    drawableRight 

    paddingRight 

    layout_marginRight

4.也就是说,只要当我们点击到1,2,3,4,任何一个区域,我们就调用相应的接口便可,所以我们主要做的就是判断,点击部位是否在这四个区域就行来,也就是简单的坐标计算,

event.getX()
event.getY()

5.我们使用这两个方法获取x,和y的坐标,是获取相对于View本身的坐标值,也就是以控件左上角为o点的坐标轴,还有一个getRawX()和getRawY();是获取相对于相对于屏幕的坐标值,最后我们只要根据坐标计算是否处于以上四个位置,就可以判断是否触发事件,

四、代码实现

  1. 接下来我们根据DrawableLeft的实现来介绍,其他三个大同小异,最后会给出代码。

这里写图片描述

2.因为是以getX(),getY(),以自身为坐标轴,也就是上图黄色区域,在根据三中原理分析,第3小节给出的,我们可以计算

//左边
event.getX() >= getPaddingLeft()
//右边
&& event.getX() <= (drawableLeft.getBounds().width() + getPaddingLeft())

3.相同的是再判断Y方向,因为这里需要判断DrawableTop,和,DrawableBottom是否存在,所以我们使用三目运算符

drawableTop != null?drawableTop.getBounds().height():0

//上面
getY()>=getPaddingTop()+(drawableTop != null?drawableTop.</



版权声明:本文为MyLoveyaqiong原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。