package com.example.onoff; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Paint; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; /** * Created by Administrator on 2016/12/21. * 一个视图从创建到显示过程中的主要方法: * 1、构造方法实例化类 * 2、测量-measure(int,int)-->onmeasure(); * 如果当前viwe是一个viewgroup,还要测量孩子,孩子有建议权 * 3、指定位置 layout()-->onlayout(); * 指定空间的位置,一般view不用写这个方法,ViewGroup的时候才用 * 4、绘制视图 draw()-->onDraw(canvas) * 根据上边两个方法的参数,进入绘制 */ public class SelfButton extends View implements View.OnClickListener { private Bitmap backgrounpBitmap; private Bitmap slidingBitmap; private Paint paint; /** * 距离左侧最大值 */ private int slidleftMax; /** * 距离左侧到大值 */ private int slidleft; private float startX; private float lastX; private boolean isOpen=false; /** * true;点击生效,滑动不生效 * false:反之 */ private boolean isEnalbeClic=true; /** * 如果再布局文件中使用该类,此构造必写,否崩溃 * @param context * @param attrs */ public SelfButton(Context context, AttributeSet attrs) { super(context, attrs); initView(); } private void initView() { paint=new Paint(); paint.setAntiAlias(true);//抗锯齿 backgrounpBitmap= BitmapFactory.decodeResource(getResources(),R.drawable.back); slidingBitmap= BitmapFactory.decodeResource(getResources(),R.drawable.on); slidleftMax=backgrounpBitmap.getWidth()-slidingBitmap.getWidth(); this.setOnClickListener(this); } /** * 测量计算 * @param widthMeasureSpec * @param heightMeasureSpec */ @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); setMeasuredDimension(backgrounpBitmap.getWidth(),backgrounpBitmap.getHeight()); } /** * 绘制 * @param canvas */ @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawBitmap(backgrounpBitmap,0,0,paint); canvas.drawBitmap(slidingBitmap,slidleft,0,paint); } @Override public void onClick(View v) { if(isEnalbeClic){ isOpen=!isOpen; flush(); } } //刷新 private void flush(){ if(isOpen){ slidleft=slidleftMax; }else{ slidleft=0; } invalidate();//会导致onDraw()的执行 } @Override public boolean onTouchEvent(MotionEvent event) { super.onTouchEvent(event); switch (event.getAction()){ case MotionEvent.ACTION_DOWN: //1.记录按下的坐标 lastX=startX=event.getX(); isEnalbeClic=true; break; case MotionEvent.ACTION_MOVE: //2.计算结束的坐标 float endX=event.getX(); //3.计算偏移值 float distanceX=endX-startX; slidleft+=distanceX; if(slidleft<0){ slidleft=0; }else if(slidleft>slidleftMax){ slidleft=slidleftMax; } //4.屏蔽非法值 //5.刷新 invalidate(); //6.还原数据 startX=event.getX(); if(Math.abs(endX-lastX)>3){ //滑动 isEnalbeClic=false; } break; case MotionEvent.ACTION_UP: if(!isEnalbeClic){ if(slidleft>slidleftMax/2){ isOpen=true; }else{ isOpen=false; } flush(); } break; } return true; } }![]()
Android 自定义开关(继承View)
最新推荐文章于 2021-05-25 16:15:52 发布