滑动开关
自定义控件步骤
测量:onMeasure()设置自己在屏幕上的宽高
布局:onLayout()设置自己显示屏幕上的位置(只有在在自定义ViewGroup中才用到)
绘制:onDraw()控制显示在屏幕上的样子(自定义viewGroup时不需要 )
View和ViewGroup的区别
自定义控件步骤
测量:onMeasure()设置自己在屏幕上的宽高
布局:onLayout()设置自己显示屏幕上的位置(只有在在自定义ViewGroup中才用到)
绘制:onDraw()控制显示在屏幕上的样子(自定义viewGroup时不需要 )
View和ViewGroup的区别
1.它们都需要进行测量工作
2.ViewGroup主要是控制子View如何摆放,所以必须实现onLayout
View没有字View,所以不需要onLayout,但是必须实现onDraw
自定义View中,如果view只是在布局文件中使用,只需重写有两个参数的构造方法
public ToggleButton(Context context,AttributeSEt attrs)
如果view需要在java代码中动态new出来,需重写
public ToggleButton(Context context)
invalidate()刷新view,重调onDraw方法
public class ToggleButton extends View {
private Bitmap slideBg;
private Bitmap slideBtn;
private int currentX;
private ToggleState currentState = ToggleState.Close;
boolean sliding = false;
public ToggleButton(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
public ToggleButton(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
public enum ToggleState {
Open, Close;
}
public void setSlideBackground(int bg) {
slideBg = BitmapFactory.decodeResource(getResources(), bg);
}
public void setSlideBtn(int btn) {
slideBtn = BitmapFactory.decodeResource(getResources(), btn);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
setMeasuredDimension(slideBg.getWidth(), slideBg.getHeight());
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawBitmap(slideBg, 0, 0, null);
if (sliding) {
int left = currentX - slideBtn.getWidth() / 2;
if (left < 0) {
left = 0;
} else if (left > slideBg.getWidth() - slideBtn.getWidth()) {
left = slideBg.getWidth() - slideBtn.getWidth();
}
canvas.drawBitmap(slideBtn, left, 0, null);
} else {
if (ToggleState.Open == currentState) {
canvas.drawBitmap(slideBtn,
slideBg.getWidth() - slideBtn.getWidth(), 0, null);
} else {
canvas.drawBitmap(slideBtn, 0, 0, null);
}
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
currentX = (int) event.getX();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
sliding = true;
break;
case MotionEvent.ACTION_MOVE:
break;
case MotionEvent.ACTION_UP:
sliding = false;
int centerX = slideBg.getWidth() / 2;
if (currentX > centerX) {
if (currentState != ToggleState.Open) {
currentState = ToggleState.Open;
if (listener != null) {
listener.onToggleStateChange(currentState);
}
}
} else {
if (currentState != ToggleState.Close) {
currentState = ToggleState.Close;
if (listener != null) {
listener.onToggleStateChange(currentState);
}
}
}
break;
default:
break;
}
invalidate();
return true;
}
public void setState(ToggleState state) {
currentState = state;
}
private OnToggleStateChangedListener listener;
public void setOnToggleStateChangeListener(
OnToggleStateChangedListener listener) {
this.listener = listener;
}
public interface OnToggleStateChangedListener {
void onToggleStateChange(ToggleState state);
}
}