仿微信滑动退出
以下是实现顺序
- 实现从左侧拖动整个View,并让整个View随着手指头移动
- 实现释放后平滑回到原地或滑出屏幕,并Finish当前Activity
- 实现双指触发和左侧边缘触发
- 添加滑动监听
- 添加阴影效果
- 添加自定义属性
转载请注明出处 http://blog.csdn.net/BalckSeven/article/details/51118534
【来自BlackSeven的CSDN博客】
1.实现从左侧拖动整个View,并让整个View随着手指头移动
我们知道在android window的最外层view被称之为decorview,它是window外层的容器,它的下面才是我们自己写的XML文件里的RootView。DecorView是一个FrameLayout,因此我们能通过滑动FrameLayout来实现View的滑动。
首先,我们选择继承常用的Layout来实现我们的DragFinishLayout,这里我选择RelativeLayout。并重写它的第二个构造函数。定义一个名为parent的FrameLayout作为decorview的引用。
public class DragFinishLayout extends RelativeLayout{
private FrameLayout parent;
public DragFinishLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
}
之后重写OnTouchEvent。
private int oldX;
@Override
public boolean onTouchEvent(MotionEvent event) {
int action = event.getAction();
int moveX = 0;
switch (action) {
case MotionEvent.ACTION_DOWN:
oldX = (int) event.getRawX();
break;
case MotionEvent.ACTION_MOVE:
moveX = (int) event.getRawX() - oldX;
doDragging(moveX);
break;
case MotionEvent.ACTION_UP:
if (isDragging) {
releaseDrag();
}
break;
}
return true;
}
之所以在ontouch里面初始化parent,是因为在构造函数里是取不到的,只有Activity setContentView 将XML文件 inflate出来以后,我们才能取到这个decorview,因此我选择在onTouchEvent里获取。
doDragging(moveX)拖拽的处理方法,releaseDrag()则是拖拽释放后的方法。
下面是doDragging的实现
private void doDragging(int dx) {
if (!isDragging && dx < 0) {
return;
}
isDra