Android 作为一个可以触摸操作的系统,必然会有对触摸屏的一些操作.
平常的手指按下,移动,抬起,长按等等可以直接在VIew或者Activity中重写onTouchEvent函数即可
但是要获取手指移动后的速度就必须借助一个类了:GestureDetector,废话少说,直接上DEMO,小小标记,呵呵
主要的Activity文件: TestGestureDetectorActivity.java
package ashy.earl.gestureDetector;
import android.app.Activity;
import android.os.Bundle;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.widget.RelativeLayout;
public class TestGestureDetectorActivity extends Activity {
private GestureDetector gestureDetector;
public RelativeLayout relativeLayout1, relativeLayout2;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
this.relativeLayout1 = (RelativeLayout) findViewById(R.id.relativeLayout1);
this.relativeLayout2 = (RelativeLayout) findViewById(R.id.relativeLayout2);
this.gestureDetector = new GestureDetector(this, new EarlGesture(this));
}
// called automatically, any screen action will Triggered it
public boolean onTouchEvent(MotionEvent event) {
if (gestureDetector.onTouchEvent(event))
return true;
else
return false;
}
}
其中的EarlGesture手势监听器
package ashy.earl.gestureDetector;
import android.util.Log;
import android.view.MotionEvent;
import android.view.GestureDetector.OnGestureListener;
import android.view.View;
import android.view.animation.AnimationUtils;
public class EarlGesture implements OnGestureListener {
private TestGestureDetectorActivity activity;
private static final int MAX_Y_DISTANCE = 100;
private static final int MIN_X_DISTANCE = 100;
private static final int MIN_X_VELOCITY = 100;
public EarlGesture(TestGestureDetectorActivity testGestureDetectorActivity) {
this.activity = testGestureDetectorActivity;
}
/**
* 手指按下,其他的事件都只会在该事件之后被触发 由1个MotionEvent ACTION_DOWN触发
*/
@Override
public boolean onDown(MotionEvent e) {
Log.i("EarlGesture", "onDown:" + e.getAction());
return false;
}
/**
* 轻触触摸屏,尚未松开或拖动 由一个1个MotionEvent ACTION_DOWN触发
* 注意和onDown()的区别,强调的是没有松开或者拖动的状态
*/
@Override
public void onShowPress(MotionEvent e) {
Log.i("EarlGesture", "onShowPress:" + e.getAction());
}
/**
* 单击屏幕,快速按下以后松开 由一个1个MotionEvent ACTION_UP触发
*/
@Override
public boolean onSingleTapUp(MotionEvent e) {
Log.i("EarlGesture", "onSingleTapUp:" + e.getAction());
return false;
}
/**
* 按下触摸屏,并拖动 由1个MotionEvent ACTION_DOWN 多个ACTION_MOVE触发
*/
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
float distanceY) {
Log.i("EarlGesture", "onScroll:");
return false;
}
/**
* 长按触摸屏 由第1个MotionEvent ACTION_DOWN触发并且开始计时
*/
@Override
public void onLongPress(MotionEvent e) {
Log.i("EarlGesture", "onLongPress:" + e.getAction());
}
/**
* 按下,移动,抬起 由1个MotionEvent ACTION_DOWN 多个ACTION_MOVE, 1个ACTION_UP触发
*/
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
Log.i("EarlGesture", "onFling:");
if (Math.abs(e1.getY() - e2.getY()) > MAX_Y_DISTANCE)
return false;
// 从左向右滑动
if ((e1.getX() - e2.getX()) > MIN_X_DISTANCE
&& Math.abs(velocityX) > MIN_X_VELOCITY) {
activity.relativeLayout1.setAnimation(AnimationUtils.loadAnimation(
activity, R.anim.push_left_out));
activity.relativeLayout2.setVisibility(View.VISIBLE);
activity.relativeLayout2.setAnimation(AnimationUtils.loadAnimation(
activity, R.anim.push_right_in));
activity.relativeLayout1.setVisibility(View.GONE);
}
// 从右向左滑动
else if ((e2.getX() - e1.getX()) > MIN_X_DISTANCE
&& Math.abs(velocityX) > MIN_X_VELOCITY) {
activity.relativeLayout1.setVisibility(View.VISIBLE);
activity.relativeLayout1.setAnimation(AnimationUtils.loadAnimation(
activity, R.anim.push_left_in));
activity.relativeLayout2.setAnimation(AnimationUtils.loadAnimation(
activity, R.anim.push_right_out));
activity.relativeLayout2.setVisibility(View.GONE);
}
return true;
}
}
布局文件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/container"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<RelativeLayout
android:id="@+id/relativeLayout1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="visible" >
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/one" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/relativeLayout2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/gray"
android:visibility="gone" >
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/three" />
</RelativeLayout>
</RelativeLayout>
四个动画
push_left_in.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="400"
android:fromXDelta="-100%p"
android:toXDelta="0" />
<alpha
android:duration="400"
android:fromAlpha="0"
android:toAlpha="1.0" />
</set>
push_left_out.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">s
<translate
android:duration="400"
android:fromXDelta="0"
android:toXDelta="-100%p" />
<alpha
android:duration="400"
android:fromAlpha="1.0"
android:toAlpha="0" />
</set>
push_right_in.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="400"
android:fromXDelta="100%p"
android:toXDelta="0" />
<alpha
android:duration="400"
android:fromAlpha="0"
android:toAlpha="1.0" />
</set>
push_right_out.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="400"
android:fromXDelta="0"
android:toXDelta="100%p" />
<alpha
android:duration="400"
android:fromAlpha="1.0"
android:toAlpha="0" />
</set>