• [转]永久告别Android的背景选择器Selector!无需切很多图了!


    package com.zoke.custom.autobg;
     
    import android.content.Context;
    import android.content.res.TypedArray;
    import android.graphics.Color;
    import android.graphics.ColorFilter;
    import android.graphics.LightingColorFilter;
    import android.graphics.drawable.Drawable;
    import android.graphics.drawable.LayerDrawable;
    import android.util.AttributeSet;
    import android.util.Log;
    import android.widget.Button;
     
    import com.zoke.custom.R;
     
    /**
     * Android按钮显示不同状态无需多张图片的自定义控件
     * 
     * @author Jack 2014-2-8
     * 
     * 
     */
    public class AutoBgButton extends Button {
     
            public AutoBgButton(Context context) {
                    super(context);
            }
     
            public AutoBgButton(Context context, AttributeSet attrs) {
                    super(context, attrs);
            }
     
            public AutoBgButton(Context context, AttributeSet attrs, int defStyle) {
                    super(context, attrs, defStyle);
            }
            @Override
            public void setBackgroundDrawable(Drawable d) {
                    // 替换背景图
                    AutoBgButtonBackgroundDrawable layer = new AutoBgButtonBackgroundDrawable(
                                    d);
                    super.setBackgroundDrawable(layer);
            }
     
            /**
             * 按钮所使用的状态图
             */
            protected class AutoBgButtonBackgroundDrawable extends LayerDrawable {
     
                    // 按钮按下时所使用的颜色过滤器
                    protected ColorFilter _pressedFilter = new LightingColorFilter(
                                    getContext().getResources().getColor(R.color.pressColor), 1);
                    // 按钮被禁用时的alpha值
                    protected int _disabledAlpha = 100;
     
                    public AutoBgButtonBackgroundDrawable(Drawable d) {
                            super(new Drawable[] { d });
                    }
     
                    @Override
                    protected boolean onStateChange(int[] states) {
                            boolean enabled = false;
                            boolean pressed = false;
     
                            for (int state : states) {
                                    if (state == android.R.attr.state_enabled)
                                            enabled = true;
                                    else if (state == android.R.attr.state_pressed)
                                            pressed = true;
                            }
     
                            mutate();
                            if (enabled && pressed) {
                                    setColorFilter(_pressedFilter);
                            } else if (!enabled) {
                                    setColorFilter(null);
                                    setAlpha(_disabledAlpha);
                            } else {
                                    setColorFilter(null);
                            }
     
                            invalidateSelf();
     
                            return super.onStateChange(states);
                    }
     
                    @Override
                    public boolean isStateful() {
                            return true;
                    }
            }
     
    }

    博客原文

  • 相关阅读:
    mysql基础整理01
    继承、接口、static、abstract
    重载与重写
    单例模式
    我的程序人生
    Idea的Maven项目引入模块
    测试单元测试完毕关闭jvm
    java线程
    logback日志的美化
    Netty中消除开始的日志消息修改日志级别
  • 原文地址:https://www.cnblogs.com/Cyning/p/3544798.html
Copyright © 2020-2023  润新知