实现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();
}
}
- 实现View 滑动的几种方法
- 实现view滑动的几种方法
- View弹性滑动的几种实现方法
- 【Android View事件(四)】View滑动与实现滑动的几种方法
- android view滑动的几种方法
- View的几个基本位置属性和滑动效果的几种实现方法
- 实现View滑动的3种方法
- 实现View滑动的七种方法
- 实现滑动的几种方法
- 实现滑动的几种简单方法
- Android实现滑动的几种方法
- Android中实现View滑动的几种方式
- Android 实现View滑动几种方式
- View滑动的几种方式
- view 本身滑动的几种方式
- View的几种滑动方式
- android view实现滑动的六种方法
- Android实现View滑动的五种方法
- C#之语言概述
- EditText组件drawableLeft属性设置的图片和hint设置的文字之间的距离
- 计算你恋爱谈了多长时间
- 主动学习,半监督学习,直推式学习
- 4.Median of Two Sorted Arrays
- 实现view滑动的几种方法
- java 堆排序
- 【C】模拟三次密码输入的场景
- 跨域的几种解决方法
- 最简单的React和Redux整合的例子
- 三.Mavne插件
- kibana学习和坑
- bzoj 3963: [WF2011]MachineWorks (DP+CDQ分治)
- 四.Mavne的测试