当前位置 : 主页 > 编程语言 > java >

具备上下左右在添加Drawable时能单独设置Drawable点击事件的TextView

来源:互联网 收集:自由互联 发布时间:2021-06-28
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
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;
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;
    }
}
网友评论