最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

ACTION_MOVE //表示為移動(dòng)手勢(shì)

ACTION_UP //表示為離開(kāi)屏幕

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

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

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

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

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

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

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

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

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

對(duì)于android 自定義控件的事件 android提供了一個(gè)GestureDetector的類(lèi)和GestureDetector.OnGestureListener的接口來(lái)判斷用戶(hù)在界面上做出怎么樣的動(dòng)作。

Android里有兩個(gè)類(lèi)

  android.view.GestureDetector
  android.view.GestureDetector.SimpleOnGestureListener
 ?。硗鈇ndroid.widget.Gallery好像是更牛x的OnGestureListener )

  1) 新建一個(gè)類(lèi)繼承SimpleOnGestureListener,HahaGestureDetectorListener 

     可以實(shí)現(xiàn)以下event事件。
  boolean onDoubleTap(MotionEvent e)
  解釋?zhuān)弘p擊的第二下Touch down時(shí)觸發(fā)
  boolean onDoubleTapEvent(MotionEvent e)
  解釋?zhuān)弘p擊的第二下Touch down和up都會(huì)觸發(fā),可用e.getAction()區(qū)分。
  boolean onDown(MotionEvent e)
  解釋?zhuān)篢ouch down時(shí)觸發(fā)
  boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY)
  解釋?zhuān)篢ouch了滑動(dòng)一點(diǎn)距離后,up時(shí)觸發(fā)。
  void onLongPress(MotionEvent e)
  解釋?zhuān)篢ouch了不移動(dòng)一直Touch down時(shí)觸發(fā)
  boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,float distanceY)
  解釋?zhuān)篢ouch了滑動(dòng)時(shí)觸發(fā)。
  void onShowPress(MotionEvent e)
  解釋?zhuān)篢ouch了還沒(méi)有滑動(dòng)時(shí)觸發(fā)
 ?。ㄅconDown,onLongPress比較
  onDown只要Touch down一定立刻觸發(fā)。
  而Touchdown后過(guò)一會(huì)沒(méi)有滑動(dòng)先觸發(fā)onShowPress再是onLongPress。
  所以Touchdown后一直不滑動(dòng),onDown->onShowPress->onLongPress這個(gè)順序觸發(fā)。
 ?。?br />   boolean onSingleTapConfirmed(MotionEvent e)
  boolean onSingleTapUp(MotionEvent e)
  解釋?zhuān)荷厦孢@兩個(gè)函數(shù)都是在touchdown后又沒(méi)有滑動(dòng)(onScroll),又沒(méi)有長(zhǎng)按(onLongPress),然后Touchup時(shí)觸發(fā)。
  點(diǎn)擊一下非??斓模ú换瑒?dòng))Touchup:
  onDown->onSingleTapUp->onSingleTapConfirmed
  點(diǎn)擊一下稍微慢點(diǎn)的(不滑動(dòng))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)聽(tīng)器 
      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); 
  } 
 
  // 用戶(hù)輕觸觸摸屏,由1個(gè)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(); 
  } 
   
  // 用戶(hù)(輕觸觸摸屏后)松開(kāi),由一個(gè)1個(gè)MotionEventACTION_UP觸發(fā) 
  publicbooleanonSingleTapUp(MotionEvent e) { 
    Log.i("MyGesture","onSingleTapUp"); 
    Toast.makeText(this, "onSingleTapUp",Toast.LENGTH_SHORT).show(); 
    returntrue; 
  } 
   
  // 用戶(hù)按下觸摸屏、快速移動(dòng)后松開(kāi),由1個(gè)MotionEventACTION_DOWN, 多個(gè)ACTION_MOVE, 1個(gè)ACTION_UP觸發(fā) 
  publicbooleanonFling(MotionEvente1, MotionEvent e2, float velocityX, float velocityY) { 
    Log.i("MyGesture","onFling"); 
    
    // 參數(shù)解釋?zhuān)?
    // e1:第1個(gè)ACTION_DOWNMotionEvent 
    // e2:最后一個(gè)ACTION_MOVEMotionEvent 
    // velocityX:X軸上的移動(dòng)速度,像素/秒 
    // velocityY:Y軸上的移動(dòng)速度,像素/秒 
   
    // 觸發(fā)條件 : 
    // X軸的坐標(biāo)位移大于FLING_MIN_DISTANCE,且移動(dòng)速度大于FLING_MIN_VELOCITY個(gè)像素/秒 
     
    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;
    
  } 
   
  // 用戶(hù)按下觸摸屏,并拖動(dòng),由1個(gè)MotionEventACTION_DOWN, 多個(gè)ACTION_MOVE觸發(fā) 
  publicbooleanonScroll(MotionEvente1, MotionEvent e2, float distanceX, float distanceY) { 
    Log.i("MyGesture","onScroll"); 
    Toast.makeText(this, "onScroll",Toast.LENGTH_LONG).show(); 
    returntrue; 
  } 
   
  // 用戶(hù)長(zhǎng)按觸摸屏,由多個(gè)MotionEventACTION_DOWN觸發(fā) 
  publicvoidonLongPress(MotionEvent e) { 
    Log.i("MyGesture","onLongPress"); 
    Toast.makeText(this, "onLongPress",Toast.LENGTH_LONG).show(); 
  } 
  

}

  2)在view的新建一個(gè)GestureDetector的對(duì)象。

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

  gestureDetector = new GestureDetector(newHahaGestureDetectorListener());

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

  @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ù)方向計(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);
 

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

