溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

android手勢識(shí)別

發(fā)布時(shí)間:2020-05-12 14:44:25 來源:億速云 閱讀:180 作者:Leah 欄目:開發(fā)技術(shù)

今天小編就為大家?guī)硪黄猘ndroid手勢識(shí)別的文章。小編覺得挺不錯(cuò)的,為此分享給大家做個(gè)參考。一起跟隨小編過來看看吧。

android的手勢識(shí)別是android更人性化,讓我們的操作更簡單, 其實(shí)我們?nèi)粘?yīng)用中不少地方都使用了手勢識(shí)別方法  比如 2011年那么火的 憤怒的小鳥 中的 發(fā)射武器, uc 游覽器 的左右滑動(dòng)功能,這都是可以使用android的手勢識(shí)別來實(shí)現(xiàn)。  

 如果想要實(shí)現(xiàn)提高我們app 的用戶體驗(yàn),更具有可操作性,那這時(shí)android的GestureDetector 就派上用場了 ,  我們先開看看GestureDetector這個(gè)類的api 給我們提供了哪些操作

下面是GestureDetector 這個(gè)類的概括情況

根據(jù) MotionEvent事件檢測各種手勢. GestureDetector.OnGestureListener 回調(diào)函數(shù)用于通知用戶發(fā)生的手勢動(dòng)作。該類僅處理 MotionEvent 事件中的觸摸事件(不處理軌跡球事件)。 使用該類的方法如下:

1:首先需要在初始化的時(shí)候創(chuàng)建GestureDetector對(duì)象實(shí)例

2:在View中的onTouchEvent方法中調(diào)用GestureDetector對(duì)象中的onTouchEvent方法當(dāng)事件發(fā)生的時(shí)候就可以回調(diào)該方法

下面看看摘自android 的api 的摘要

GestureDetector.OnDoubleTapListenerThe listener that is used to notify when a double-tap or a confirmed single-tap occur. 
GestureDetector.OnGestureListenerThe listener that is used to notify when gestures occur. 
GestureDetector.SimpleOnGestureListenerA convenience class to extend when you only want to listen for a subset of all the gestures. 

 現(xiàn)在我們來分析下GestureDetector這個(gè)類的概括情況  

接口 OnDoubleTapListener   手勢監(jiān)聽器  用于雙擊時(shí)發(fā)出通知

接口 OnGestureListener     手勢監(jiān)聽器 用于發(fā)送手勢操作時(shí)發(fā)生通知 如 拖動(dòng),長按,按下,彈起 等手勢操作

類   SimpleOnGestureListener    GestureDetector的擴(kuò)展類  這個(gè)類的作用是當(dāng)我們只想使用部分手勢時(shí), 而非全部的時(shí)候 就可以繼承這個(gè)類

GestureDetector 還有幾個(gè)公共方法 如下

分析給定的動(dòng)作事件,如果滿足條件,就觸發(fā)GestureDetector.OnGestureListener 中提供的回調(diào)函數(shù)。
設(shè)置是否允許長按。如果允許長按,當(dāng)用戶按下并保持按下狀態(tài)時(shí), 將收到一個(gè)長按事件,同時(shí)不再接收其它事件;如果禁用長按, 當(dāng)用戶按下并保持按下狀態(tài)然后再移動(dòng)手指時(shí),將會(huì)接收到滾動(dòng)事件。 長按默認(rèn)為允許。
設(shè)置雙擊及其相關(guān)手勢的監(jiān)聽器。

OnGestureListener 接口 的公共方法  如果你想在你的app view中實(shí)現(xiàn)下面這些手勢操作的話 繼承該接口 并實(shí)現(xiàn)下面這些方法即可

當(dāng)輕觸手勢按下屏幕 時(shí)發(fā)生的事件.
快速滑動(dòng)后抬起事件的通知.
長按時(shí)的通知事件

           
滑動(dòng)屏幕時(shí)通知事件 為了方便提供了X軸和Y軸上的滾動(dòng)距離.
當(dāng)用戶長點(diǎn)擊后抬起時(shí)通知事件
當(dāng)輕觸手勢抬起屏幕時(shí)發(fā)生的事件.

OnDoubleTapListener 接口的公共方法 

雙擊發(fā)生時(shí)的通知。
雙擊手勢過程中發(fā)生的事件,包括按下、移動(dòng)和抬起事件。
發(fā)生確定的單擊時(shí)執(zhí)行。

onSingleTapUp(MotionEvent)不同, 該事件在探測器確定用戶單擊后沒有發(fā)生導(dǎo)致雙擊事件的第二次單擊時(shí)發(fā)生。

在實(shí)際應(yīng)用中 我們根據(jù)我們所需要的功能實(shí)現(xiàn)不同的接口 或者 繼承自SimpleOnGestureListener 類 只實(shí)現(xiàn)部分個(gè)人需要的方法 就可以了

我們這一章就以  OnGestureListener 接口來做示例 看看 他是怎么使用的

 直接看代碼 GameSurfaceView類

 

package yxqz.com;


import android.content.Context;

import android.content.DialogInterface;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.graphics.Canvas;

import android.graphics.Color;

import android.util.Log;

import android.view.GestureDetector;

import android.view.GestureDetector.OnGestureListener;

import android.view.MotionEvent;

import android.view.SurfaceHolder;

import android.view.SurfaceView;

