您好,登錄后才能下訂單哦!
今天小編就為大家?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.OnDoubleTapListener | The listener that is used to notify when a double-tap or a confirmed single-tap occur. | |
GestureDetector.OnGestureListener | The listener that is used to notify when gestures occur. | |
GestureDetector.SimpleOnGestureListener | A 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í)行。 與 |
在實(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ì)見到或用到的。通過這篇文章,希望你能收獲更多。
免責(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)容。