开局一张图,先看看是不是想要的效果
没错,今天就要实现这种效果,首先,可以看出来,这个效果是由两部分组成的,滑动的view以及背景view.重点就是滑动的View,并且分两种情况,当滑动距离超过一半时,则顺势滑下去,没有超过一半,则回弹到初始位置。
对于View跟随手势去滑动,当然是ViewDragHelper是比较合适的。我对这个类我也是第一次用,里面还有很多东西没有理解,只是简单的去运用。主要是自定义View继承自LinearLayout.
贴代码,不多BB,看会应该都能懂。
public class SlideRightViewDragHelper extends LinearLayout {
private ViewDragHelper viewDragHelper;
private View child;
private Point childPosition = new Point();
private Point childEndPosition = new Point();
private OnReleasedListener onReleasedListener;
private int oldX;
public SlideRightViewDragHelper(Context context, AttributeSet attrs) {
super(context, attrs);
}
public void setTouchable(boolean isTouch) {
if (isTouch) {
//新建viewDragHelper ,viewGroup, 灵敏度,回调(子view的移动)
viewDragHelper = ViewDragHelper.create(this, 1.0f, new ViewDragHelper.Callback() {
@Override
public boolean tryCaptureView(View child, int pointerId) {
oldX = 0;
return true;
}
@Override
public int clampViewPositionHorizontal(View child, int left, int dx) {
oldX = left;
return Math.max(0, left);
}
@Override
public void onViewReleased(View releasedChild, float xvel, float yvel) {
if (oldX > getWidth() / 2) {
/*
*之所以没这么写,是因为在滑到最右边之后,滑动的View就会被释放,我通过layout方法无法将view设置
*为复原,然后我必须又要把view在移回最左边,但无法实现向右顺势滑动的效果,反正达不到预期的效果,
*后来就自己写了个位移动画,最终实现了想要的效果。
*/
// viewDragHelper.settleCapturedViewAt(childEndPosition.x, childEndPosition.y);
// invalidate(); //必须刷新,因为其内部使用的是mScroller.startScroll,所以别忘了需要invalidate()以及结合computeScroll方法一起。
// if (onReleasedListener != null) {
// child.layout(childPosition.x, childPosition.y, getWidth(), getHeight());
// viewDragHelper.settleCapturedViewAt(childPosition.x, childPosition.y); //反弹
// onReleasedListener.onReleased();
// }
TranslateAnimation translateAni