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); } } }