一、手势滑动
1.我们需要根据滑动手势做界面跳转,GestureDetector封装了可以监听不同手势的方法。这个方法在哪个Activity中使用,这个Activity就能监听这个Activity接收的动作,在这些方法里可以重写需要的动作。
private GestureDetector gestureDetector;// 声明成员变量
GestureDetector
gestureDetector = new GestureDetector(this, new OnGestureListener(){
@Override
public boolean onDown(MotionEvent e) {
// 按下
return false;
}
@Override
public void onShowPress(MotionEvent e) {
// TODO Auto-generated method stub
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
// 点击
return false;
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
// 滑动
return false;
}
@Override
public void onLongPress(MotionEvent e) {
// 长按
}
/**
*onFling为滑动手势, e1为起点坐标,e2为终点坐标
*在这里消费掉event事件,重写其中的方法以达到需求。
/
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2,float velocityX, float velocityY) {
if(Math.abs(e1.getRawY()-e2.getRawY())>200){
Toast.makeText(getApplicationContext(), "不能斜着滑动", 2000).show();
}
if(Math.abs(velocityX)<200 ||Math.abs(velocityY)<200){
Toast.makeText(getApplicationContext(), "滑动的太慢了,请滑快点", 2000).show();
}
//沿X轴水平滑动
if(e1.getRawX()-e2.getRawX()>200){
flingnextpage();//向左滑
}else if(e2.getRawX()-e1.getRawX()>200){
flingpreviouspage();//向右滑
}
return true;
}
});
上面的代码可以用下面的方便类SimpleOnGestureListener来替代,因为它实现了OnGestureListener接口中的所有方法。
gestureDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2,
float velocityX, float velocityY) {
if (Math.abs(e1.getRawY() - e2.getRawY()) > 200) {
Toast.makeText(getApplicationContext(), "不能斜着滑动",
2000).show();
}
if (Math.abs(velocityX) < 200
|| Math.abs(velocityY) < 200) {
Toast.makeText(getApplicationContext(),
"滑动的太慢了,请滑快点", 2000).show();
}
// X轴坐标
if (e1.getRawX() - e2.getRawX() > 200) {
flingnextpage();// 向左滑
} else if (e2.getRawX() - e1.getRawX() > 200) {
flingpreviouspage();// 向右滑
}
return true;
}
});
2.Activity都具有响应触摸事件,也就是说只要触摸Activity,他都会回调一个onTouchEvent()方法。但是在这个方法里无法处理事件,需要配合使用手势识别器(GestureDetector)中的方法onTouchEvent对事件(event)进行分析处理,我们只需要重写这个方法中的操作来达到我们的需求。
/**
* 如果这个onTouchEvent(MotionEvent event)方法消费了这个event事件,就返回True,否则false。
* Activity 被触摸后,会回调此方法onTouchEvent,并回传一个event对象
* MotionEvent event 对象封装了触摸时的动作信息,包括x、y坐标等等信息
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
gestureDetector.onTouchEvent(event);//这句话的作用:分析了运动事件,相关的触发提供对应的回调(如上onFling方法)。
return super.onTouchEvent(event);//当触摸屏事件没有被它下面的任何视图处理时才调用这个方法。对于处理发生在窗口边界以外的地方的触摸事件,这是最有用的,因为在那些地方没有view接收这些触摸事件。
}
注:页面坐标
二、简单动画
目的:用XML文件写一个Activity跳转页面的过渡动画。
1. 在res目录下新建anim文件夹,创建两个xml文件并编辑动画动作,一个是进入动作,另一个退出动作。
(1)在anim_next_in.xml中写好进入动作。
<?xml version="1.0" encoding="utf-8"?>
<translate
android:fromXDelta="100%p" <!—当前界面的右侧界面,从右侧滑入当前界面-->
android:toXDelta="0"
android:duration="100" <!--移动时间-->
xmlns:android="http://schemas.android.com/apk/res/android">
</translate>
(2)在anim_next_out.xml中写好退出动作。
<?xml version="1.0" encoding="utf-8"?>
<translate
android:fromXDelta="0" <!—当前界面向左滑出-->
android:toXDelta="-100%p"
android:duration="100"
xmlns:android="http://schemas.android.com/apk/res/android">
</translate>
2.在需要添加手势滑动功能的Activity界面,调用overridePendingTransition方法,可以使此界面实现平移动画。
/**
* overridePendingTransition(int enterAnim, int exitAnim)
* enterAnim为进入当前界面的动画资源ID, exitAnim为退出当前界面的动画资源ID
/
@Override
public void flingnextpage() {
// TODO Auto-generated method stub
startActivity(new Intent(this, NewActivity.class));
overridePendingTransition(R.anim.anim_next_in, R.anim.anim_next_out);
finish();//关闭当前界面
}