参考博客
https://www.cnblogs.com/lihuabest/archive/2013/03/08/2950070.html
原理:
1.背景---通过xml里面布局
2.绘制静态图片 (知道上下左右)
canvas.drawBitmap(dragBitmap, drawX < 0 ? 5 : drawX,drawY,null);
/** * 绘制拖动时的图片 */ @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); invalidateDragImg(canvas); }
3.判断手是否点击到了滑动区域(通过一个矩形的面积范围内)
private boolean isActionDown(MotionEvent event) { Rect rect = new Rect(); heartView.getHitRect(rect); boolean isIn = rect.contains((int)event.getX()-heartView.getWidth(), (int)event.getY()); if(isIn){ heartView.setVisibility(View.GONE); return true; } return false; }
4.处理移动事件和事件传递(移动的时候不断的重回图,通过坐标的变化)
/** * 对拖拽图片不同的点击事件处理 */ @Override public boolean onTouchEvent(MotionEvent event) { int X = (int) event.getX(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: locationX = (int) event.getX(); Log.i(TAG, "是否点击到位=" + isActionDown(event)); return isActionDown(event);//判断是否点击了滑动区域 case MotionEvent.ACTION_MOVE: //保存x轴方向,绘制图画 locationX = X; invalidate(); //重新绘图 return true; case MotionEvent.ACTION_UP: //判断是否解锁成功 if(!isLocked()){ //没有解锁成功,动画应该回退 handleActionUpEvent(event); //动画回退 } return true; } return super.onTouchEvent(event); }
5.在时间范围内回退动画(通过handler控制时间,不停的发延时消息,条件是x的距离到了最左边)
/** * 回退动画 * @param event */ private void handleActionUpEvent(MotionEvent event) { int x = (int) event.getX(); int toLeft = leftRingView.getWidth(); locationX = x - toLeft; if(locationX >= 0){ handler.postDelayed(ImageBack, BACK_DURATION); //回退 } }
/** * 未解锁时,图片回退 */ private Runnable ImageBack = new Runnable() { @Override public void run() { locationX = locationX - (int) (VE_HORIZONTAL*BACK_DURATION); if(locationX >= 0){ handler.postDelayed(ImageBack, BACK_DURATION); //回退 invalidate(); } } };