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实现滑动效果