导语
滑动算是Android比较常用的效果了,滑动的操作具有很好的用户体验性。
主要内容
- 滑动效果是如何产生的
- 实现滑动的七种常用方法
具体内容
滑动效果是如何产生的
滑动一个View的本质其实就是移动一个View,改变其当前所在的位置,它的原理和动画效果十分的相似,就是通过不断的改变View的坐标来实现这一效果,动态且不断的改变View的坐标,从而实现View跟随用户触摸滑动而滑动。
但是在讲解滑动效果之前,需要先了解一下Android中窗口坐标体系和屏幕的触控事件——MotionEvent。
Android坐标系
在物理学上,要描述一个物体的运动,就必须选定一个参考系,所谓滑动,正是相对于参考系的运动,在Android,系统将屏幕最左上角的顶点作为Android坐标系的原点,从这个点向右是X轴正方向,从这个点向下是Y轴正方向,如下图所示。
系统提供了getLocationOnScreen(intlocation[])来获取Android坐标中的位置,即该视图左上角Android的坐标,另外,在触摸事件中使用getRawX(),getRawY()方法来获取坐标同样是Android坐标系中的坐标。
视图坐标系
Android中除了上面所说的这种坐标系之外们还有一个视图坐标系,他描述了子视图在父视图的位置关系,这两个坐标系并不复杂也不矛盾,他们的作用是相辅相成的,与Android坐标系类似,视图坐标系同样的以原点向右为X正方向,以原点向下为Y方法,只不过在视图坐标系中,原点不再是Android坐标系中的屏幕左上角,而是以父视图左上角为坐标原点,如下图所示。
在触控事件中通过getX,getY来获取的坐标就是视图坐标中的坐标。
触控事件——MotionEvent
触控事件MotionEvent在用户的交互中,占着举足轻重的位置,学好触控事件是掌握后续内容的基础,首先,我们来看看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;
通常情况下,我们会在onTouchEvent(MotionEvent event)方法中通过event.getAction()来获取触摸事件的类型,并使用switch来判断,这个代码模块是固定的。
@Override
public boolean onTouchEvent(MotionEvent event) {
//获取当前输入点的X,Y坐标(视图坐标)
int x = (int) event.getX();
int y = (int) event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
//处理输入的按下动作
break;
case MotionEvent.ACTION_MOVE:
//处理输入的移动动作
break;
case MotionEvent.ACTION_UP:
//处理输入的离开动作
break;
}
return true;
}
在不涉及多点触控的前提下,通常可以使用以上代码来完成触摸事件的监听,不过这里只是一个代码模块,后面我们会讲具体的逻辑的。
Android获取坐标的方法
在Android中,系统提供了非常多的方法来获取坐标值,相对距离等,方法丰富固然好,但也给初学者带来了很多的困扰,不知道在什么情况下使用下图总结人一下一些常用的API。
这些方法可以分成两个类别:
- View提供的获取坐标方法:
- getTop():获取到的是View自身的顶部到其父布局顶部的距离。
- getLeft():获取到的是View自身的左边到其父布局左边的距离。
- getRight():获取到的是View自身的右边到其父布局左边的距离。
- getBottom():获取到的是View自身的底部到其父布局顶部的距离。
- MotionEvent提供的方法:
- getX():获取点击事件距离控件左边的距离,即视图坐标。
- getY():获取点击事件距离控件顶部的距离,即视图坐标。
- getRawX:获取点击事件整个屏幕左边的距离,即绝对坐标。
- getRawY:获取点击事件整个屏幕顶部的距离,即绝对坐标。
实现滑动的七种方法
当了解了Android坐标系和触控事件之后,我们再来看一看如何使用系统提供的API来实现动态的修改一个View的坐标,即滑动效果,而不管采用哪种方式,其实现的思路基本上是一样的,当触摸View的时候,系统几下View的坐标,从而获得到相对于之前坐标的偏移量,并通过偏移量来修改View的坐标,这样不断的重复就实现了滑动的过程。
下面通过实例来看看Android中该如何实现滑动效果。定义一个View,并置于一个LinearLayout中,实现一个简单的布局,代码如下所示。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.lgl.scrollviewdemo.DragView
android:layout_width="100dp"
android:layout_height="100dp" />
</RelativeLayout>
默认的显示样子如下图所示。