自定义开关
/**
* 自定义开关按钮
*/
public class MyToggleButton extends View implements View.OnClickListener {
/**
* 需要绘制的背景
*/
private Bitmap backgroundBitmap;
/**
* 需要绘制的开关
*/
private Bitmap slidingBitmap;
/**
* 距离左边最大值
*/
private int slideLeftMax;
/**
* 距离左边的值
*/
private int slideLeft;
/**
* 判断是否打开开关
*/
private boolean isOpen = false;
/**
* 用于记录当前的横坐标
*/
private float startX;
/**
* 判断点击事件是否生效
* true 点击事件生效,滑动事件不生效
* false 滑动事件生效,点击事件不生效
*/
private boolean isEnableClick = true;
/**
* 记录原始坐标判断是否已经开始滑动
*/
private float lastX;
private Paint paint;
public MyToggleButton(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
initView();
}
private void initView() {
paint = new Paint();
paint.setAntiAlias(true);
backgroundBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.switch_background);
slidingBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.slide_button);
slideLeftMax = backgroundBitmap.getWidth() - slidingBitmap.getWidth();
/**
* 设置点击事件
*/
this.setOnClickListener(this);
}
/**
* 测量--用于指定控件的大小
*
* @param widthMeasureSpec
* @param heightMeasureSpec
*/
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
setMeasuredDimension(backgroundBitmap.getWidth(), backgroundBitmap.getHeight());
}
/**
* 绘制--用于指定控件的内容
*
* @param canvas 画布
*/
@Override
protected void onDraw(Canvas canvas) {
canvas.drawBitmap(backgroundBitmap, 0, 0, paint);
canvas.drawBitmap(slidingBitmap, slideLeft, 0, paint);
}
/**
* 设置点击事件
*
* @param v
*/
@Override
public void onClick(View v) {
isOpen = !isOpen;
if (isEnableClick) {
flushView();
}
}
private void flushView() {
if (isOpen) {
slideLeft = slideLeftMax;
} else {
slideLeft = 0;
}
/**
* 刷新画布重新调用onDraw
*/
invalidate();
}
/**
* 设置触摸事件
*
* @param event
* @return
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
super.onTouchEvent(event);
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
/**
* 记录按下的横坐标
*/
startX = event.getX();
lastX = startX;
isEnableClick = true;
break;
case MotionEvent.ACTION_MOVE:
/**
* 记录移动中的横坐标
*/
float endX = event.getX();
/**
* 计算偏移量
*/
float distanceX = endX - startX;
slideLeft += distanceX;
/**
* 屏蔽非法值
*/
if (slideLeft < 0) {
slideLeft = 0;
} else if (slideLeft > slideLeftMax) {
slideLeft = slideLeftMax;
}
/**
* 刷新画布
*/
invalidate();
/**
* 记录当前起始位置
*/
startX = event.getX();
if (Math.abs(endX - lastX) > 5) {
isEnableClick = false;
}
break;
case MotionEvent.ACTION_UP:
if (!isEnableClick) {
if (slideLeft > slideLeftMax / 2) {
isOpen = true;
} else {
isOpen = false;
}
flushView();
}
break;
}
return true;
}
}