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>