自定义控件之滑动开关

滑动开关
自定义控件步骤
测量: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);
	}

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值