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;
}
}
