Android中根據手勢動作判斷是讓螢幕放大還是縮小
阿新 • • 發佈:2019-02-04
背景
專案中關於地圖的部分,需要實現手指觸控式螢幕幕來讓地圖放大和縮小。放大和縮小方法已經寫好了,只需要呼叫對應方法即可。現在的關鍵就是怎麼通過手勢操作來判斷,當前的手勢操作是手勢放大還是手勢縮小。下面一起來實現。
我的思路
首先,我看了百度地圖和高德地圖中的操作:兩個手指觸控式螢幕幕,然後縮小兩個手指之間的距離(此時手指還需要按住螢幕),就是判斷使用者需要執行縮小操作;兩個手指觸控式螢幕幕,然後放大兩個手指之間的距離(此時手指還需要按住螢幕),就是判斷使用者需要執行放大操作。
距離我們可以根據座標來計算,知道兩個點的座標,那麼兩個點之間的直線距離就可以簡單的通過數學計算得出。再根據剛按下時的距離和擡起時的距離,比較兩者直接的值大小,可以判斷出使用者執行的是什麼操作。
思路有了,下面來一起實現。
程式碼實現
如下所示:
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!