`
liming1022
  • 浏览: 8139 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

自定义滑动按钮

阅读更多

今天由于忙,就随便敲了点代码,希望大家见谅。。。

这次实现的是自定义滑动按钮,拖动按钮自动反弹,以及处理点击和触摸事件的冲突等。

附如下代码:

public class MyToggleView extends View implements View.OnClickListener {

	private Bitmap backgroundBitmap;
	private Bitmap slideBitmap;
	private float slideLeft = 0;
	private Paint paint;
	private boolean isClickable = true;

	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
		// super.onMeasure(widthMeasureSpec, heightMeasureSpec);
		setMeasuredDimension(backgroundBitmap.getWidth(),
				backgroundBitmap.getHeight());
	}

	public MyToggleView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		initView();
	}

	private void initView() {
		backgroundBitmap = BitmapFactory.decodeResource(getResources(),
				R.drawable.switch_background);
		slideBitmap = BitmapFactory.decodeResource(getResources(),
				R.drawable.slide_button);
		paint = new Paint();
		maxLeft = backgroundBitmap.getWidth()-slideBitmap.getWidth();

		
		setOnClickListener(this);
		
	}
	private float startX;
	private float lastX;
	@Override
	public boolean onTouchEvent(MotionEvent event) {
		super.onTouchEvent(event);
		int action = event.getAction();
		switch (action) {
		case MotionEvent.ACTION_DOWN:
			lastX = startX = event.getRawX();
			isClickable = true;
			break;
		case MotionEvent.ACTION_MOVE:
			float newX = event.getRawX();
			float dX = newX - startX;
			if(Math.abs(event.getX()-lastX) >5){
				isClickable = false;
				
			}
				slideLeft += dX;
				flushStatus();
				startX = event.getRawX();
			break;
		case MotionEvent.ACTION_UP:
			if(!isClickable){
				
				if(slideLeft > maxLeft/2){
					state = true;
					slideLeft = maxLeft;
				}else{
					state = false;
					slideLeft = 0;
				}
				flushStatus();
			}
			break;

		default:
			break;
		}
		return true;
	}

	private void flushStatus() {
		if(slideLeft < 0){
			slideLeft = 0;
		}
		if(slideLeft > maxLeft){
			slideLeft = maxLeft;
		}
		invalidate();
	}

	public MyToggleView(Context context, AttributeSet attrs) {
		super(context, attrs);
		initView();
	}

	public MyToggleView(Context context) {
		super(context);
		initView();
	}

	@Override
	protected void onDraw(Canvas canvas) {
		// super.onDraw(canvas);
		canvas.drawBitmap(backgroundBitmap, 0, 0, paint);

		canvas.drawBitmap(slideBitmap, slideLeft, 0, paint);

	}

	private boolean state;
	private float maxLeft;
	@Override
	public void onClick(View v) {
		if(isClickable){
			
			state = !state;
			if(state){
				slideLeft = maxLeft;
			}else{
				slideLeft = 0;
			}
			invalidate();
		} 
	}

}

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics