自定义switch button风格的按钮

本人新手,刚刚做了一个小项目,需要一个switchbutton风格的按钮,网上有很多,
可是一般都是根据几个图片偏移计算出来的,碰巧美工不喜欢那样的,提供了一系
列图片作为动画,就按照播放动画的方式设计了一个switchbutton,实际是两个
button的组合,代码量不多,直接上代码。

代码块

public class SwitchButton extends FrameLayout {
    private boolean mSwitchOn = true;//开关默认是开着的
    private ImageView mImageViewOn,mImageViewOff;
    private OnChangeListener mListener = null;

    public SwitchButton(Context context) {
        this(context, null);
    }

    public SwitchButton(Context context, AttributeSet attrs) {
        this(context, attrs,0);
    }

    public SwitchButton(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        mImageViewOff = new ImageView(context,attrs);
        mImageViewOff.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                setCheckedWithAnim(!mSwitchOn);
                if(mListener != null) {
                    mListener.onChange( mSwitchOn);
                }
            }
        });
        mImageViewOn = new ImageView(context,attrs);
        mImageViewOn.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                setCheckedWithAnim(!mSwitchOn);
                if(mListener != null) {
                    mListener.onChange( mSwitchOn);
                }
            }
        });
        this.addView(mImageViewOff);
        this.addView(mImageViewOn);

        mImageViewOn.setBackgroundResource(R.anim.anim_switch_on);
        mImageViewOff.setBackgroundResource(R.anim.anim_switch_off);
        //setState(mSwitchOn);
    }

    public void setOnChangeListener(OnChangeListener listener) {
        mListener = listener;
    }

    public interface OnChangeListener {
        public void onChange( boolean state);
    }

    public void setChecked(boolean state){
        AnimationDrawable animationDrawable;
        mSwitchOn = state;
        if(mSwitchOn){
            mImageViewOn.setVisibility(View.VISIBLE);
            mImageViewOff.setVisibility(View.GONE);
        }else{
            mImageViewOn.setVisibility(View.GONE);
            mImageViewOff.setVisibility(View.VISIBLE);
        }
    }

    private void setCheckedWithAnim(boolean state){
        AnimationDrawable animationDrawable;
        mSwitchOn = state;
        if(mSwitchOn){
            mImageViewOn.setVisibility(View.VISIBLE);
            mImageViewOff.setVisibility(View.GONE);
            animationDrawable = (AnimationDrawable) mImageViewOn.getBackground();
            animationDrawable.start();
        }else{
            mImageViewOn.setVisibility(View.GONE);
            mImageViewOff.setVisibility(View.VISIBLE);
            animationDrawable = (AnimationDrawable) mImageViewOff.getBackground();
            animationDrawable.start();
        }
    }
    public boolean isChecked(){
        return this.mSwitchOn;
    }
}
动画xml文件,注意第一帧,是图片静态状态的样子,时长为0

代码块

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="true">
    <item
        android:drawable="@drawable/animation_switcher0003" android:duration="0">
    </item>
    <item
        android:drawable="@drawable/animation_switcher0001" android:duration="10">
    </item>
    <item
        android:drawable="@drawable/animation_switcher0002" android:duration="10">
    </item>
    <item
        android:drawable="@drawable/animation_switcher0003" android:duration="10">
    </item>
</animation-list>

代码块

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="true">
    <item
        android:drawable="@drawable/animation_switcher0001" android:duration="0">
    </item>
    <item
        android:drawable="@drawable/animation_switcher0003" android:duration="10">
    </item>
    <item
        android:drawable="@drawable/animation_switcher0002" android:duration="10">
    </item>
    <item
        android:drawable="@drawable/animation_switcher0001" android:duration="10">
    </item>
</animation-list>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值