本文是《Android群英传》的读书笔记
滑动效果是如何产生的?
不断的改变View的坐标
Android坐标系:
将屏幕最左上角的定点作为Android坐标原点。
Android坐标系视图坐标系:
以父视图左上角为坐标原点。
视图坐标系触控事件——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;
获取触控时间的类型:(模式基本固定)
获取触控时间的类型获取坐标值的各种方法:
获取坐标值的各种方法View提供的获取坐标方法:
getTop():获取到的是View 自身的顶边到其父布局顶边的距离
getLeft():获取到的是View自身的左边到其父布局左边的距离
getRight():获取到的是View 自身的右边到其父布局左边的距离
getBottom():获取到的是View自身的底边到其父布局顶边的距离
MotionEvent提供的方法:
getX():获取点击事件距离控件左边的距离,即视图坐标
getY():获取点击事件距离控件顶部的距离,
即视图坐标
getRawX():获取点击事件距离整个屏幕左边的距离,即绝对坐标
getRawY():获取点击事件距离整个屏幕顶边的距离,即绝对坐标
实现滑动的方式
布局1、创建DragView自定义View控件,继承View。
2、初始化构造方法。
3、重写onTouchEvent(MotionEvent event)方法
方法1:重写layout()方法 方法2:直接移动左右和上下的偏移量 方法3:通过改变左外边距和上外边距的参数,改变位置 方法4:通过改变左外边距和上外边距的参数,改变位置 方法5:通过scrollBy方法改变位置scrollTo与scrollBy:
scrollTo(x,y):表示移动到一个具体的坐标点(x,y)。
scrollBy(dx,dy):表示移动的增量为dx、dy。
这两个方法移动的是View 的content,即让View 的内容移动,如果在ViewGroup中使用scrollTo、scrollBy方法,那么移动的是所有子View,但如果在View中使用,那么移动的将是View的内容,例如TextView,content就是它的文本;ImageView,content就是它的drawable对象。
中间的矩形相当于屏幕,即可是区域。后面的content就相当于画布,代表视图。大家可以看到,只有视图的中间部分是可视的,其他部分都不可见。在可见区域中,我们设置了一个Button,它的坐标为(20,10)。
下面使用scrollBy方法,将盖板(屏幕,可视区域),在水平方向上向X轴正方向(右方)平移20,在数值方向上向Y轴正方向(下方)平移10,那么平移之后的可视区域如图。
我们可以发信啊,虽然设置scrollBy(20,10),偏移量均为X轴、Y轴正方向上的正数,但是在屏幕的可视区域内,Button却向X轴、Y轴负方向上移动了。这就是因为参考系选择的不同,而产生的不同效果。
Scroller:
可以实现平滑移动的效果,而不再是瞬间完成的移动。
Demo:同样让子View跟随手指的滑动而滑动,但是在手指离开屏幕时,让子View平滑的移动到初始位置,即屏幕左上角。
代码:
1、通过自定义View的构造方法创建一个Scroller对象。
。2、重写computeScroll()方法,实现模拟滑动。
3、startScroll开启模拟过程:
在onTouchEvent(MotionEvent event)中public void startScroll(int startX,int startY,int dx,int dy,int duration)
public void startScroll(int startX,int startY,int dx,int dy)
网友评论