手勢(shì)識(shí)別是我們?nèi)粘J褂秒娮游锲分蟹浅3R?jiàn)的一個(gè)功能,這個(gè)功能大大提升了用戶體驗(yàn)的感受
從策劃到設(shè)計(jì)制作,每一步都追求做到細(xì)膩,制作可持續(xù)發(fā)展的企業(yè)網(wǎng)站。為客戶提供網(wǎng)站設(shè)計(jì)、做網(wǎng)站、網(wǎng)站策劃、網(wǎng)頁(yè)設(shè)計(jì)、申請(qǐng)域名、網(wǎng)頁(yè)空間、網(wǎng)絡(luò)營(yíng)銷(xiāo)、VI設(shè)計(jì)、 網(wǎng)站改版、漏洞修補(bǔ)等服務(wù)。為客戶提供更好的一站式互聯(lián)網(wǎng)解決方案,以客戶的口碑塑造優(yōu)易品牌,攜手廣大客戶,共同發(fā)展進(jìn)步。
手勢(shì)識(shí)別主要有兩種方法,一種是GestureDetector,另一種是GestureOverlayView
現(xiàn)在來(lái)研究下GestureDetector方法
1.手指觸屏的一瞬間,觸發(fā)MotionEvent事件
2.被OnTouchListener監(jiān)聽(tīng),在onTouch()中獲得MotionEvent對(duì)象
3.GestureDetector轉(zhuǎn)發(fā)MotionEvent對(duì)象至OnGestureListener
4.OngestureListener獲得該對(duì)象,根據(jù)該對(duì)象封裝的信息做出合適的反饋
MotionEvent:
用于封裝手勢(shì)、觸摸筆、軌跡球等動(dòng)作事件
內(nèi)部封裝用于記錄橫軸和縱軸坐標(biāo)的屬性X和Y
手勢(shì)的滑動(dòng)相當(dāng)于屏幕上的XY軸的坐標(biāo)的變化
GestureDetector:識(shí)別各種手勢(shì)
當(dāng)手指:按下、移動(dòng)、抬起等可通過(guò)重載onTouch或者設(shè)置setOnTouchListener來(lái)監(jiān)聽(tīng)
原理:當(dāng)接收到用戶觸摸消息時(shí),將消息交給GestureDetector加工,通過(guò)設(shè)置監(jiān)聽(tīng)器獲得GestureDetector處理后的手勢(shì)
OnGestureListener:手勢(shì)交互的監(jiān)聽(tīng)接口,其提供多個(gè)抽象方法、根據(jù)GestureDetector的手勢(shì)識(shí)別結(jié)果調(diào)用相對(duì)應(yīng)的方法 ,監(jiān)聽(tīng)單擊事件
OnDoubleTapListener:監(jiān)聽(tīng)雙擊事件
OnGestureListener接口的方法太多,沒(méi)有辦法寫(xiě)完,所以只需寫(xiě)一個(gè)類(lèi),實(shí)現(xiàn)所需要的方法即可
單擊:onDown、抬起:onSingleTapUp、短按:onShowPress、長(zhǎng)按:onLongPress、滾動(dòng):onScroll、滑動(dòng):onFling
Android提供了一個(gè)類(lèi)SimpleOnGestureListener:我們只需繼承這個(gè)類(lèi),然后重載感興趣的手勢(shì)就行
例子代碼如下:
package com.gdut.gesturedetector;
import android.app.Activity;
import android.app.ActionBar;
import android.app.Fragment;
import android.os.Bundle;
import android.view.GestureDetector;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.GestureDetector.SimpleOnGestureListener;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.Toast;
import android.os.Build;
public class MainActivity extends Activity {
private ImageView img;
private GestureDetector myGestureDetector;
//OnGestureListener接口的方法太多,沒(méi)有辦法寫(xiě)完,所以只需寫(xiě)一個(gè)類(lèi),實(shí)現(xiàn)所需要的方法即可
//android提供了一個(gè)類(lèi)simpleOnGestureListener
class myGestureListener extends SimpleOnGestureListener{
//實(shí)現(xiàn)滑動(dòng)的onFling方法
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
if(e1.getX() - e2.getX() > 50){
Toast.makeText(MainActivity.this, "從右往左滑動(dòng)!", Toast.LENGTH_SHORT).show();
}else if(e2.getX() - e1.getX() > 50){
Toast.makeText(MainActivity.this, "從左往右滑動(dòng)!", Toast.LENGTH_SHORT).show();
}
return super.onFling(e1, e2, velocityX, velocityY);
}
}
@SuppressWarnings("deprecation")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
img = (ImageView) findViewById(R.id.img);
//實(shí)例化myGestureDetector,并監(jiān)聽(tīng)
myGestureDetector = new GestureDetector(new myGestureListener());
//向?qū)@張圖片進(jìn)行監(jiān)聽(tīng)
img.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
//獲得的event要通過(guò)GestureDetector轉(zhuǎn)發(fā)出去給OnGestureListener,OnGestureListener獲得該對(duì)象,根據(jù)該對(duì)象封裝的信息作出合適的反饋
myGestureDetector.onTouchEvent(event);
return true;
}
});
}
}
但是GestureDetector,有局限,就是只能進(jìn)行比較少而簡(jiǎn)單的手勢(shì)操作。
而比較復(fù)雜或者自定義的手勢(shì),就由GestureOverlayView實(shí)現(xiàn)