安卓 仿iOS实现图片按下变色(不拦截事件实现)


先上图

常态

触摸


一张图片实现按下变色。(关于松手后不会恢复的问题,设置点击事件就不会有这个问题了)

不得不说iOS在一些比安卓要方便很多,比如自带这个变色的效果。

在网上搜索了一下,比如http://www.cnblogs.com/linjzong/p/4206283.html
用滤镜实现,但是需要拦截触摸事件,然后自己传递点击事件,手指滑动出了view的区域然后抬起手指都会触发点击事件,感觉不太友好。

  • 于是有了下面的修改

public class ColorFilterImageView extends AppCompatImageView {

    public ColorFilterImageView(Context context) {
        super(context);
    }

    public ColorFilterImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public ColorFilterImageView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    //重点在这里,使用dispatchTouchEvent而不是onTouchEvent
    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        switch (event.getActionMasked()) {
            case MotionEvent.ACTION_DOWN:
                /** 设置滤镜 */
                setFilter();
                break;
            case MotionEvent.ACTION_UP:
            case MotionEvent.ACTION_CANCEL:
                /** 删除滤镜 */
                removeFilter();
                break;
            default:
                break;
        }
        return super.dispatchTouchEvent(event);
    }


    /**
     * 设置滤镜
     */
    private void setFilter() {
        //先获取设置的src图片
        Drawable drawable = getDrawable();
        //当src图片为Nul l,获取背景图片
        if (drawable == null) {
            drawable = getBackground();
        }
        if (drawable != null) {
            //设置滤镜
            drawable.setColorFilter(Color.GRAY, PorterDuff.Mode.MULTIPLY);
        }
    }

    /**
     * 清除滤镜
     */
    private void removeFilter() {
        //先获取设置的src图片
        Drawable drawable = getDrawable();
        //当src图片为Null,获取背景图片
        if (drawable == null) {
            drawable = getBackground();
        }
        if (drawable != null) {
            //清除滤镜
            drawable.clearColorFilter();
        }
    }

}

重点就是这个了,不拦截触摸事件

//重点在这里,使用dispatchTouchEvent而不是onTouchEvent
    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        switch (event.getActionMasked()) {
            case MotionEvent.ACTION_DOWN:
                /** 设置滤镜 */
                setFilter();
                break;
            case MotionEvent.ACTION_UP:
            case MotionEvent.ACTION_CANCEL:
                /** 删除滤镜 */
                removeFilter();
                break;
            default:
                break;
        }
        return super.dispatchTouchEvent(event);
    }

好了,很简单就实现了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值