在Android开发中我们经常遇到TextView左上右下有图片的UI布局情形,并且各个图片点击后都要做相应的逻辑操作,这种情况下我们首先想到的是利用线性布局或相对布局去排版,然后给每个图片设置id,再在代码中去获取对应的控件,最后再设置相应的点击事件。这是最常用、最普遍的做法,也比较简单通俗易懂。但是这样写的弊端就是在XML布局文件中代码显得很臃肿,阅读性较差。

最近在做个类似与京东商城的项目,里面有很多类似于这样的布局,由于本人有很强的强迫症,故在网上各种搜索,再加上本人对TextView控件的理解。决定自定义一个UI布局简单,功能更强大的TextView。

大家都知道TextView中有drawableLeft=”“,drawableTop=”“,drawableRight=”“,drawableBottom=”“这四个属性,也就是说我们可以在TextView的左上右下添加图片。那么DrawableTextView的思想就是准确计算出左上右下四张图片在布局中的所占的点击区域,如果点击区域被点击后,则通过接口回调做相应的逻辑操作。好了,直接上代码:

1:自定义DrawableTextView

/**
* Created by salmonzhang on 2017/7/11
* 自定义一个TextView,实现左右点击监听功能
*/
public class DrawableTextView extends android.support.v7.widget.AppCompatTextView {
private DrawableRightClickListener mDrawableRightClickListener;
private DrawableLeftClickListener mDrawableLeftClickListener;
final int DRAWABLE_LEFT = 0;//左图片
final int DRAWABLE_TOP = 1;//上图片
final int DRAWABLE_RIGHT = 2;//右图片
final int DRAWABLE_BOTTOM = 3;//下图片
public DrawableTextView(Context context) {this(context,null);
}
public DrawableTextView(Context context, @Nullable AttributeSet attrs) {this(context, attrs,0);
}
public DrawableTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);
}
//定义一个右侧监听的接口
public interface DrawableRightClickListener{void onDrawableRightClickListener(View view);
}
//定义一个左侧监听的接口
public interface DrawableLeftClickListener{void onDrawableLeftClickListener(View view);
}
//定义一个右侧监听的set方法
public void setDrawableRightClickListener(DrawableRightClickListener listener) {this.mDrawableRightClickListener = listener;
}
//定义一个左侧监听的set方法
public void setDrawableLeftClickListener(DrawableLeftClickListener listener) {this.mDrawableLeftClickListener = listener;
}
//定义一个右侧返回监听的方法
public DrawableRightClickListener getDrawableRightClick() {return mDrawableRightClickListener;
}
//定义一个左侧返回监听的方法
public DrawableLeftClickListener getDrawableLeftClick() {return mDrawableLeftClickListener;
}//重写onTouchEvent方法
@Override
public boolean onTouchEvent(MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:if (mDrawableRightClickListener != null) {Drawable drawableRight = getCompoundDrawables()[DRAWABLE_RIGHT] ;//判断的依据是获取点击区域相对于屏幕的x值大于控件的最右边界减去右侧控件的宽度if (drawableRight != null && event.getRawX() >= (getRight() - drawableRight.getBounds().width())) {mDrawableRightClickListener.onDrawableRightClickListener(this);return true ;//返回值一定要是true,否则无法响应}}if (mDrawableLeftClickListener != null) {Drawable drawableLeft = getCompoundDrawables()[DRAWABLE_LEFT] ;//判断的依据是获取点击区域相对于屏幕的x值小于控件最左边界加上左侧控件的宽度if (drawableLeft != null && event.getRawX() <= (getLeft() + drawableLeft.getBounds().width())) {mDrawableLeftClickListener.onDrawableLeftClickListener(this) ;return true ;}}break;}return super.onTouchEvent(event);}
}

2: 在XML使用

<com.example.jdstore.view.DrawableTextViewandroid:id="@+id/dtv"android:drawableLeft="@mipmap/back"android:drawableRight="@mipmap/next"android:text="TextView文本"/>

3:在java代码中使用

    //响应右侧图片的点击事件mDtv.setDrawableRightClickListener(new DrawableTextView.DrawableRightClickListener() {@Overridepublic void onDrawableRightClickListener(View view) {//此处执行右侧控件点击后执行的相应逻辑}});//响应左侧图片的点击事件mDtv.setDrawableLeftClickListener(new DrawableTextView.DrawableLeftClickListener() {@Overridepublic void onDrawableLeftClickListener(View view) {//此处执行左侧控件点击后执行的相应逻辑}});

本文就写了左右两侧的监听代码,因为这两种情形是比较常见,也是用的比较多的,大家可以自行借鉴左右两种情形尝试写出上下的监听代码。好了,本文到此为止。如有不足之处,望指教!

自定义DrawableTextView——实现TextView左上右下的点击监听相关推荐

  1. 自定义高效支持点击监听的RecyclerView

    自定义高效支持点击监听的RecyclerView 效果图 Demo 地址:GitHub 传统做法 在Adapter内部直接对View添加点击事件 因为这种方式虽然也可以解决点击监听问题,但是效率不高, ...

  2. 红橙Darren视频笔记 自定义RatingBar touch事件学习 dp转px listener监听

    效果图: 一 需求分析 我们需要实现评分的控件 那么主要有几步 1.绘制出评分控件 2.响应用户的触摸改变星星数 3.控件发生星星变化时通知监听者 二 自定义属性 需要属性: 星星总数 选中星星的图片 ...

  3. 【Android游戏开发二十三】自定义ListView【通用】适配器并实现监听控件!

    本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/android-game/374.html L ...

  4. 【Android开发】自定义ListView,使用通用适配器,并实现ListView上的每一项和每一项上的按钮等控件同时监听

    ListView在Android开发中是比较常用的系统组件,但是有时候我们除了需要做ListView上每一行的点击监听事件之外,如果每一行上还有其他需要监听的控件例如Button.CheckBox等, ...

  5. 自定义ListView【通用】适配器并实现监听控件

    ListView:在Android应用开发过程中属于最常用的系统组件之一,当然可能童鞋们问为什么会突然游戏开发中讲这个,呵呵,其实在游戏开发中,也会常常使用到系统组件,比如游戏排行榜,简单的游戏关卡选 ...

  6. 使用AlertDialog自定义布局,解决自定义控件的监听事件无效的办法

    使用AlertDialog自定义布局,解决自定义控件的监听事件无效的办法 在很多情况下,Android自带对话框的样式满足不了我们项目的需求,这时候我们可以采用为对话框设置自定义布局.如果直接用Dia ...

  7. android textview doubleclick,Android的TextView的双击事件监听

    TextView是没有双击事件的监听设置的,故我们这里使用的是setOnTouchListener来作为双击监听. 监听的类需要实现OnTouchListener类,并重写OnTouch方法 下面是实 ...

  8. 屏幕左上右下坐标计算

    屏幕分为左上右下: 对应关系: 左一般又名为StartX 上一般又名为StartY 右一般有名为EndX 下一般又名为EndY 坐标计算: 左: StartX一般为从屏幕最左边开始计算,0代表左边最边 ...

  9. ListView通过自定义适配器来显示数据并对Item项以及子view项的控件实现监听.

    本篇主要功能. 通过xml pull解析得到数据,然后通过自定义的Adapter绑定数据源,ListView绑定适配器,并且实现Item项的点击事件以及子View控件的点击事件. 一.实体类. Boo ...

最新文章

  1. Linux阶段总结shell脚本
  2. 对比学习系列论文CPCforHAR(一):Contrastive Predictive Coding for Human Activity Recognition
  3. 【转】Android Studio简单设置
  4. 33Exchange Server 2010跨站点部署-分支机构邮件从分支机构出
  5. Tomcat 配置文件
  6. 替换Oracle,从阿里巴巴到亚马逊-他们在逃离什么?
  7. 红亚科技联手董付国老师开启Python实训教育新篇章
  8. Linux系统中各种系统日志文件主要存放在系统中哪个目录
  9. jquery 设置 select 默认值方法
  10. ❤️Bean的自动装配(详细)
  11. Futter基础第12篇: 实现TabController定义顶部tab切换,并介绍生命周期函数
  12. 计算机0表示负数,计算机原码反码补码_0
  13. 脱库和删库的实践及解决方案
  14. cef注入js_CefSharp JavaScript注入
  15. JAVA观察者模式(买彩票案例)
  16. 植物大战僵尸的简单修改
  17. warp-transducer,warprnnt_tensorflow
  18. 凌晨3点不回家:因为想不到的心酸!
  19. 国家计算机职业技能鉴定4级考试内容详解
  20. 航班信息管理系统(JDBC)

热门文章

  1. 模型提效的另一条路:数据增强
  2. 2020数字中国创新大赛-智能算法赛-冠军方案
  3. 开源|如何开发一个高性能的redis cluster proxy?
  4. 推进教育人工智能?网易云和网易波特 “四步走”
  5. 浅析weak指针的实现
  6. Python之面向对象继承和派生
  7. 如何手动关闭tomcat服务,不在Eclipse中的server里按那个红色按钮关。
  8. 漫游Kafka之过期数据清理
  9. linux下MySQL与jdk安装
  10. 使内嵌式jetty服务器支持jsp