日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
Android開發(fā)之響應(yīng)觸摸事件

讓對(duì)象按預(yù)設(shè)程序進(jìn)行移動(dòng)確實(shí)可以吸引一些注意,比如旋轉(zhuǎn)三角形。但如果你想用OpenGL ES制圖實(shí)現(xiàn)用戶交互,又該怎么做呢?讓你的OpenGL ES應(yīng)用具有觸摸交互的關(guān)鍵在于擴(kuò)展對(duì) GLSurfaceView 類的實(shí)現(xiàn),重寫 onTouchEvent() 來監(jiān)聽觸摸事件。

創(chuàng)新互聯(lián)于2013年創(chuàng)立,先為愛民等服務(wù)建站,愛民等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為愛民企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。

本文主要向你展示如何監(jiān)聽觸摸事件,從而讓用戶來旋轉(zhuǎn)一個(gè)OpenGL ES對(duì)象。

建立一個(gè)觸摸監(jiān)聽器 - Setup a Touch Listener

為了讓你的OpenGL ES應(yīng)用程序?qū)τ|摸事件做出響應(yīng),你需要實(shí)現(xiàn) GLSurfaceView 類的 onTouchEvent() 方法。下面的一個(gè)實(shí)現(xiàn)的例子演示了如何監(jiān)聽 MotionEvent.ACTION_MOVE 事件,并把他們轉(zhuǎn)換成圖形旋轉(zhuǎn)的一個(gè)角度。

 
 
 
  1. @Override 
  2.     public boolean onTouchEvent(MotionEvent e) { 
  3.  
  4.     // MotionEvent提供了觸摸的輸入的細(xì)節(jié)以及其他輸入控制信息。 
  5.     //在這種情況下,你只需要關(guān)心觸摸位置改變的事件。 
  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.             //在中線上反向旋轉(zhuǎn) 
  17.             if (y > getHeight() / 2) { 
  18.               dx = dx *  -1 ; 
  19.             } 
  20.  
  21.             //反向旋轉(zhuǎn)至中線左側(cè) 
  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.     } 

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

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

顯示旋轉(zhuǎn)的角度 - Expose the Rotation Angle

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

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

應(yīng)用旋轉(zhuǎn) - Apply Rotation

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

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

當(dāng)你完成了以上步驟,運(yùn)行程序,就可以在屏幕上拖動(dòng)來旋轉(zhuǎn)那個(gè)三角形了。

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


當(dāng)前題目:Android開發(fā)之響應(yīng)觸摸事件
地址分享:http://www.5511xx.com/article/dheodie.html