自定义按钮控件的简单编写


package com.itheima.togglebutton;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;

/**
 * Created by Administrator on 2016/11/15.
 */
public class MyToggleButton extends View{
    private Bitmap backgroud;
    private Bitmap slideIcon;
    private boolean state;
    private onstateChangeListener monstateChangeListener;
    private int backgroudWith;
    private int backgroudHeigt;
    private int slideIconWith;
    private int slideIconHeight;
    private int slideleft;
    private int maxslideleft;

    public MyToggleButton(Context context, AttributeSet attrs) {
        super(context, attrs);
        //自定义属性的命名空间
        String namespace = "http://schemas.android.com/apk/res-auto";
        int slide_backgroundResId = attrs.getAttributeResourceValue(namespace, "backgroud", -1);
        int slide_iconResId = attrs.getAttributeResourceValue(namespace, "slideIcon", -1);
        if (slide_backgroundResId!=-1&slide_iconResId!=-1){
            setSwitchimage(slide_backgroundResId,slide_iconResId);
        }
        attrs.getAttributeBooleanValue(namespace,"state",false);
        setSwitchstate( state);

    }
    /**设置开关的背景
     * slide_background开关的背景
     * slide_icon开关上面的按钮
     */
    public void setSwitchimage(int slide_backgroundResId, int slide_iconResId){
       backgroud = BitmapFactory.decodeResource(getResources(), slide_backgroundResId);
        slideIcon = BitmapFactory.decodeResource(getResources(),slide_iconResId);
        //得到背景图片和滑块的宽和高
        backgroudWith = backgroud.getWidth();
        backgroudHeigt = backgroud.getHeight();
       slideIconWith =   slideIcon.getWidth();
        slideIconHeight = slideIcon.getHeight();
         maxslideleft = backgroudWith - slideIconWith;


    }
    public void setSwitchstate(boolean state){
       checkState(state);
        if (state){
            slideleft = maxslideleft;

        }else{
            slideleft = 0;

        }

    }
    public void setstateChangeListener(onstateChangeListener monstateChangeListener){
        this.monstateChangeListener = monstateChangeListener;

    }

    /**状态改变的接口*/
    public interface onstateChangeListener {

        void onstatechanged(boolean state);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

        setMeasuredDimension(backgroudWith,backgroudHeigt);

    }

    @Override
    protected void onDraw(Canvas canvas) {
        int left =0;
        int top = 0;
        canvas.drawBitmap(backgroud,left,top, null);
        canvas.drawBitmap(slideIcon,slideleft,top,null);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()){
            //手指按下的状态
            case MotionEvent.ACTION_DOWN:
             //手指移动的状态
                break;
            case MotionEvent.ACTION_MOVE:
                slideleft = (int) (event.getX()-slideIconWith/2);
                if (slideleft<0){
                    slideleft =0;
                }else if (slideleft>maxslideleft){
                    slideleft = maxslideleft;

                }
                break;

                //手指离开的状态
            case MotionEvent.ACTION_UP:
                if (event.getX()<backgroudWith/2) {
                    slideleft = 0;
                    checkState(false);

                }else{
                    slideleft =maxslideleft;
                    checkState(true);



                }


                break;


        }
        invalidate();
        //表示自己要操作事件
        return true;
    }
    private void checkState(boolean State){
        if (this.state!=state){
            this.state = state;
        }
        if (monstateChangeListener!=null){
            monstateChangeListener.onstatechanged(state);

        }


    }
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值