自定义View一般分以下步骤:
测量:onMeasure 设置控件显示在屏幕上的宽高
布局:onLayout 设置控件显示在屏幕上的位置(只有在自定义ViewGroup中才用到)
绘制:onDraw 控制显示在屏幕上的样子
而View和ViewGroup的区别
1.他们都需要进行测量操作
2.ViewGroup主要是控制子view如何摆放,所以必须实现onLayout
View没有子view,所以不需要onLayout方法,但是必须实现onDraw
而自定义滑动开关这里继承View,效果图:
public class ToggleButton extends View {
private Bitmap slideBg;
private Bitmap swithcBg;
private ToggleState toggleState = ToggleState.OPEN;
private int currentX = 0;
private boolean isSliding = false;
//自定义View在xml布局文件使用时才调用此构造方法
public ToggleButton(Context context, AttributeSet attrs) {
super(context, attrs);
}
//view在java代码中动态生成,调用此构造方法
public ToggleButton(Context context) {
super(context);
}
/**
* 设置滑动块图片
*
* @param slideBackgroudResourec
*/
public void setSlideBackgroudResourec(int slideBackgroudResourec) {
slideBg = BitmapFactory.decodeResource(getResources(), slideBackgroudResourec);
}
/**
* 设置滑动背景图
*
* @param switchBackgroudResourec
*/
public void setSwitchBackgroudResourec(int switchBackgroudResourec) {
swithcBg = BitmapFactory.decodeResource(getResources(), switchBackgroudResourec);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
currentX = (int) event.getX();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
isSliding = true;
break;
case MotionEvent.ACTION_MOVE:
break;
case MotionEvent.ACTION_UP:
isSliding = false;
//如果滑动点大于背景图一半,此时状态为开
int centerX = swithcBg.getWidth()/2;
if (currentX > centerX){
if (toggleState != ToggleState.OPEN){
toggleState = ToggleState.OPEN;
if (listner != null){
listner.onToggleStateChange(toggleState);
}
}
}else{
if (toggleState != ToggleState.CLOSE){
toggleState = ToggleState.CLOSE;
if (listner != null){
listner.onToggleStateChange(toggleState);
}
}
}
break;
}
//刷新控件让系统调用onDraw方法
invalidate();
return true;
}
//设置当前控件显示在屏幕的宽高
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
setMeasuredDimension(swithcBg.getWidth(), swithcBg.getHeight());
}
//设置当前控件显示在屏幕的样子
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
/**
* 1.绘制的背景图
* 2.left:屏幕的左边X座标
* 3.top:屏幕顶端的y座标
* 4.画笔工具,需要显示颜色和画笔大小才用
*/
canvas.drawBitmap(swithcBg, 0, 0, null);
if (isSliding){
int left = currentX - slideBg.getWidth() / 2;
if (left <= 0) left = 0;
if (left > swithcBg.getWidth() - slideBg.getWidth()){
left = swithcBg.getWidth() - slideBg.getWidth();
}
canvas.drawBitmap(slideBg, left, 0, null);
}else{
if (toggleState == ToggleState.OPEN) {
canvas.drawBitmap(slideBg, swithcBg.getWidth() - slideBg.getWidth(), 0, null);
} else {
canvas.drawBitmap(slideBg, 0, 0, null);
}
}
}
public void setToggleState(ToggleState toggleState) {
this.toggleState = toggleState;
}
public enum ToggleState {
OPEN, CLOSE
}
private onToggleStateChangeListner listner;
public void setOnToggleStateChangeListner(onToggleStateChangeListner listner){
this.listner = listner;
}
public interface onToggleStateChangeListner{
void onToggleStateChange(ToggleState state);
}
}