根据左右滑动的开关修改而来http://blog.csdn.net/xiaanming/article/details/8842453
package com.example.view; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Matrix; import android.graphics.Paint; import android.util.AttributeSet; import android.util.DisplayMetrics; import android.view.MotionEvent; import android.view.View; import com.example.buttons.R; public class VerticalSwitch extends View{ private Bitmap bg_on, bg_off; /** * 按下时的y和当前的y */ private float downY, nowY; /** * 记录用户是否在滑动 */ private boolean onSlip = false; /** * 当前的开关状态 */ private boolean switchStatus = false; //图片实际尺寸 int bgOnWidth=0; int bgOnHight=0; //高宽缩放比例 float scaleW=0.0f; float scaleH=0.0f; //屏幕宽 int width=0; private onChangeListener listener; public interface onChangeListener{ public void onChange(boolean state); } public VerticalSwitch(Context context) { super(context); init(); } public VerticalSwitch(Context context, AttributeSet attrs) { super(context, attrs); init(); } public void init(){ DisplayMetrics metric = new DisplayMetrics(); width = metric.widthPixels; bg_on = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_open); bg_off = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_close); if(null!=bg_on){ bgOnWidth=bg_on.getWidth(); bgOnHight=bg_on.getHeight(); } } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); int specwidth = MeasureSpec.getSize(widthMeasureSpec); scaleW=(float)specwidth/bgOnWidth; int specHeight=MeasureSpec.getSize(heightMeasureSpec); scaleH=(float)specHeight/bgOnHight; } private int measure(int measureSpec){ int result = 0; //分别获取测量模式 和 测量大小 int specMode = MeasureSpec.getMode(measureSpec); int specSize = MeasureSpec.getSize(measureSpec); //System.out.println("specMode="+specMode+" specSize="+specSize); //如果是精确度模式,呢就按xml中定义的来 if(specMode == MeasureSpec.EXACTLY){ result = specSize; } //如果是最大值模式,就按我们定义的来 else if(specMode == MeasureSpec.AT_MOST){ result = width; }else{ result = bgOnWidth; } return result; } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); Matrix matrix = new Matrix(); Paint paint = new Paint(); matrix.setScale(scaleW,scaleH); //根据nowX设置背景,开或者关状态 if(!switchStatus){ nowY=bg_off.getHeight()/2*scaleH; } if (nowY < (bg_off.getHeight()/2*scaleH)){ canvas.drawBitmap(bg_on, matrix, paint);//画出打开时的背景 }else{ canvas.drawBitmap(bg_off, matrix, paint);//画出关闭时的背景 } } @Override public boolean onTouchEvent(MotionEvent event) { //return super.onTouchEvent(event); switch (event.getAction()){ case MotionEvent.ACTION_DOWN://按下 if(event.getX()>bg_off.getHeight()*scaleH || event.getY()>bg_off.getWidth()*scaleW){ return false; }else{ onSlip=true; downY=event.getY()*scaleH; nowY=downY; } break; case MotionEvent.ACTION_MOVE://移动 nowY=event.getY(); break; case MotionEvent.ACTION_UP://弹起 onSlip=false; if(event.getY()>=(bg_on.getHeight()/2*scaleH)){//按到下面为关 switchStatus=false; nowY=bg_on.getHeight()*scaleH; }else{//按到上面为开 switchStatus=true; nowY=0; } if(listener!=null){ listener.onChange(switchStatus); } break; } invalidate(); return true; } public void setOnChangedListener(onChangeListener listener){ this.listener = listener; } //设置状态 public void setChecked(boolean checked){ if(checked){ nowY = 0; }else{ nowY = bg_off.getHeight()*scaleH; } switchStatus = checked; } }
图片使用两张垂直开关,开和关效果,长宽一致。