Android自定义开关
/**
* 1.创建一个类,继承VIew
* 2.覆写三个构造方法,进行对象的初始化操作
* 3.覆写OnMeasure,确定控件的宽高大小
* 4.覆写OnDrawer,绘制出控件的静态效果
* 5.实现点击滑动按钮的效果,View类具备点击监听
* 6.覆写手势监听,实现滑动根据手指滑动而移动
* 7.完善手势监听,实现滑到中间的时候,能够根据当前中间的值,自动滑到左边或者右边
*/
public class MyView extends View implements View.OnClickListener {
private Paint paint;//画笔
private Bitmap switch_a;//按钮底部图片
private Bitmap slide_b;//按钮上面的图片
private float slideLeft = 0;
private boolean isOpen = false;//开关状态
private float isLeftRight;//最大值
private int lastx;
private int newx;
private boolean isDrop = false;//点击还是滑动
//记录开关·当前的状态
private boolean isToggleStateListenerOn;
public MyView(Context context) {
this(context, null);
}
public MyView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public MyView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initView(context, attrs);
}
private void initView(Context context, @Nullable AttributeSet attrs) {
//创建画笔
paint = new Paint();
//创建图片
TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.MyViewButton);
BitmapDrawable b1 = (BitmapDrawable) array.getDrawable(R.styleable.MyViewButton_switch_background);
BitmapDrawable b2 = (BitmapDrawable) array.getDrawable(R.styleable.MyViewButton_slide_button);
switch_a = b1.getBitmap();
slide_b = b2.getBitmap();
//switch_a = BitmapFactory.decodeResource(getResources(), R.drawable.switch_a);
//slide_b = BitmapFactory.decodeResource(getResources(), R.drawable.slide_b);
//点击滑动的最大值
isLeftRight = switch_a.getWidth() - slide_b.getWidth();
MyView.this.setOnClickListener(this);
}
//设置按钮的大小
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
//把背景图片的大小作为按钮的大小
setMeasuredDimension(switch_a.getWidth(), switch_a.getHeight());
}
//展示静态效果
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//绘制两张图片 作为按钮
canvas.drawBitmap(switch_a, 0, 0, paint);
canvas.drawBitmap(slide_b, slideLeft, 0, paint);
}
//按钮的点击事件
@Override
public void onClick(View v) {
Log.d("MyView", "onClick");
//点击按钮时的操作
if (isDrop) {
//如果是点击就执行if里的代码
//点击按钮实现开和关的操作
if (isOpen) {
slideLeft = isLeftRight;
} else {
slideLeft = 0;
}
isOpen = !isOpen;
invalidate();
if (toggleStateListener!=null) {
toggleStateListener.onToggleState(isOpen);
}
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
super.onTouchEvent(event);
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
Log.d("MyView", "DOWN");
//点击时的坐标
lastx = (int) event.getX();
//改变状态为滑动
isDrop = true;
break;
case MotionEvent.ACTION_MOVE:
Log.d("MyView", "MOVE");
//滑动时的X坐标
newx = (int) event.getX();
//
int offsetx = newx - lastx;
slideLeft = slideLeft + offsetx;
lastx = newx;
huadong();
break;
case MotionEvent.ACTION_UP:
Log.d("MyView", "UP");
if (!isDrop) {
if (slideLeft > isLeftRight / 2) {
isOpen = true;
} else if (slideLeft <= isLeftRight / 2) {
isOpen = false;
}
if (isOpen) {
slideLeft = isLeftRight;
} else {
slideLeft = 0;
}
invalidate();
}
break;
}
return true;
}
private void huadong() {
if (slideLeft < 0) {
slideLeft = 0;
} else if (slideLeft > isLeftRight) {
slideLeft = isLeftRight;
}
invalidate();
}
//定义接口
public interface OnToggleStateListener {
void onToggleState(boolean isOpen);
}
//接口对象
private OnToggleStateListener toggleStateListener;
public void setOnToggleStateListener(OnToggleStateListener listener) {
toggleStateListener = listener;
}
}