相關(guān)文章

  • Android Https證書(shū)過(guò)期的兩種解決方案

    Android Https證書(shū)過(guò)期的兩種解決方案

    應(yīng)該有很多小伙伴遇到這樣一個(gè)問(wèn)題,在線上已發(fā)布的app里,關(guān)于https的cer證書(shū)過(guò)期,從而導(dǎo)致app所有網(wǎng)絡(luò)請(qǐng)求失效無(wú)法使用,這篇文章主要介紹了Android Https證書(shū)過(guò)期的解決方案,需要的朋友可以參考下
    2022-12-12
  • Android實(shí)現(xiàn)第三方授權(quán)登錄、分享以及獲取用戶(hù)資料

    Android實(shí)現(xiàn)第三方授權(quán)登錄、分享以及獲取用戶(hù)資料

    本篇文章介紹了Android實(shí)現(xiàn)第三方授權(quán)登錄、分享以及獲取用戶(hù)資料,詳細(xì)的介紹了第三方授權(quán)登錄的實(shí)現(xiàn)代碼,有需要的朋友可以了解一下。
    2016-11-11
  • Android ListView實(shí)現(xiàn)上拉加載下拉刷新和滑動(dòng)刪除功能

    Android ListView實(shí)現(xiàn)上拉加載下拉刷新和滑動(dòng)刪除功能

    這篇文章主要為大家詳細(xì)介紹了Android ListView實(shí)現(xiàn)上拉加載下拉刷新和滑動(dòng)刪除功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • Android RecyclerView點(diǎn)擊事件

    Android RecyclerView點(diǎn)擊事件

    這篇文章主要為大家詳細(xì)介紹了Android RecyclerView點(diǎn)擊事件的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-02-02
  • Android view繪制流程詳解

    Android view繪制流程詳解

    View 的繪制是在 ViewRoot 的 performTraversals() 開(kāi)始的,它歷經(jīng) measure(測(cè)量), layout(布局), draw(繪制) 三個(gè)流程將 View 顯示在屏幕上。
    2021-05-05
  • 使用PlatformView將?Android?控件view制作成Flutter插件

    使用PlatformView將?Android?控件view制作成Flutter插件

    這篇文章主要為大家介紹了使用PlatformView將?Android?控件view制作成Flutter插件實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • Android如何禁止向EditText控件中輸入內(nèi)容詳解

    Android如何禁止向EditText控件中輸入內(nèi)容詳解

    EditText是接受用戶(hù)輸入信息的最重要控件。下面這篇文章主要給大家介紹了關(guān)于Android如何禁止向EditText控件中輸入內(nèi)容的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-09-09
  • android保存Bitmap圖片到指定文件夾示例

    android保存Bitmap圖片到指定文件夾示例

    android把Bitmap圖片保存到指定文件夾中,具體實(shí)現(xiàn)方法如下,感興趣的朋友可以參考下哈,希望對(duì)大家有所幫助
    2013-06-06
  • Android webview實(shí)現(xiàn)拍照的方法

    Android webview實(shí)現(xiàn)拍照的方法

    這篇文章主要介紹了Android webview實(shí)現(xiàn)拍照的方法的相關(guān)資料,希望通過(guò)本文能幫助到大家實(shí)現(xiàn)這樣的功能,需要的朋友可以參考下
    2017-10-10
  • Android自定義控件實(shí)現(xiàn)按鈕滾動(dòng)選擇效果

    Android自定義控件實(shí)現(xiàn)按鈕滾動(dòng)選擇效果

    這篇文章主要為大家詳細(xì)介紹了Android自定義控件實(shí)現(xiàn)按鈕滾動(dòng)選擇效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07

最新評(píng)論

黄冈市| 大姚县| 西丰县| 泊头市| 清丰县| 巩留县| 集安市| 金湖县| 临颍县| 镇赉县| 平顶山市| 张家川| 杂多县| 紫阳县| 红河县| 佛教| 磴口县| 中阳县| 西畴县| 丹棱县| 高要市| 临泉县| 吐鲁番市| 怀远县| 博客| 凤凰县| 吴桥县| 博白县| 库尔勒市| 合作市| 邹城市| 连江县| 延津县| 昂仁县| 青浦区| 嘉禾县| 广南县| 邛崃市| 西吉县| 肃宁县| 和平区|