记录一下做过很多次,但是也忘了很多次的很简单的自定义View:跟随手指滑动,手指抬起后自动贴边:
public class MoveView extends View { private float offsetX; private float offsetY; float moveX = 0 ; float moveY = 0 ; private String TAG="MoveView"; public MoveView(Context context) { super(context); } public MoveView(Context context, AttributeSet attrs) { super(context, attrs); } public MoveView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()){ case MotionEvent.ACTION_DOWN: moveX = event.getRawX(); moveY = event.getRawY(); Log.e(TAG, "ACTION_DOWN---moveX=: "+moveX+"--moveY="+moveY ); return true; case MotionEvent.ACTION_MOVE: offsetX= (event.getRawX()-moveX); offsetY= (event.getRawY()-moveY); Log.e(TAG, "ACTION_MOVE---offsetX=: "+offsetX+"--offsetY="+offsetY ); // offsetLeftAndRight((int) offsetX); // offsetTopAndBottom((int) offsetY); layout(getLeft()+(int)offsetX,getTop()+(int)offsetY, getRight()+(int)offsetX,getBottom()+(int)offsetY); moveX=event.getRawX(); moveY=event.getRawY(); return true; case MotionEvent.ACTION_UP: ViewGroup mViewGroup = (ViewGroup) getParent(); int measuredWidth = mViewGroup.getMeasuredWidth();//父布局宽度 int centerX =getLeft() + getWidth() / 2; if (centerX>= measuredWidth/2 ){ Log.e(TAG, "onTouchEvent: 向右贴边" ); //向右贴边 MoveView.this.animate() .setInterpolator(new BounceInterpolator()) .setDuration(500) .x(measuredWidth - getWidth()) .start(); }else { //向左 Log.e(TAG, "onTouchEvent: 向左贴边" ); MoveView.this.animate() .setInterpolator(new BounceInterpolator()) .setDuration(500) .x(0) .start(); } break; } return super.onTouchEvent(event); } }
注释部分的代码效果相同