实现view滑动的几种方法

来源:互联网 发布:下滑加载商品详情 js 编辑:程序博客网 时间:2024/05/21 20:25

这里写图片描述
1使用相对坐标
int lastx = 0;
int lasty = 0;
@Override
public boolean onTouchEvent(MotionEvent event) {
//每次回到onTouch方法 都獲取触摸点的坐标
int rawX = (int) event.getX();//获取相对坐标,触摸点相对于view自身
int rawY = (int) event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
lastx = rawX;//记录触摸点的坐标
lasty = rawY;
break;
case MotionEvent.ACTION_MOVE:
int dx = rawX - lastx;//当前的减去上一次的x的坐标
int dy = rawY - lasty;
layout(dx + getLeft(), dy + getTop(), dx + getRight(), dy + getBottom());
break;
case MotionEvent.ACTION_UP:
break;
}
return true;
}
2使用绝对坐标
@Override
public boolean onTouchEvent(MotionEvent event) {
//每次回到onTouch方法 都獲取触摸点的坐标
int rawX = (int)(event.getRawX());//获取绝对坐标
int rawY = (int)(event.getRawY());
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
lastx = rawX;//记录触摸点的坐标
lasty = rawY;
break;
case MotionEvent.ACTION_MOVE:
int dx = rawX - lastx;//当前的减去上一次的x的坐标
int dy = rawY - lasty;
//layout(dx + getLeft(), dy + getTop(), dx + getRight(), dy + getBottom());
offsetLeftAndRight(dx);
offsetTopAndBottom(dy);//系统提供一个封装的api等同于layout
lastx=rawX;//从新设置初始坐标
lasty=rawY;
break;
case MotionEvent.ACTION_UP:
break;
}
return true;
}
3使用布局参数
@Override
public boolean onTouchEvent(MotionEvent event) {
//每次回到onTouch方法 都獲取触摸点的坐标
int rawX = (int)(event.getRawX());//获取绝对坐标
int rawY = (int)(event.getRawY());
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
lastx = rawX;//记录触摸点的坐标
lasty = rawY;
break;
case MotionEvent.ACTION_MOVE:
int dx = rawX - lastx;//当前的减去上一次的x的坐标
int dy = rawY - lasty;
//layoutParams保存了一个veiw的布局参数动态的修改view的布局参数从而达到改变view的位置
//margin是外边距 所以必须有个父布局才能获得布局参数
ViewGroup.MarginLayoutParams layoutParams= (ViewGroup.MarginLayoutParams) getLayoutParams();
layoutParams.leftMargin=dx+getLeft();
layoutParams.rightMargin=dx+getRight();
layoutParams.topMargin=dy+getTop();
layoutParams.bottomMargin=dy+getBottom();
setLayoutParams(layoutParams);
lastx=rawX;//从新设置初始坐标
lasty=rawY;
break;
case MotionEvent.ACTION_UP:
break;
}
return true;
}
4使用scrollBy方法
@Override
public boolean onTouchEvent(MotionEvent event) {
//每次回到onTouch方法 都獲取触摸点的坐标
int rawX = (int)(event.getX());//获取绝对坐标
int rawY = (int)(event.getY());
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
lastx = rawX;//记录触摸点的坐标
lasty = rawY;
break;
case MotionEvent.ACTION_MOVE:
int dx = rawX - lastx;//当前的减去上一次的x的坐标
int dy = rawY - lasty;
//不能直接在view中使用,在view中使用表示移动view中的内容
//必须使用viewGroup的scrollby方法 父布局来回移动增量x,y,
子view反方向移动,为了达到view移动的效果
//增量取负值
((View)getParent()).scrollBy(-dx,-dy);
break;
case MotionEvent.ACTION_UP:
break;
}
return true;
}
5使用Scroller类
@Override
public boolean onTouchEvent(MotionEvent event) {
//每次回到onTouch方法 都獲取触摸点的坐标
int rawX = (int)(event.getX());//获取绝对坐标
int rawY = (int)(event.getY());
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
lastx = rawX;//记录触摸点的坐标
lasty = rawY;
break;
case MotionEvent.ACTION_MOVE:
break;
case MotionEvent.ACTION_UP:
View parent = (View) getParent();
msroller.startScroll(parent.getScrollX(),
parent.getScrollY(),- parent.getScrollX(),-parent.getScrollY());
invalidate();
break;
}
return true;
//重写veiw的computeScrll方法
@Override
public void computeScroll() {
super.computeScroll();
if(msroller.computeScrollOffset()){
//获取view的父布局veiwgroup
((View)getParent()).scrollTo(msroller.getCurrX(),msroller.getCurrY());
//只能在computescroll方法中获取到scrolx和scrolly坐标
但是computeScroll方法不会自动调用
//只能通过invalidate()-draw()-computeScroll()来间接调用computrsroll()方法
//通过不断的绘制来调用computeScroll
invalidate();
}
}

0 0
原创粉丝点击