欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

View几种滑动的方式

程序员文章站 2022-05-05 10:06:00
...

1.layout

public class CumtomView extends View {
    private int lastX;
    private int lastY;
    public CumtomView(Context context) {
        super(context);
    }

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

    public CumtomView(Context context, @Nullable AttributeSet attrs,int defStyle) {
        super(context, attrs,defStyle);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {

        int x= (int) event.getX();
        int y= (int) event.getY();
        switch (event.getAction()){
            case MotionEvent.ACTION_DOWN:
                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;
        }
        return true;
    }
}

在onTouchEvent 的ACTION_MOVE 中计算出偏移量,在调用layout()方法。改变View的位置。

 

2.使用offsetLeftAndRight(); offsetTopAndBottom(); 方法

 

将ACTION_MOVE下的 代码替换成如下:

int offsetX= x-lastX;
int offsetY= y-lastY;
offsetLeftAndRight(offsetX);
offsetTopAndBottom(offsetY);

 

3.LayoutParams

LayoutParams 保存着View的布局参数,所以我们可以通过改变LayoutParams的参数来改变View的位置

将ACTION_MOVE下的 代码替换成如下:

int offsetX= x-lastX;
int offsetY= y-lastY;
LinearLayout.LayoutParams layoutParams= (LinearLayout.LayoutParams) getLayoutParams();
layoutParams.leftMargin=getLeft()+offsetX;
layoutParams.topMargin=getTop()+offsetY;
setLayoutParams(layoutParams);

这里需要注意的是View的父布局为LinearLayout 所以使用LinearLayout.LayoutParams ,如果View的父布为RelativeLayout 那么就得用RelativeLayout.LayoutParams

4使用属性动画

ObjectAnimator.ofFloat(cumtomView,"translationX",300).setDuration(500).start();

5.scrollBy(dx,dy), scrollTo(x,y)

scrollTo() x,y是移到一个具体的座标点 scrollBy() dx,dy表示增量,通过原码我们可以看到scrollBy()  方法中也是调用的scrollTo()

public void scrollTo(int x, int y) {
    if (mScrollX != x || mScrollY != y) {
        int oldX = mScrollX;
        int oldY = mScrollY;
        mScrollX = x;
        mScrollY = y;
        invalidateParentCaches();
        onScrollChanged(mScrollX, mScrollY, oldX, oldY);
        if (!awakenScrollBars()) {
            postInvalidateOnAnimation();
        }
    }
}

 

public void scrollBy(int x, int y) {
    scrollTo(mScrollX + x, mScrollY + y);
}

 

修ACTION_MOVE下的 代码使用scrollBy:

int offsetX= x-lastX;
int offsetY= y-lastY;
((View)getParent()).scrollBy(-offsetX,-offsetY);

修ACTION_MOVE下的 代码使用scrollTo:

((View)getParent()).scrollTo(((View)getParent()).getScrollX() -offsetX,((View)getParent()).getScrollY()-offsetY);

scrollBy(dx,dy), scrollTo(x,y) 移动的是View的内容所,在ViewGrop中移动的是子View所以我们要((View)getParent())后在去调用

 

6.Scroller 

scroller 配合computeScroll实现滑动效果