1. 程式人生 > >Android中根據手勢動作判斷是讓螢幕放大還是縮小

Android中根據手勢動作判斷是讓螢幕放大還是縮小

背景

專案中關於地圖的部分,需要實現手指觸控式螢幕幕來讓地圖放大和縮小。放大和縮小方法已經寫好了,只需要呼叫對應方法即可。現在的關鍵就是怎麼通過手勢操作來判斷,當前的手勢操作是手勢放大還是手勢縮小。下面一起來實現。

我的思路

首先,我看了百度地圖和高德地圖中的操作:兩個手指觸控式螢幕幕,然後縮小兩個手指之間的距離(此時手指還需要按住螢幕),就是判斷使用者需要執行縮小操作;兩個手指觸控式螢幕幕,然後放大兩個手指之間的距離(此時手指還需要按住螢幕),就是判斷使用者需要執行放大操作。
距離我們可以根據座標來計算,知道兩個點的座標,那麼兩個點之間的直線距離就可以簡單的通過數學計算得出。再根據剛按下時的距離和擡起時的距離,比較兩者直接的值大小,可以判斷出使用者執行的是什麼操作。
思路有了,下面來一起實現。

程式碼實現

如下所示:

package com.example.administrator.touchzoominoutdemo;

import android.graphics.Point;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.Toast;

public class MainActivity extends
AppCompatActivity {
private double nLenStart; private double nLenEnd; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public boolean onTouchEvent(MotionEvent event) { int
pCount = event.getPointerCount();// 觸控裝置時手指的數量 int action = event.getAction();// 獲取觸屏動作。比如:按下、移動和擡起等手勢動作 // 手勢按下且螢幕上是兩個手指數量時 if ((action & MotionEvent.ACTION_MASK) == MotionEvent.ACTION_POINTER_DOWN && pCount == 2){ // 獲取按下時候兩個座標的x軸的水平距離,取絕對值 int xLen = Math.abs((int)event.getX(0) - (int)event.getX(1)); // 獲取按下時候兩個座標的y軸的水平距離,取絕對值 int yLen = Math.abs((int)event.getY(0) - (int)event.getY(1)); // 根據x軸和y軸的水平距離,求平方和後再開方獲取兩個點之間的直線距離。此時就獲取到了兩個手指剛按下時的直線距離 nLenStart = Math.sqrt((double) xLen * xLen + (double) yLen * yLen); }else if ((action & MotionEvent.ACTION_MASK) == MotionEvent.ACTION_POINTER_UP && pCount == 2){// 手勢擡起且螢幕上是兩個手指數量時 // 獲取擡起時候兩個座標的x軸的水平距離,取絕對值 int xLen = Math.abs((int)event.getX(0) - (int)event.getX(1)); // 獲取擡起時候兩個座標的y軸的水平距離,取絕對值 int yLen = Math.abs((int)event.getY(0) - (int)event.getY(1)); // 根據x軸和y軸的水平距離,求平方和後再開方獲取兩個點之間的直線距離。此時就獲取到了兩個手指擡起時的直線距離 nLenEnd = Math.sqrt((double) xLen * xLen + (double) yLen * yLen); // 根據手勢按下時兩個手指觸點之間的直線距離A和手勢擡起時兩個手指觸點之間的直線距離B。比較A和B的大小,得出使用者是手勢放大還是手勢縮小 if(nLenEnd > nLenStart){ Toast.makeText(this, "手勢放大", Toast.LENGTH_SHORT).show(); }else if(nLenEnd < nLenStart){ Toast.makeText(this, "手勢縮小", Toast.LENGTH_SHORT).show(); } } return true; } }

重寫了onTouchEvent方法,然後在裡面進行相關邏輯判斷。註釋我寫的很詳細,跟思路一模一樣。
然後大家自己可以根據程式碼進行相關驗證。自己寫個demo安裝到手機上,執行後,測試一下效果。

A little bit of progress every day!Come on!