今天由于忙,就随便敲了点代码,希望大家见谅。。。
这次实现的是自定义滑动按钮,拖动按钮自动反弹,以及处理点击和触摸事件的冲突等。
附如下代码:
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(); } } }