多點觸控

      網友投稿 804 2025-04-01

      1.要了解多點觸控,我們必須先了解一下View的生命周期,畢竟在Android用的到多點觸控的地方,一般都是自定義控件。就像Fragment和Activity都有生命周期一樣,View也有自己的生命周期。該生命周期并不直接和展示它的Fragment或者Activity相連,相反,它和顯示它的窗口狀態已經渲染循環相關。


      當視圖被添加到View層次結構中時,第一個被回調的函數是View.onAttachedToWindow(),這標志著它現在可以加載所需的資源了,構建自定義視圖時,開發者應該重載該方法,并在該方法中加載所有資源并初始化視圖所需的依賴。基本上,所有耗時的初始化操作都應放在該方法中。

      還有一個匹配的回調名為View.onDetachedFromWindow(),從View層次結構中移除視圖時調用這個方法。在這里,你需要關注那些需要顯式清理的操作,比如所有被加載的資源,啟動的Service,或者其他依賴。

      試圖被添加到View層次結構中之后,它會經過一個循環,該循環首先計算動畫,接下來會依次調用View.onMeasure(),View.onLayout(),View.onDraw()等方法。系統會確保這些方法每次都按完全相同的順序被調用.

      View的生命周期如下:

      View.onAttachedToWindow()--->動畫視圖--->View.onMeasure()--->View.onLayout()--->View.onDraw()--->View.onDetachedFromWindow();

      在onLayout()方法中,計算每個按鍵的大小和位置,在onDraw()方法中,應避免執行任何耗時的操作,而只關注實際的繪制,從而避免潛在的性能問題.onMeasure()一般配合onlayout一起使用。

      當手指按下屏幕的時候系統會回調View的onTouchEvent();所以多點觸控的大部分代碼都寫在該方法中.

      2.多點觸控

      多點觸控的基本方法和參數

      public?boolean?onTouchEvent(MotionEvent?event)

      參數event:參數event為手機屏幕觸摸事件封裝類的對象,其中封裝了該事件的所有信息,例如觸摸的位置、觸摸的類型以及觸摸的時間等。該對象會在用戶觸摸手機屏幕時被創建。

      返回值:該方法的返回值機理與鍵盤響應事件的相同,同樣是當已經完整地處理了該事件且不希望其他回調方法再次處理時返回true,否則返回false。

      event.getAction() //獲取觸控動作比如ACTION_DOWN

      event.getPointerCount(); //獲取觸控點的數量,比如2則可能是兩個手指同時按壓屏幕

      event.getPointerId(nID); //對于每個觸控的點的細節,我們可以通過一個循環執行getPointerId方法獲取索引

      event.getX(nID); //獲取第nID個觸控點的x位置

      event.getY(nID); //獲取第nID個點觸控的y位置

      event.getPressure(nID); //LCD可以感應出用戶的手指壓力,當然具體的級別由驅動和物理硬件決定的

      event.getDownTime() //按下開始時間

      event.getEventTime() // 事件結束時間

      event.getEventTime()-event.getDownTime()); //總共按下時花費時間

      event.getActionIndex()//獲取觸摸手指的坐標ID也是上面的nID

      event.getPointerCount()//獲取有多少個手指按下

      當然這里有個小小變化,在Android4.2以后,就基本不getAction獲取觸摸動作而是用event.getActionMasked()代替.

      下面寫一小段程序供參考:

      public class MyView extends View {

      public MyView(Context context) {

      super(context);

      }

      public MyView(Context context, AttributeSet attrs) {

      super(context, attrs);

      }

      public MyView(Context context, AttributeSet attrs, int defStyle) {

      super(context, attrs, defStyle);

      }

      @Override

      protected void onAttachedToWindow() {

      super.onAttachedToWindow();

      }

      //因為舉例簡單起見,按照480*800的手機繪制的四個矩形

      @Override

      protected void onDraw(Canvas canvas) {

      super.onDraw(canvas);

      Paint paint = new Paint();

      paint.setColor(Color.RED);

      paint.setStyle(Style.STROKE);

      canvas.drawRect(0, 0, 480, 200, paint);

      canvas.drawRect(0, 200, 480, 400, paint);

      canvas.drawRect(0, 400, 480, 600, paint);

      canvas.drawRect(0, 600, 480, 800, paint);

      }

      //具體酷炫的操作都寫在這里,比如以四個矩形為鋼琴鍵,播放特定音效等等

      @Override

      public boolean onTouchEvent(MotionEvent event) {

      int pointerCount = event.getPointerCount();//獲取有多少個手指按下

      int actionIndex = event.getActionIndex();//獲取手指按下的唯一索引

      int action = event.getActionMasked();//獲取按鍵的特征

      int id = event.getPointerId(actionIndex);//獲取索引

      if ((action == MotionEvent.ACTION_DOWN || action == MotionEvent.ACTION_POINTER_DOWN)) {

      多點觸控

      Log.i("MyView", event.getX(actionIndex)+"-" + event.getY(actionIndex));

      }

      return true;

      }

      }

      上面程序是不是少了一個onLayout()方法,沒錯,在此方法里面就可以根據特定手機繪制特定的圖形,因為本文具體講解多點觸控,不在于介紹完整的實例故略過。

      Android

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:WPS表格辦公—-啟用并自定義任務窗格的方法(wps管理任務窗格)
      下一篇:WPS表格技巧—返回N個工作日以后日期(wps表格日期復制完日期不對了)
      相關文章
      亚洲国产精彩中文乱码AV| 亚洲精品亚洲人成在线观看下载| 国产精品日本亚洲777| 亚洲娇小性xxxx色| 亚洲乱码中文论理电影| 亚洲国产成人综合| 亚洲国产日韩女人aaaaaa毛片在线| 亚洲精品美女久久777777| 亚洲日韩一页精品发布| 亚洲午夜福利717| 亚洲亚洲人成综合网络| 亚洲国产精品VA在线看黑人| 在线亚洲精品自拍| 亚洲精品无码mv在线观看网站| 亚洲日韩国产精品第一页一区| 亚洲一区二区三区影院| 中文字幕在线亚洲精品| 亚洲精品无码久久千人斩| 亚洲Av熟妇高潮30p| 亚洲伊人tv综合网色| 亚洲精品永久www忘忧草| 亚洲激情黄色小说| 亚洲av片不卡无码久久| 亚洲色精品三区二区一区| 亚洲欧美aⅴ在线资源| 337p日本欧洲亚洲大胆人人| 亚洲第一区精品观看| 国产精品亚洲高清一区二区| 亚洲色婷婷六月亚洲婷婷6月| 国产亚洲成AV人片在线观黄桃| 亚洲av网址在线观看| 91亚洲精品麻豆| 亚洲熟妇无码一区二区三区导航| 亚洲AV日韩AV一区二区三曲| 一区国严二区亚洲三区| 亚洲无av在线中文字幕| 久久精品国产亚洲AV大全| 亚洲人成网站日本片| 亚洲av无码有乱码在线观看| 亚洲欧洲一区二区三区| 亚洲AV无码久久精品狠狠爱浪潮|