識別向上的手勢啓動一個應用

實現的主要原理是,重寫OnGestureListeneronFling方法.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;
	}
}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章