您的位置:首页 > 移动开发 > Android开发

android自定义滑动开关

2016-11-14 19:52 239 查看

自定义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);
}


}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: