欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android 的觸摸事件詳解及示例代碼

 更新時間:2016年09月09日 16:17:27   投稿:lqh  
本文主要介紹Android 的觸摸事件,這里整理了詳細的資料,并附代碼示例,希望能幫助到有需要的小伙伴

由于觸摸(Touch)而觸發(fā)的事件

Android的事件:onClick, onScroll,onFling等等,都是由許多個Touch組成的。其中Touch的第一個狀態(tài)肯定是ACTION_DOWN,表示按下了屏幕。之后,touch將會有后續(xù)事件,可能是:

ACTION_MOVE //表示為移動手勢

ACTION_UP //表示為離開屏幕

ACTION_CANCEL //表示取消手勢,不會由用戶產(chǎn)生,而是由程序產(chǎn)生的

一個Action_DOWN, n個ACTION_MOVE, 1個ACTION_UP,就構(gòu)成了Android中眾多的事件。

對于ViewGroup類的控件,有一個很重要的方法,就是onInterceptTouchEvent(),用于處理事件并改變事件的傳遞方向,它的返回值是一個布爾值,決定了Touch事件是否要向它包含的子View繼續(xù)傳遞,這個方法是從父View向子View傳遞。

而方法onTouchEvent(),用于接收事件并處理,它的返回值也是一個布爾值,決定了事件及后續(xù)事件是否繼續(xù)向上傳遞,這個方法是從子View向父View傳遞。

touch事件在onInterceptTouchEvent()和onTouchEvent以及各個childView間的傳遞機制完全取決于onInterceptTouchEvent()和onTouchEvent()的返回值。返回值為true表示事件被正確接收和處理了,返回值為false表示事件沒有被處理,將繼續(xù)傳遞下去。

ACTION_DOWN事件會傳到某個ViewGroup類的onInterceptTouchEvent,如果返回false,則DOWN事件繼續(xù)向子ViewGroup類的onInterceptTouchEvent傳遞,如果子View不是ViewGroup類的控件,則傳遞給它的onTouchEvent。

如果onInterceptTouchEvent返回了true,則DOWN事件傳遞給它的onTouchEvent,不再繼續(xù)傳遞,并且之后的后續(xù)事件也都傳遞給它的onTouchEvent。

如果某View的onTouchEvent返回了false,則DOWN事件繼續(xù)向其父ViewGroup類的onTouchEvent傳遞;如果返回了true,則后續(xù)事件會直接傳遞給其onTouchEvent繼續(xù)處理。(后續(xù)事件只會傳遞給對于必要事件ACTION_DOWN返回了true的onTouchEvent)

總結(jié)一下就是:onInterceptTouchEvent可以接受到所有的Touch事件,而onTouchEvent則不一定。

對于android 自定義控件的事件 android提供了一個GestureDetector的類和GestureDetector.OnGestureListener的接口來判斷用戶在界面上做出怎么樣的動作。

Android里有兩個類

  android.view.GestureDetector
  android.view.GestureDetector.SimpleOnGestureListener
  (另外android.widget.Gallery好像是更牛x的OnGestureListener )

  1) 新建一個類繼承SimpleOnGestureListener,HahaGestureDetectorListener 

     可以實現(xiàn)以下event事件。
  boolean onDoubleTap(MotionEvent e)
  解釋:雙擊的第二下Touch down時觸發(fā)
  boolean onDoubleTapEvent(MotionEvent e)
  解釋:雙擊的第二下Touch down和up都會觸發(fā),可用e.getAction()區(qū)分。
  boolean onDown(MotionEvent e)
  解釋:Touch down時觸發(fā)
  boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY)
  解釋:Touch了滑動一點距離后,up時觸發(fā)。
  void onLongPress(MotionEvent e)
  解釋:Touch了不移動一直Touch down時觸發(fā)
  boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,float distanceY)
  解釋:Touch了滑動時觸發(fā)。
  void onShowPress(MotionEvent e)
  解釋:Touch了還沒有滑動時觸發(fā)
 ?。ㄅconDown,onLongPress比較
  onDown只要Touch down一定立刻觸發(fā)。
  而Touchdown后過一會沒有滑動先觸發(fā)onShowPress再是onLongPress。
  所以Touchdown后一直不滑動,onDown->onShowPress->onLongPress這個順序觸發(fā)。
 ?。?br />   boolean onSingleTapConfirmed(MotionEvent e)
  boolean onSingleTapUp(MotionEvent e)
  解釋:上面這兩個函數(shù)都是在touchdown后又沒有滑動(onScroll),又沒有長按(onLongPress),然后Touchup時觸發(fā)。
  點擊一下非??斓模ú换瑒樱㏕ouchup:
  onDown->onSingleTapUp->onSingleTapConfirmed
  點擊一下稍微慢點的(不滑動)Touchup:
  onDown->onShowPress->onSingleTapUp->onSingleTapConfirmed 

publicclassGestureActivityextendsActivityimplementsOnTouchListener,
    OnGestureListener {

  GestureDetector detector;

  publicGestureActivity(){
    detector = new GestureDetector(this);
  }
  
  publicvoidonCreate(BundlesavedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.main); 
      TextView tv = (TextView) findViewById(R.id.TextView001);
      //設(shè)置tv的監(jiān)聽器 
      tv.setOnTouchListener(this); 
      tv.setFocusable(true);
      //必須,view才能夠處理不同于Tap(輕觸)的hold
      tv.setClickable(true); 
      tv.setLongClickable(true); 
      detector.setIsLongpressEnabled(true); 
  } 
  
  
   
  publicbooleanonTouch(View v,MotionEvent event) { 
    returndetector.onTouchEvent(event); 
  } 
 
  // 用戶輕觸觸摸屏,由1個MotionEventACTION_DOWN觸發(fā) 
  publicbooleanonDown(MotionEventarg0) { 
    Log.i("MyGesture","onDown"); 
    Toast.makeText(this, "onDown",Toast.LENGTH_SHORT).show(); 
    returntrue; 
  } 
   
  
  publicvoidonShowPress(MotionEvent e) { 
    Log.i("MyGesture","onShowPress"); 
    Toast.makeText(this, "onShowPress",Toast.LENGTH_SHORT).show(); 
  } 
   
  // 用戶(輕觸觸摸屏后)松開,由一個1個MotionEventACTION_UP觸發(fā) 
  publicbooleanonSingleTapUp(MotionEvent e) { 
    Log.i("MyGesture","onSingleTapUp"); 
    Toast.makeText(this, "onSingleTapUp",Toast.LENGTH_SHORT).show(); 
    returntrue; 
  } 
   
  // 用戶按下觸摸屏、快速移動后松開,由1個MotionEventACTION_DOWN, 多個ACTION_MOVE, 1個ACTION_UP觸發(fā) 
  publicbooleanonFling(MotionEvente1, MotionEvent e2, float velocityX, float velocityY) { 
    Log.i("MyGesture","onFling"); 
    
    // 參數(shù)解釋: 
    // e1:第1個ACTION_DOWNMotionEvent 
    // e2:最后一個ACTION_MOVEMotionEvent 
    // velocityX:X軸上的移動速度,像素/秒 
    // velocityY:Y軸上的移動速度,像素/秒 
   
    // 觸發(fā)條件 : 
    // X軸的坐標位移大于FLING_MIN_DISTANCE,且移動速度大于FLING_MIN_VELOCITY個像素/秒 
     
    finalintFLING_MIN_DISTANCE = 100,FLING_MIN_VELOCITY = 200; 
    if (e1.getX() - e2.getX() >FLING_MIN_DISTANCE &&Math.abs(velocityX) > FLING_MIN_VELOCITY){ 
      // Flingleft 
      Log.i("MyGesture","Fling left"); 
      Toast.makeText(this, "FlingLeft",Toast.LENGTH_SHORT).show(); 
    } elseif (e2.getX() - e1.getX() >FLING_MIN_DISTANCE &&Math.abs(velocityX) > FLING_MIN_VELOCITY){ 
      // Flingright 
      Log.i("MyGesture","Fling right"); 
      Toast.makeText(this, "FlingRight",Toast.LENGTH_SHORT).show(); 
    } elseif(e2.getY()-e1.getY()>FLING_MIN_DISTANCE && Math.abs(velocityY)>FLING_MIN_VELOCITY) {
      // Flingdown 
      Log.i("MyGesture","Fling down"); 
      Toast.makeText(this, "Flingdown",Toast.LENGTH_SHORT).show();
    } elseif(e1.getY()-e2.getY()>FLING_MIN_DISTANCE && Math.abs(velocityY)>FLING_MIN_VELOCITY) {
      // Fling up 
      Log.i("MyGesture","Fling up"); 
      Toast.makeText(this, "Flingup",Toast.LENGTH_SHORT).show();
    } 
    
    
    returnfalse;
    
  } 
   
  // 用戶按下觸摸屏,并拖動,由1個MotionEventACTION_DOWN, 多個ACTION_MOVE觸發(fā) 
  publicbooleanonScroll(MotionEvente1, MotionEvent e2, float distanceX, float distanceY) { 
    Log.i("MyGesture","onScroll"); 
    Toast.makeText(this, "onScroll",Toast.LENGTH_LONG).show(); 
    returntrue; 
  } 
   
  // 用戶長按觸摸屏,由多個MotionEventACTION_DOWN觸發(fā) 
  publicvoidonLongPress(MotionEvent e) { 
    Log.i("MyGesture","onLongPress"); 
    Toast.makeText(this, "onLongPress",Toast.LENGTH_LONG).show(); 
  } 
  

}

  2)在view的新建一個GestureDetector的對象。

  構(gòu)造函數(shù)里

  gestureDetector = new GestureDetector(newHahaGestureDetectorListener());

  然后在View的onTouchEvent里以下這樣用,就可以在剛才1)弄的事件里寫自己的代碼了。

  @Override
  public boolean onTouchEvent(MotionEvent event) {
  gestureDetector.onTouchEvent(event);
  }
  mTouchListener = new OnTouchListener() {
   @Override
   public boolean onTouch(View v, MotionEvent event) {
   // TODO Auto-generated method stub
   float x =event.getXPrecision()*event.getX()+event.getX();
   float y =event.getYPrecision()*event.getY()+event.getY();
   switch (event.getAction()) {
   case MotionEvent.ACTION_DOWN:
  
   break;
   case MotionEvent.ACTION_MOVE:
   mTouchTimes++;
   if (mTouchTimes > TOUCH_TIMES) {
  // 根據(jù)方向計算角度
   if (mCurrentOrientation==DeviceOrientation.Landscape) {
   mAngle = Math.toDegrees(Math.atan2(y - 480 / 2, x))+90;
   } else {
   mAngle = -Math.toDegrees(Math.atan2(y - 480 / 2,320-x))+90;
   }
  
   Log.w("angle", "mangle:"+mAngle);
   }
   break;
   case MotionEvent.ACTION_UP:
   if (mTouchTimes > TOUCH_TIMES) {
  
   } else {
  
   }
   mTouchTimes = 0;
   break;
   default:
   break;
  }
   return true;
   }
   };
  mView.setOnTouchListener(mTouchListener);
 

通過此文,希望能幫助開發(fā)Android應(yīng)用使用觸摸事件的朋友,謝謝大家對本站的支持!

相關(guān)文章

最新評論