layout()方式
layout用于布局控件用的,那么它也可以实现view位置的变化。
layout(l,t,r,b) 这几个值可以这样理解 l t 就是view左上角的xy轴,rb就是右下角的xy轴。
case MotionEvent.ACTION_MOVE:
//计算移动的距离
int offsetX = x - lastX;
int offsetY = y - lastY;
//调用layout方法来重新放置它的位置
layout(getLeft()+offsetX, getTop()+offsetY,getRight()+offsetX , getBottom()+offsetY);
break;
offsetLeftAndRight offsetTopAndBottom
代替了
layout(getLeft()+offsetX, getTop()+offsetY,getRight()+offsetX , getBottom()+offsetY);
直接把偏移值传入方法
case MotionEvent.ACTION_MOVE:
//计算移动的距离
int offsetX = x - lastX;
int offsetY = y - lastY;
//对left和right进行偏移
offsetLeftAndRight(offsetX);
//对top和bottom进行偏移
offsetTopAndBottom(offsetY);
break;
LayoutParams(改变布局参数)
LinearLayout.LayoutParams layoutParams= (LinearLayout.LayoutParams) getLayoutParams();
layoutParams.leftMargin = getLeft() + offsetX;
layoutParams.topMargin = getTop() + offsetY;
setLayoutParams(layoutParams)
动画
利用动画属性也可以实现view的滑动
scollTo与scollBy
scollBy内部也是调用的scollTo,scollBy是相对于当前的位置进行移动,scollTo是相对于初始化的坐标进行移动 注意这个滑动是滑动当前view内的整个内容 如果想滑动自己可以通过以下代码操作
View viewGroup = (View) getParent();
((View) getParent()).scrollBy(0, offsetY);
viewGroup.getScrollY X() 滑动后距离初始坐标的值
-值是往左或者底部移动
+值是往右或者顶部移动
Scroller
我们用scollTo/scollBy方法来进行滑动时,这个过程是瞬间完成的,所以用户体验不大好。这里我们可以使用Scroller来实现有过度效果的滑动,这个过程不是瞬间完成的,而是在一定的时间间隔完成的。Scroller本身是不能实现View的滑动的,它需要配合View的computeScroll()方法才能弹性滑动的效果。
在这里我们实现CustomView平滑的向右移动
首先我们要初始化Scroller
public CustomView(Context context, AttributeSet attrs) {
super(context, attrs);
mScroller = new Scroller(context);
}
重要的二个方法
- computeScroll()
- startScroll(int startX, int startY, int dx, int dy, int duration)
computeScroll()方法,是调用onDraw中调用的,invalidate可以触发
@Override
public void computeScroll() {
super.computeScroll();
if(mScroller.computeScrollOffset()){
((View) getParent()).scrollTo(mScroller.getCurrX(),mScroller.getCurrY());
//通过不断的重绘不断的调用computeScroll方法
invalidate();
}
}
------
//触发代码
mScroller.startScroll(0, 0, 12,12, 1000);
invalidate();
computeScrollOffset是判断是否有执行动画
mScroller.getCurrX()获取递增后递减的偏移值
startScroll(int startX, int startY, int dx, int dy, int duration)
startX startY(开始的偏移坐标) dx dy(结束的偏移坐标) duration(执行的时长)
网友评论