成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Android開發之響應觸摸事件

移動開發 Android
一般而言,事件是用戶與UI(圖形界面)進行交互的時候所觸發的操作。例如在手機屏幕上觸摸特定的區域就會觸發對應的事件,在Android 中這些事件將被傳送到事件處理器,它是一個專門接受事件對象并對其進行翻譯和處理的方法。

讓對象按預設程序進行移動確實可以吸引一些注意,比如旋轉三角形。但如果你想用OpenGL ES制圖實現用戶交互,又該怎么做呢?讓你的OpenGL ES應用具有觸摸交互的關鍵在于擴展對 GLSurfaceView 類的實現,重寫 onTouchEvent() 來監聽觸摸事件。

本文主要向你展示如何監聽觸摸事件,從而讓用戶來旋轉一個OpenGL ES對象。

建立一個觸摸監聽器 - Setup a Touch Listener

為了讓你的OpenGL ES應用程序對觸摸事件做出響應,你需要實現 GLSurfaceView 類的 onTouchEvent() 方法。下面的一個實現的例子演示了如何監聽 MotionEvent.ACTION_MOVE 事件,并把他們轉換成圖形旋轉的一個角度。

  1. @Override 
  2.     public boolean onTouchEvent(MotionEvent e) { 
  3.  
  4.     // MotionEvent提供了觸摸的輸入的細節以及其他輸入控制信息。 
  5.     //在這種情況下,你只需要關心觸摸位置改變的事件。 
  6.  
  7.     float x = e.getX(); 
  8.     float y = e.getY(); 
  9.  
  10.     switch (e.getAction()) { 
  11.         case MotionEvent.ACTION_MOVE: 
  12.  
  13.             float dx = x - mPreviousX; 
  14.             float dy = y - mPreviousY; 
  15.  
  16.             //在中線上反向旋轉 
  17.             if (y > getHeight() / 2) { 
  18.               dx = dx *  -1 ; 
  19.             } 
  20.  
  21.             //反向旋轉至中線左側 
  22.             if (x < getWidth() / 2) { 
  23.               dy = dy *  -1 ; 
  24.             } 
  25.  
  26.             mRenderer.mAngle +180.0f / 320 
  27.             requestRender(); 
  28.     } 
  29.  
  30.     mPreviousX = x; 
  31.     mPreviousY = y; 
  32.     return true
  33.     } 

需要注意的是,計算好旋轉角度后,這個方法調用了 requestRender() 來通知渲染器渲染畫面。由于這個畫面在沒有旋轉的變化時無需重繪,因此在本例中使用這種做法最高效。然而,如果你沒有用 setRenderMode() 方法請求渲染器僅在數據改變時才重繪,那么這種做法就不會對效率有影響了。因此,確保取消掉渲染器里對這一行代碼的注釋。

  1. public MyGLSurfaceView(Context context) { 
  2.     ... 
  3.     //僅當繪圖數據改變時繪制視圖 
  4.     setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY); 
  5.      } 

顯示旋轉的角度 - Expose the Rotation Angle

上面的示例代碼需要你在渲染器中添加一個公共成員來顯示旋轉角度。由于渲染器的代碼所運行的線程獨立于應用程序的用戶界面主線程之外,因此,你必須將這個公共變量聲明為 volatile。參見下面的代碼:

  1. public class MyGLRenderer implements GLSurfaceView.Renderer { 
  2.     ... 
  3.     public volatile float mAngle; 

應用旋轉 - Apply Rotation

要讓觸摸輸入產生旋轉,就需要注釋掉生成角度的代碼,改用觸摸輸入生成的角度 mAngle:

  1. public void onDrawFrame(GL10 gl) { 
  2.     ... 
  3.     //為三角形創建旋轉 
  4.     // long time = SystemClock.uptimeMillis() % 4000L; 
  5.     // float angle = 0.090f *  ((int) time); 
  6.     Matrix.setRotateM(mRotationMatrix, 0, mAngle, 00, -1.0f); 
  7.     //將旋轉矩陣與投影和相機視圖相結合 
  8.     Matrix.multiplyMM(mMVPMatrix, 0, mRotationMatrix, 0, mMVPMatrix, 0); 
  9.     //繪制三角形 
  10.     mTriangle.draw(mMVPMatrix); 
  11.     } 

當你完成了以上步驟,運行程序,就可以在屏幕上拖動來旋轉那個三角形了。

圖1.三角形在觸摸下旋轉(圓圈表示觸摸位置)

責任編輯:閆佳明 來源: wiki.eoe.cn
相關推薦

2016-12-08 22:59:47

觸摸事件android

2011-08-02 16:28:40

iPhone Web開發 事件

2017-12-21 15:42:08

iOS傳遞機制

2013-04-22 15:40:00

Android開發觸摸事件與點擊事件區別

2011-08-03 17:32:17

IOS UIScrollVi touch

2023-03-10 16:40:21

Frameworkinput觸摸事件

2014-04-29 13:58:11

OpenGL ESAndroid響應觸屏事件

2013-05-14 11:08:23

AIR Android觸摸事件鼠標事件

2021-08-11 14:29:20

鴻蒙HarmonyOS應用

2025-02-19 13:00:00

移動端觸摸事件響應速度JavaScrip

2013-09-13 13:15:28

AndroidWebViewJavaScript

2017-04-25 09:04:16

2017-01-11 18:44:43

React Nativ觸摸事件Android

2013-05-21 14:22:29

Android游戲開發捕獲屏幕雙擊事件

2011-08-17 10:09:25

iPhone開發UIWebViewTouch事件

2017-07-24 14:32:49

2013-05-21 11:33:11

Android游戲開發按鍵中斷事件

2023-10-12 22:44:16

iOS事件響應鏈

2009-04-14 08:14:09

AndroidGoogle移動OS

2022-02-09 00:08:26

黑客攻擊事件響應
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 狠狠干2020 | 欧美精品二区 | 亚洲一区二区免费视频 | 国产999精品久久久久久 | 中文字幕在线观看一区 | 欧美成人a∨高清免费观看 色999日韩 | 亚洲天堂一区 | 在线三级电影 | 亚洲精品一区二区在线观看 | 91观看 | 亚洲国产aⅴ成人精品无吗 综合国产在线 | 成人h动漫精品一区二区器材 | 在线观看免费国产 | 日本不卡一区二区三区在线观看 | 成人亚洲视频 | 国产一区二区三区精品久久久 | 国产电影一区二区在线观看 | 亚洲激情网站 | 午夜精品久久久久久久久久久久久 | 黄一级| 国产精品区一区二 | 日本国产欧美 | 国产aⅴ爽av久久久久久久 | 色欧美综合 | www国产成人免费观看视频,深夜成人网 | 91精品国产777在线观看 | 美女露尿口视频 | 国产精品免费小视频 | 一区二区久久电影 | 日本精品视频在线 | 亚洲精品久久久久中文字幕欢迎你 | 高清亚洲| 国产精品1区2区3区 男女啪啪高潮无遮挡免费动态 | 亚洲啪啪| av在线播放网址 | 福利精品| 日韩在线观看网站 | 99久久久久国产精品免费 | 精品在线一区二区三区 | 国产精品色 | 久久亚洲精品视频 |