实例展示
重要代码演示
package com.example.test_togglebutton;
import android.annotation.SuppressLint;
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;
public class MyToggleButton extends View {
// 背景图片
private Bitmap backgroundBitmap;
// 作为可滑动图片
private Bitmap slideBitmap;
private Paint paint;
// 当前开关的状态 false为关
private boolean currState = false;
// 滑动图片的左边距
private float slideLeft;
public MyToggleButton(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
}
public MyToggleButton(Context context, AttributeSet attrs) {
super(context, attrs);
// 初始化
initImage();
}
/**
* 刷新当前状态
*/
public void flushState() {
if (currState) {
slideLeft = backgroundBitmap.getWidth() - slideBitmap.getWidth();
} else {
slideLeft = 0;
}
// 刷新 重新调用onDraw()方法
invalidate();
}
/**
* 初始化图片
*/
private void initImage() {
backgroundBitmap = BitmapFactory.decodeResource(getResources(),
R.drawable.switch_background);
slideBitmap = BitmapFactory.decodeResource(getResources(),
R.drawable.slide_button);
paint = new Paint();
paint.setAntiAlias(true);
/**
* 当前view的监听
*/
setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (!isSlide) {
currState = !currState;
// 刷新
flushState();
}
}
});
}
public MyToggleButton(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
/**
* 设置当前View的大小
*/
setMeasuredDimension(backgroundBitmap.getWidth(),
backgroundBitmap.getHeight());
// super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
@SuppressLint("DrawAllocation")
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
// 绘制图片
canvas.drawBitmap(backgroundBitmap, 0, 0, paint);
canvas.drawBitmap(slideBitmap, slideLeft, 0, paint);
}
private int fistX;
private int lastX;
private boolean isSlide = false;
@Override
public boolean onTouchEvent(MotionEvent event) {
super.onTouchEvent(event);
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
fistX = lastX = (int) event.getX();
isSlide = false;
break;
case MotionEvent.ACTION_UP:
if (isSlide) {
int maxLeft = backgroundBitmap.getWidth()
- slideBitmap.getWidth();
/*
* 根据 slideBtn_left 判断,当前应是什么状态
*/
if (slideLeft > maxLeft / 2) {
// 此时应为 打开的状态
currState = true;
} else {
currState = false;
}
flushState();
}
break;
case MotionEvent.ACTION_MOVE:
if (Math.abs(event.getX() - fistX) > 5) {
isSlide = true;
}
int dis = (int) (event.getX() - lastX);
slideLeft = slideLeft + dis;
break;
default:
break;
}
flushView();
return true;
}
public void flushView() {
// 得到滑动块能滑动的最大距离
int maxX = backgroundBitmap.getWidth() - slideBitmap.getWidth();
slideLeft = (slideLeft < 0) ? 0 : slideLeft;
slideLeft = (slideLeft < maxX) ? slideLeft : maxX;
//重新绘制
invalidate();
}
}