实现View滑动的几种方式

public class DragView1 extends View {

private int lastX;
private int lastY;

public DragView1(Context context) {
    super(context);
}

public DragView1(Context context, @Nullable AttributeSet attrs) {
    super(context, attrs);
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    //保存当前手指触摸点距离View左边缘的距离
    int x = (int) event.getX();
    //保存当前手指触摸点距离View上边缘的距离
    int y = (int) event.getY();
    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            //保存第一次触摸的 x y坐标
            lastX = x;
            lastY = y;
            break;
        case MotionEvent.ACTION_MOVE:
            //计算偏移量重新布局
            int offsetX = x - lastX;
            int offsetY = y - lastY;
            layout(getLeft() + offsetX, getTop() + offsetY, getRight() + offsetX, getBottom() + offsetY);
            break;
        case MotionEvent.ACTION_UP:
            break;
    }
    return true;
}
} 
public class DragView2 extends View {

private int lastX;
private int lastY;

public DragView2(Context context) {
    super(context);
}

public DragView2(Context context, @Nullable AttributeSet attrs) {
    super(context, attrs);
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    //保存当前手指触摸点距离屏幕左边缘的距离
    int rawX = (int) event.getRawX();
    //保存当前手指触摸点距离屏幕上边缘的距离
    int rawY = (int) event.getRawY();
    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            //保存第一次触摸的 x y坐标
            lastX = rawX;
            lastY = rawY;
            break;
        case MotionEvent.ACTION_MOVE:
            //计算偏移量重新布局
            int offsetX = rawX - lastX;
            int offsetY = rawY - lastY;
            layout(getLeft() + offsetX, getTop() + offsetY, getRight() + offsetX, getBottom() + offsetY);
            lastX = rawX;
            lastY = rawY;
            break;
        case MotionEvent.ACTION_UP:
            break;
    }
    return true;
}
} 
public class DragView3 extends View {

private int lastX;
private int lastY;

public DragView3(Context context) {
    super(context);
}

public DragView3(Context context, @Nullable AttributeSet attrs) {
    super(context, attrs);
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    //保存当前手指触摸点距离屏幕左边缘的距离
    int rawX = (int) event.getRawX();
    //保存当前手指触摸点距离屏幕上边缘的距离
    int rawY = (int) event.getRawY();
    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            //保存第一次触摸的 x y坐标
            lastX = rawX;
            lastY = rawY;
            break;
        case MotionEvent.ACTION_MOVE:
            //计算偏移量重新布局
            int offsetX = rawX - lastX;
            int offsetY = rawY - lastY;
            // 使用offsetLeftAndRight和offsetTopAndBottom相当于同时对左右和上下进行了偏移
            offsetLeftAndRight(offsetX);
            offsetTopAndBottom(offsetY);
            lastX = rawX;
            lastY = rawY;
            break;
        case MotionEvent.ACTION_UP:
            break;
    }
    return true;
}
}
public class DragView4 extends View {

private int lastX;
private int lastY;

public DragView4(Context context) {
    super(context);
}

public DragView4(Context context, @Nullable AttributeSet attrs) {
    super(context, attrs);
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    //保存当前手指触摸点距离屏幕左边缘的距离
    int rawX = (int) event.getRawX();
    //保存当前手指触摸点距离屏幕上边缘的距离
    int rawY = (int) event.getRawY();
    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            //保存第一次触摸的 x y坐标
            lastX = rawX;
            lastY = rawY;
            break;
        case MotionEvent.ACTION_MOVE:
            //计算偏移量重新布局
            int offsetX = rawX - lastX;
            int offsetY = rawY - lastY;
            //通过改变布局参数的方式来实现View的滑动
            LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) getLayoutParams();
            layoutParams.leftMargin = getLeft() + offsetX;
            layoutParams.topMargin = getTop() + offsetY;
            setLayoutParams(layoutParams);
            lastX = rawX;
            lastY = rawY;
            break;
        case MotionEvent.ACTION_UP:
            break;
    }
    return true;
}
} 
public class DragView5 extends View {

private int lastX;
private int lastY;

public DragView5(Context context) {
    super(context);
}

public DragView5(Context context, @Nullable AttributeSet attrs) {
    super(context, attrs);
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    //保存当前手指触摸点距离屏幕左边缘的距离
    int x = (int) event.getRawX();
    //保存当前手指触摸点距离屏幕上边缘的距离
    int y = (int) event.getRawY();
    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            //保存第一次触摸的 x y坐标
            lastX = x;
            lastY = y;
            break;
        case MotionEvent.ACTION_MOVE:

            int offsetX = x - lastX;
            int offsetY = y - lastY;
            ((View) getParent()).scrollBy(-offsetX, -offsetY);
            lastX = x;
            lastY = y;
            break;
        case MotionEvent.ACTION_UP:
            break;
    }

    return true;
}
}
public class DragView6 extends View {

private int lastX;
private int lastY;
private Scroller scroller;

public DragView6(Context context) {
    super(context);
    initView(context);
}

public DragView6(Context context, @Nullable AttributeSet attrs) {
    super(context, attrs);
    initView(context);
}


@Override
public void computeScroll() {
    super.computeScroll();
    if (scroller.computeScrollOffset()) {
        ((View) getParent()).scrollTo(scroller.getCurrX(), scroller.getCurrY());
        invalidate();
    }
}

private void initView(Context context){
    scroller = new Scroller(context);
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    //保存当前手指触摸点距离屏幕左边缘的距离
    int x = (int) event.getRawX();
    //保存当前手指触摸点距离屏幕上边缘的距离
    int y = (int) event.getRawY();
    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            //保存第一次触摸的 x y坐标
            lastX = x;
            lastY = y;
            break;
        case MotionEvent.ACTION_MOVE:

            int offsetX = x - lastX;
            int offsetY = y - lastY;
            ((View) getParent()).scrollBy(-offsetX, -offsetY);
            lastX = x;
            lastY = y;
            break;
        case MotionEvent.ACTION_UP:
            View viewGroup = ((View) getParent());
            scroller.startScroll(
                    viewGroup.getScrollX(),
                    viewGroup.getScrollY(),
                    -viewGroup.getScrollX(),
                    -viewGroup.getScrollY());
            invalidate();
            break;
    }

    return true;
}
}

猜你喜欢

转载自blog.csdn.net/ku_tengfei/article/details/79061927