读Android群英传第五章

来源:互联网 发布:虚拟机运行mac os x慢 编辑:程序博客网 时间:2024/04/30 09:19

Android Scroll 分析

5.1.1 Android的坐标系 如何获取Android坐标系点的位置?
通过系统提供的getLocationOnScreen(int location[]);

5.1.2 getX()、getY()、getRawX()、getRawY()
getRawX()、getRawY()主要是获取在android坐标系的坐标 getX()、getY()主要是获取在视图坐标系的坐标

5.1.3 触控事件–MotionEvent

(1) MotionEvent 中封装的一些常用的时间常量

// 单点触摸按下动作public static final int ACTION_DOWN = 0;// 单点触摸离开动作public static final int ACTION_UP = 1;// 触摸点移动动作public static final int ACTION_MOVE = 2;// 触摸动作取消public static final int ACTION_CANCEL = 3;// 触摸动作超出边界public static final int     ACTION_OUTSIDE = 4;// 多点触摸按下动作public static final int ACTION_POINTER_DOWN = 5;// 多点离开动作public static final int ACTION_POINTER_UP = 6;

(2) 一般情况下在onTouchEvent(MotionEvent e)的固定模板

public boolean onTouchEvent(MotionEvent e){    int x = (int)e.getX();    int y = (int)e.getY();    switch(e.getAction()){        case MotionEvent.ACTION_DOWN:        break;        case MotionEvent.ACTION_MOVE:        break;        case MotionEvent.ACTION_UP:        break;        default:        break;    }    return true;}

(3) View 提供的 getTop()、getBottom、getLeft()、getRight()
这些方法表示的含义:该View到父View的上下左右的距离

5.2 实现滑动的七种方法

第一种:通过调用layout方法
其中书中有俩个例子,刚开始没敲代码时看的不是很明白后来发现使用getRawX()、getRawY()需要每次MOVE的时候进行初始化而在使用 getX()、getY()确不需要是因为getX()和getY()的坐标系也是在随着滑动在改变,然而getRawX()和getRawY()的坐标系是固定的。

第二种:通过offsetLeftAndRight(offsetX)与offsetTopAndBottom(offsetY)
其中offsetX和offsetY分别是左右和上下的偏移量

第三种:通过LayoutParams布局参数
其中我们需要主要的是如果该View的父View是哪个ViewGroup,那我们的LayoutParams就对应着父View的LayoutParams
比如我们的父View是LinearLayout那么我们的LayoutParams就是LinearLayout.LayoutParams。
获取LayoutParams对象:通过getLayoutParams()方法
示例:
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams)getLayoutParams();
params.leftMargin = getLeft() + offsetX;
params.topMargin = getTop() +offsetY;
setLayoutParams(params);

第四种:通过ScrollTo()和ScrollBy() 我们需要注意的是这个移动的参照物是画布,移动的是手机屏幕,即屏幕在画布上移动。所以在我们使用这俩个方法的时候发现手指移动,方块移动的方向是相反的。结局办法就是 设置成相反值。

第五种:通过Scroller
由于通过ScrollTo()和ScrollBy()这些方法使View移动是瞬间的,没有什么过渡效果,给人一种很突兀的感觉。
然而Scroller就可以实现平滑的移动。
使用示例:
重写computeScroll()

public void computeScroll(){    super.computeScroll();    // 判断Scroller是否执行完毕    if(mScroller.computeScrollOffset()){                       ((View)getParent()).scrollTo(mScroller.getCurrX(),mScroller.getCurrY());        invalidate();    }}

在我们需要使用平滑移动的事件中使用Scrller类的startScroll()开启平滑移动过程。
public void startScroll(int StartX, int StartY, int dx, int dy, int duration);
public void startScroll(int StartX, int StartY, int dx, int dy);

case MotionEvent.ACTION_UP:
View viewGroup = (View)getParent();
mScroller.startScroll(viewGroup.getScrollX(),viewGroup.getScrollY(),-offsetX,-offsetY);
invalidate();
break;

第六种:属性动画

第七种:通过ViewDragHelper

0 0
原创粉丝点击