實現的主要原理是,重寫OnGestureListener的onFling方法.OnGestureListener不能直接設置偵聽的,可以設置OnTouchListener,讓其指向OnGestureListener。
OnFling的四個參數意思分別爲
e1: The first down motion event that started the fling.手勢起點的移動事件
e2: The move motion event that triggered the current onFling.當前手勢點的移動事件
velocityX: The velocity of this fling measured in pixels per second along the x axis.
X軸移動速度,像素/秒
velocityY: The velocity of this fling measured in pixels per second along the y axis.
Y軸移動速度,像素/秒
向上滑動的判定條件:向上滑動超過一定距離並且沿Y軸移動超過一定速度。
顯示滑動的路徑:用e1.getX()和e1.getY()獲得滑動開始點座標,用e2.getX()和e2.getY()獲得滑動終止點座標。以開始點和終止點新建一個路徑,設置畫筆風格後在bitmap上畫出滑動路徑,再顯示出來。
啓動應用: Intent intent = new Intent();
// 指定運行的app的入口Activity
intent.setAction("com.example.dialogactivitydemo.MainActivity");
startActivity(intent);
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<RelativeLayout
android:id="@+id/mActivity"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<ImageView
android:id="@+id/imageView"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
</RelativeLayout>
</RelativeLayout>
MainActivity.java
package com.example.test3;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.os.Bundle;
import android.view.GestureDetector;
import android.view.GestureDetector.OnGestureListener;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.Toast;
public class MainActivity extends Activity implements OnTouchListener,
OnGestureListener {
private static final String tag = "mainActivity";
private ImageView imageView;
private GestureDetector mGestureDetector;
private int verticalMinistance = 30; // 水平最小識別距離
private int minVelocity = 10; // 最小識別速度
private RelativeLayout mActivity;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 手勢監聽
mGestureDetector = new GestureDetector(MainActivity.this,
(OnGestureListener) this);// (OnGestureListener) 可以省略
// 獲得當前接受操作的佈局id
mActivity = (RelativeLayout) findViewById(R.id.mActivity);
imageView = (ImageView) findViewById(R.id.imageView);
// 觸屏監聽
mActivity.setOnTouchListener(this);
mActivity.setLongClickable(true);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
return true;
}
@Override
public boolean onTouch(View v, MotionEvent event) {
return mGestureDetector.onTouchEvent(event);
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
// 大於設定的最小滑動距離並且在水平/豎直方向速度絕對值大於設定的最小速度,則執行相應方法
if (e1.getX() - e2.getX() > verticalMinistance
&& Math.abs(velocityX) > minVelocity) {
Toast.makeText(MainActivity.this, "turn left", Toast.LENGTH_SHORT)
.show();
} else if (e2.getX() - e1.getX() > verticalMinistance
&& Math.abs(velocityX) > minVelocity) {
Toast.makeText(MainActivity.this, "turn right", Toast.LENGTH_SHORT)
.show();
} else if (e1.getY() - e2.getY() > 20 && Math.abs(velocityY) > 10) {
Toast.makeText(MainActivity.this, "turn up", Toast.LENGTH_SHORT)
.show();
// 連接開始滑動和停止滑動的兩個點爲一條實線。並在結束滑動的位置畫一個三角形
Path path = new Path();
path.moveTo(e1.getX(), e1.getY());
path.lineTo(e2.getX(), e2.getY());
path.lineTo(e2.getX() + 30, e2.getY() + 50);
path.lineTo(e2.getX() - 30, e2.getY() + 50);
path.lineTo(e2.getX(), e2.getY());
// 設置畫筆的樣式
Paint paint = new Paint();
paint.setStyle(Paint.Style.STROKE);
paint.setColor(Color.YELLOW);
paint.setStrokeWidth(20);
// 新建一個bitmap,寬是屏幕的寬,長是屏幕的長
Bitmap bitmap = Bitmap.createBitmap(getResources()
.getDisplayMetrics().widthPixels, getResources()
.getDisplayMetrics().heightPixels, Config.ARGB_8888);
// 要在bitmap上畫線
Canvas canvas = new Canvas(bitmap);
// 用畫筆沿着路線畫出大致的滑動路徑
canvas.drawPath(path, paint);
// 在屏幕上顯示出路徑
imageView.setImageBitmap(bitmap);
Intent intent = new Intent();
// 指定運行的app的入口Activity
intent.setAction("com.example.dialogactivitydemo.MainActivity");
startActivity(intent);
} else if (e2.getY() - e1.getY() > 20 && Math.abs(velocityY) > 10) {
Toast.makeText(MainActivity.this, "turn down", Toast.LENGTH_SHORT)
.show();
}
return false;
}
// 只要有觸發就會調用次方法
@Override
public boolean onDown(MotionEvent e) {
Toast.makeText(MainActivity.this, "onDown", Toast.LENGTH_SHORT).show();
return false;
}
@Override
public void onLongPress(MotionEvent e) {
Toast.makeText(MainActivity.this, "onLongPress", Toast.LENGTH_SHORT)
.show();
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
float distanceY) {
// Toast.makeText(MainActivity.this, "onScroll", Toast.LENGTH_SHORT)
// .show();
return false;
}
@Override
public void onShowPress(MotionEvent e) {
// Toast.makeText(MainActivity.this, "onShowPress",
// Toast.LENGTH_SHORT).show();
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
// Toast.makeText(MainActivity.this, "onsingleTapup",
// Toast.LENGTH_SHORT).show();
return false;
}
}