import android.view.SurfaceHolder.Callback;

import android.widget.Toast;


/**

 * android 手勢識(shí)別

 * @author mahaile

 *

 */

public class GameSurfaceView extends SurfaceView implements Callback,OnGestureListener{


private String TAG="GameView";


boolean flag; //線程標(biāo)示位 當(dāng)為false時(shí)停止刷新界面

SurfaceHolder surfaceHolder;

GameViewThread gameViewThread;

float x=0,y=0;

int stat=0;  //手勢識(shí)別狀態(tài)標(biāo)示

private GestureDetector gd; // 手勢

Context context;

int width,height;

Bitmap bitmap_role;

public GameSurfaceView(Context context) {

super(context);

this.context=context;

surfaceHolder=this.getHolder();

surfaceHolder.addCallback(this); //添加回調(diào)

//設(shè)置焦點(diǎn) 如果不設(shè)置焦點(diǎn)的話 在該界面下 點(diǎn)擊觸摸屏是無效的 默認(rèn)為false

setFocusableInTouchMode(true);

bitmap_role=BitmapFactory.decodeResource(getResources(), R.drawable.role);

gd=new GestureDetector(this);   //創(chuàng)建手勢監(jiān)聽對(duì)象

}

public void onDraw(Canvas canvas){

canvas.drawColor(Color.BLACK);

//canvas.drawBitmap(bitmap_role, width/2-bitmap_role.getWidth()/2, y, null);

canvas.drawBitmap(bitmap_role, x-bitmap_role.getWidth()/2, y-bitmap_role.getHeight()/2, null);

}

    //重寫父類中的 onTouchEvent就可以監(jiān)聽到  觸摸事件了 記住要設(shè)置焦點(diǎn)喔 

@Override

public boolean onTouchEvent(MotionEvent event) {

gd.onTouchEvent(event); //通知手勢識(shí)別方法 

return true;

}

public void surfaceChanged(SurfaceHolder surfaceHolder, int format, int width, int height) {

}


public void surfaceCreated(SurfaceHolder surfaceHolder) {

//獲取屏幕的 寬高 只有在 surface創(chuàng)建的時(shí)候 才有效 ,才構(gòu)造方法中獲取 寬高是獲取不到的

width=this.getWidth();

height=this.getHeight();

//初始化繪圖線程

gameViewThread=new GameViewThread();

gameViewThread.flag=true;

gameViewThread.start();

}


public void surfaceDestroyed(SurfaceHolder surfaceHolder) {

gameViewThread.flag=false; //銷毀線程

}


class GameViewThread extends Thread{

public boolean flag;

public void run(){

while(flag){

Canvas canvas=null;

try{

canvas=surfaceHolder.lockCanvas(); //鎖定畫布 并獲取canvas

onDraw(canvas);//調(diào)用onDraw 渲染到屏幕

surfaceHolder.unlockCanvasAndPost(canvas); //此步不要忘記了喔 否則界面上顯示不出來的

}catch(Exception e){

e.printStackTrace();

}

try {

Thread.sleep(10);//線程休眠時(shí)間  控制幀數(shù)

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}  //每一秒刷新一次

}

}

}

 

    //**************************下面是手勢識(shí)別的重寫方法*******************************************

//屏幕點(diǎn)下

public boolean onDown(MotionEvent arg0) {

Log.d(TAG, "onDown");

Toast.makeText(this.context, "你點(diǎn)擊了屏幕", Toast.LENGTH_SHORT).show();

return false;

}

//屏幕點(diǎn)下

public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,

float velocityY) {

Log.d(TAG, "onFling");

Toast.makeText(this.context, "你拖動(dòng)屏幕后彈起", Toast.LENGTH_SHORT).show();

return false;

}

   //屏幕點(diǎn)下 并長按時(shí)觸發(fā)

public void onLongPress(MotionEvent e) {

Log.d(TAG, "onLongPress");

Toast.makeText(this.context, "你長按了屏幕", Toast.LENGTH_SHORT).show();

}

    //屏幕拖動(dòng)

public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,

float distanceY) {

this.x=this.x-distanceX;

this.y=this.y-distanceY;

Toast.makeText(this.context, "你拖動(dòng)了屏幕", Toast.LENGTH_SHORT).show();

return false;

}

   //屏幕長按

public void onShowPress(MotionEvent e) {

// TODO Auto-generated method stub

Toast.makeText(this.context, "你長按屏幕后彈起", Toast.LENGTH_SHORT).show();

Log.d(TAG, "onShowPress");

}

   //屏幕點(diǎn)擊后彈起

public boolean onSingleTapUp(MotionEvent e) {

   Log.d(TAG, "onSingleTapUp");

   Toast.makeText(this.context, "你彈起屏幕", Toast.LENGTH_SHORT).show();

return false;

}

}

有一點(diǎn)大家需要注意一下 每次執(zhí)行手勢時(shí) 可以會(huì)執(zhí)行多個(gè)手勢通知 大家需要留意一下喔,避免重復(fù)操作app邏輯。

以上就是android手勢識(shí)別的具體介紹,內(nèi)容較為全面,而且我也相信有相當(dāng)?shù)囊恍┕ぞ呖赡苁俏覀內(nèi)粘9ぷ骺赡軙?huì)見到或用到的。通過這篇文章,希望你能收獲更多。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI