DrawableTextView import android.content.Context;import android.graphics.drawable.Drawable;import android.support.v7.widget.AppCompatTextView;import android.text.TextUtils;import android.util.AttributeSet;import android.view.MotionEvent;impo
import android.content.Context; import android.graphics.drawable.Drawable; import android.support.v7.widget.AppCompatTextView; import android.text.TextUtils; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import com.ccmagic.library.utils.LogUtil; /** * Created by ccMagic on 2017/11/14. * Copyright : * Version : * Reference : * Description : 具备上下左右在添加Drawable时能单独设置Drawable点击事件的TextView */ public class DrawableTextView extends AppCompatTextView { /** * 文字区域点击监听器 */ private DrawableClickListener mTextDrawableClickListener; /** * 左侧Drawable区域点击监听器 */ private DrawableClickListener mLeftDrawableClickListener; /** * 右侧Drawable区域点击监听器 */ private DrawableClickListener mRightDrawableClickListener; /** * 上侧Drawable区域点击监听器 */ private DrawableClickListener mTopDrawableClickListener; /** * 下侧Drawable区域点击监听器 */ private DrawableClickListener mBottomDrawableClickListener; /** * 触屏操作时间记录 * MotionEvent.ACTION_DOWN time1 * MotionEvent.ACTION_UP time2 */ private long time1 = 0, time2 = 0; /** * 点击时间间隔 * 单位: 毫秒 * 默认值: 1000 */ private int mTimeInterval = 1000; /** * 标记是否可使用自定义点击 */ private boolean mTextClickAble = false, mLeftClickAble = false, mRightClickAble = false, mTopClickAble = false, mBottomClickAble = false;//默认不可点击 public DrawableTextView(Context context) { super(context); init(); } public DrawableTextView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public DrawableTextView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } private void init() { setEllipsize(TextUtils.TruncateAt.MARQUEE); setSingleLine(true); setMarqueeRepeatLimit(-1); } public interface DrawableClickListener { void onClick(View view); } /** * 设置点击的时间间隔-MotionEvent.ACTION_DOWN * MotionEvent.ACTION_UP */ public void setTimeInterval(int timeInterval) { mTimeInterval = timeInterval; } /** * 设置文字区域监听器 */ public void setTextDrawableClickListener(DrawableClickListener drawableClickListener) { mTextDrawableClickListener = drawableClickListener; } /** * 设置左侧Drawable区域监听器 */ public void setLeftDrawableClickListener(DrawableClickListener drawableClickListener) { mLeftDrawableClickListener = drawableClickListener; } /** * 设置右侧Drawable区域监听器 */ public void setRightDrawableClickListener(DrawableClickListener drawableClickListener) { mRightDrawableClickListener = drawableClickListener; } /** * 设置上侧Drawable区域监听器 */ public void setTopDrawableClickListener(DrawableClickListener drawableClickListener) { mTopDrawableClickListener = drawableClickListener; } /** * 设置下侧Drawable区域监听器 */ public void setBottomDrawableClickListener(DrawableClickListener drawableClickListener) { mBottomDrawableClickListener = drawableClickListener; } @Override public boolean performClick() { // Calls the super implementation, which generates an AccessibilityEvent // and calls the onClick() listener on the view, if any super.performClick(); // Handle the action for the custom click here return true; } @Override public boolean onTouchEvent(MotionEvent event) { performClick(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: time1 = 0; time1 = System.currentTimeMillis(); break; case MotionEvent.ACTION_UP: time2 = 0; time2 = System.currentTimeMillis(); break; } mTextClickAble = false; mLeftClickAble = false; mRightClickAble = false; mTopClickAble = false; mBottomClickAble = false; // getCompoundDrawables获取是一个数组,数组0,1,2,3,对应着左,上,右,下 这4个位置的图片,如果没有就为null //文字点击 if (mTextDrawableClickListener != null) { int left = getCompoundDrawables()[0] == null ? 0 : getCompoundDrawables()[0].getBounds().width(); int right = getCompoundDrawables()[2] == null ? 0 : getCompoundDrawables()[2].getBounds().width(); int top = getCompoundDrawables()[1] == null ? 0 : getCompoundDrawables()[1].getBounds().height(); int bottom = getCompoundDrawables()[3] == null ? 0 : getCompoundDrawables()[3].getBounds().height(); if (event.getX() >= left && event.getX() <= getMeasuredWidth() - right && event.getY() >= top && event.getY() <= getMeasuredHeight() - bottom) { mTextClickAble = true; if (time2 > time1 && time2 - time1 < mTimeInterval) { mTextDrawableClickListener.onClick(this); } } else { mTextClickAble = false; } } //判断的依据是获取点击区域相对于屏幕的x值比我(获取TextView的最左边界减去边界宽度)小就可以判断点击在Drawable上 if (mLeftDrawableClickListener != null) { // getCompoundDrawables获取是一个数组,数组0,1,2,3,对应着左,上,右,下 这4个位置的图片,如果没有就为null Drawable leftDrawable = getCompoundDrawables()[0]; if (leftDrawable != null) { int i = (getMeasuredHeight() - leftDrawable.getBounds().height()) >> 1;//得到左部Drawable与this的上下两边的间距 if (event.getX() <= leftDrawable.getBounds().width() && event.getY() >= i && event.getY() <= getMeasuredHeight() - i) { mLeftClickAble = true; if (time2 > time1 && time2 - time1 < mTimeInterval) { mLeftDrawableClickListener.onClick(this); } } else { mLeftClickAble = true; } } } //判断的依据是获取点击区域相对于屏幕的x值比我(获取TextView的最右边界减去边界宽度)大就可以判断点击在Drawable上 if (mRightDrawableClickListener != null) { // getCompoundDrawables获取是一个数组,数组0,1,2,3,对应着左,上,右,下 这4个位置的图片,如果没有就为null Drawable rightDrawable = getCompoundDrawables()[2]; if (rightDrawable != null) { int i = (getMeasuredHeight() - rightDrawable.getBounds().height()) >> 1;//得到右部Drawable与this的上下两边的间距 if (event.getX() >= getMeasuredWidth() - rightDrawable.getBounds().width() && event.getY() >= i && event.getY() <= getMeasuredHeight() - i) { mRightClickAble = true; if (time2 > time1 && time2 - time1 < mTimeInterval) { mRightDrawableClickListener.onClick(this); } } else { mRightClickAble = false; } } } if (mTopDrawableClickListener != null) { // getCompoundDrawables获取是一个数组,数组0,1,2,3,对应着左,上,右,下 这4个位置的图片,如果没有就为null Drawable topDrawable = getCompoundDrawables()[1]; if (topDrawable != null) { int i = (getMeasuredWidth() - topDrawable.getBounds().width()) >> 1;//得到顶部Drawable与this的左右两边的间距 if (event.getY() <= topDrawable.getBounds().height() && event.getX() >= i && event.getX() <= getMeasuredWidth() - i) { mTopClickAble = true; if (time2 > time1 && time2 - time1 < mTimeInterval) { mTopDrawableClickListener.onClick(this); } } else { mTopClickAble = false; } } } if (mBottomDrawableClickListener != null) { // getCompoundDrawables获取是一个数组,数组0,1,2,3,对应着左,上,右,下 这4个位置的图片,如果没有就为null Drawable bottomDrawable = getCompoundDrawables()[3]; if (bottomDrawable != null) { int i = (getMeasuredWidth() - bottomDrawable.getBounds().width()) >> 1;//得到底部Drawable与this的左右两边的间距 if (event.getY() >= (getMeasuredHeight() - bottomDrawable.getBounds().height()) && event.getX() >= i && event.getX() <= getMeasuredWidth() - i) { mBottomClickAble = true; if (time2 > time1 && time2 - time1 < mTimeInterval) { mBottomDrawableClickListener.onClick(this); } } else { mBottomClickAble = false; } } } LogUtil.i("" + (mTextClickAble || mLeftClickAble || mRightClickAble || mTopClickAble || mBottomClickAble)); return mTextClickAble || mLeftClickAble || mRightClickAble || mTopClickAble || mBottomClickAble; } }