Android Image点击效果

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/tyzlmjj/article/details/50535582

转载请标明出处:
http://blog.csdn.net/tyzlmjj/article/details/50535582
本文出自:【M家杰的博客】

概述
之前一篇博客【Android 各种按钮点击效果以及兼容性问题总结】中提到了一个关于安卓中实现图片点击效果的方法,不过一直感觉那个方法有点LOW,最近看了几个官方的例子,找到了个比较好的图片点击高亮的方法。


效果

图片点击

代码

代码不长,就是个自定义View文件,在XML里直接用就行了,主要是在初始化的init()方法中,可以修改点击效果的文件,下面的代码中我是创建了一个StateListDrawable(效果跟<selector>创建的xml文件一样),如果想用系统默认的点击效果可以改成android.R.attr.selectableItemBackground

public class TouchHighlightImageButton extends ImageButton {
    /**
     * 焦点与点击状态时View的覆盖层Drawable,一般设置半透明的Drawable
     */
    private Drawable mForegroundDrawable;

    /**
     * View的大小范围记录
     */
    private Rect mCachedBounds = new Rect();

    public TouchHighlightImageButton(Context context) {
        super(context);
        init();
    }

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

    public TouchHighlightImageButton(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }

    /**
     * 初始化
     */
    private void init() {
        // 重置默认的背景样式和内边距
        setBackgroundColor(0);
        setPadding(0, 0, 0, 0);

        // 设置点击时显示的Drawable
        StateListDrawable stateListDrawable = new StateListDrawable();
        stateListDrawable.addState(new int[]{android.R.attr.state_pressed}, new ColorDrawable(0x99000000));
        mForegroundDrawable = stateListDrawable;
        mForegroundDrawable.setCallback(this);

    }

    @Override
    protected void drawableStateChanged() {
        super.drawableStateChanged();

        // 更新Drawable状态与View状态匹配
        if (mForegroundDrawable.isStateful()) {
            mForegroundDrawable.setState(getDrawableState());
        }

        // 重绘
        invalidate();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        //画Drawable
        mForegroundDrawable.setBounds(mCachedBounds);
        mForegroundDrawable.draw(canvas);
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        // 保存View大小范围
        mCachedBounds.set(0, 0, w, h);
    }
}
展开阅读全文

没有更多推荐了,返回首页