Main.java
上传用户:saijinfu
上传日期:2018-08-05
资源大小:1961k
文件大小:8k
源码类别:

android开发

开发平台:

Java

  1. /*
  2.  * Copyright (C) 2008 The Android Open Source Project
  3.  *
  4.  * Licensed under the Apache License, Version 2.0 (the "License");
  5.  * you may not use this file except in compliance with the License.
  6.  * You may obtain a copy of the License at
  7.  *
  8.  *      http://www.apache.org/licenses/LICENSE-2.0
  9.  *
  10.  * Unless required by applicable law or agreed to in writing, software
  11.  * distributed under the License is distributed on an "AS IS" BASIS,
  12.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13.  * See the License for the specific language governing permissions and
  14.  * limitations under the License.
  15.  */
  16. package com.ex;
  17. import java.io.IOException;
  18. import java.io.InputStream;
  19. import javax.microedition.khronos.egl.EGLConfig;
  20. import javax.microedition.khronos.opengles.GL10;
  21. import android.app.Activity;
  22. import android.content.Context;
  23. import android.graphics.Bitmap;
  24. import android.graphics.BitmapFactory;
  25. import android.opengl.GLSurfaceView;
  26. import android.opengl.GLUtils;
  27. import android.os.Bundle;
  28. import android.util.Log;
  29. import android.view.Menu;
  30. import android.view.MenuItem;
  31. import android.view.MotionEvent;
  32. import android.widget.Toast;
  33. /**
  34.  * Wrapper activity demonstrating the use of {@link GLSurfaceView}, a view that
  35.  * uses OpenGL drawing into a dedicated surface.
  36.  * 
  37.  * Shows: + How to redraw in response to user input.
  38.  */
  39. public class Main extends Activity {
  40. @Override
  41. protected void onCreate(Bundle savedInstanceState) {
  42. super.onCreate(savedInstanceState);
  43. // Create our Preview view and set it as the content of our
  44. // Activity
  45. mGLSurfaceView = new TouchSurfaceView(this);
  46. setContentView(mGLSurfaceView);
  47. mGLSurfaceView.requestFocus();
  48. mGLSurfaceView.setFocusableInTouchMode(true);
  49. }
  50. @Override
  51. protected void onResume() {
  52. // Ideally a game should implement onResume() and onPause()
  53. // to take appropriate action when the activity looses focus
  54. super.onResume();
  55. mGLSurfaceView.onResume();
  56. }
  57. @Override
  58. protected void onPause() {
  59. // Ideally a game should implement onResume() and onPause()
  60. // to take appropriate action when the activity looses focus
  61. super.onPause();
  62. mGLSurfaceView.onPause();
  63. }
  64. private GLSurfaceView mGLSurfaceView;
  65. }
  66. /**
  67.  * Implement a simple rotation control.
  68.  * 
  69.  */
  70. class TouchSurfaceView extends GLSurfaceView {
  71. private boolean axesX = true;
  72. public void setAxesX(boolean b) {
  73. axesX = b;
  74. }
  75. public TouchSurfaceView(Context context) {
  76. super(context);
  77. mRenderer = new CubeRenderer(context);
  78. setRenderer(mRenderer);
  79. setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
  80. }
  81. @Override
  82. public boolean onTrackballEvent(MotionEvent e) {
  83. float dx = Math.abs(e.getX() * TRACKBALL_SCALE_FACTOR);
  84. float dy = Math.abs(e.getY() * TRACKBALL_SCALE_FACTOR);
  85. if (dx > dy && dx > 2.5) {
  86. mRenderer.mAngleX += e.getX() * TRACKBALL_SCALE_FACTOR;
  87. mRenderer.mAngleY += e.getY() * TRACKBALL_SCALE_FACTOR;
  88. this.setAxesX(true);
  89. } else if (dx < dy && dy > 2.5) {
  90. mRenderer.mAngleX += e.getX() * TRACKBALL_SCALE_FACTOR;
  91. mRenderer.mAngleY += e.getY() * TRACKBALL_SCALE_FACTOR;
  92. this.setAxesX(false);
  93. }
  94. requestRender();
  95. return true;
  96. }
  97. @Override
  98. public boolean onTouchEvent(MotionEvent e) {
  99. float x = e.getX();
  100. float y = e.getY();
  101. switch (e.getAction()) {
  102. case MotionEvent.ACTION_MOVE:
  103. float dx = x - mPreviousX;
  104. float dy = y - mPreviousY;
  105. if (Math.abs(dx) > Math.abs(dy) && Math.abs(dx) > 2.5) {
  106. mRenderer.mAngleX += dx * TOUCH_SCALE_FACTOR;
  107. mRenderer.mAngleY += dy * TOUCH_SCALE_FACTOR;
  108. this.setAxesX(true);
  109. } else if (Math.abs(dx) < Math.abs(dy) && Math.abs(dy) > 2.5) {
  110. mRenderer.mAngleX += dx * TOUCH_SCALE_FACTOR;
  111. mRenderer.mAngleY += dy * TOUCH_SCALE_FACTOR;
  112. this.setAxesX(false);
  113. }
  114. requestRender();
  115. }
  116. mPreviousX = x;
  117. mPreviousY = y;
  118. return true;
  119. }
  120. /**
  121.  * Render a cube.
  122.  */
  123. private class CubeRenderer implements GLSurfaceView.Renderer {
  124. public CubeRenderer(Context context) {
  125. mContext = context;
  126. mCube = new Cube();
  127. }
  128. public void onDrawFrame(GL10 gl) {
  129. Log.i("=============", "this.mAngleX=" + this.mAngleX
  130. + ",this.mAngleY=" + this.mAngleY);
  131. gl.glTexEnvx(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE,
  132. GL10.GL_MODULATE);
  133. gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
  134. MyUtil.deBug("drawFrame");
  135. gl.glMatrixMode(GL10.GL_PROJECTION);
  136. gl.glLoadIdentity();
  137. // gl.glTranslatef(0, 0.0f, -1.0f);
  138. if (axesX) {
  139. gl.glRotatef(mAngleX, 0, 1, 0);
  140. } else {
  141. gl.glRotatef(mAngleY, 1, 0, 0);
  142. }
  143. gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
  144. gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
  145. mCube.draw(gl);
  146. }
  147. // 当屏幕 改变时候,比如手机横着拿,变成竖着拿,先onSurfaceCreated 在两次onSurfaceChanged 。
  148. public void onSurfaceChanged(GL10 gl, int width, int height) {
  149. gl.glViewport(0, 0, 320, 320);
  150. /**
  151.  * float ratio = (float) width / height;
  152.  * gl.glMatrixMode(GL10.GL_PROJECTION); gl.glLoadIdentity();
  153.  * gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);
  154.  * 
  155.  * gl.glMatrixMode(GL10.GL_MODELVIEW);
  156.  **/
  157. // Toast.makeText(mContext, "width=" + width,
  158. // Toast.LENGTH_SHORT).show();
  159. }
  160. // 当屏幕 改变时候,比如手机横着拿,变成竖着拿,先onSurfaceCreated 在两次onSurfaceChanged 。
  161. public void onSurfaceCreated(GL10 gl, EGLConfig config) {
  162. // 载入纹理 自己写的方法
  163. loadTexture(gl, 1, R.drawable.cube_front);
  164. loadTexture(gl, 2, R.drawable.cube_back);
  165. loadTexture(gl, 3, R.drawable.cube_left);
  166. loadTexture(gl, 4, R.drawable.cube_right);
  167. loadTexture(gl, 5, R.drawable.cube_top);
  168. loadTexture(gl, 6, R.drawable.cube_bottom);
  169. gl.glDisable(GL10.GL_DITHER);
  170. gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);
  171. gl.glClearColor(1, 1, 1, 1);
  172. gl.glEnable(GL10.GL_CULL_FACE);
  173. gl.glShadeModel(GL10.GL_SMOOTH);
  174. gl.glEnable(GL10.GL_DEPTH_TEST);
  175. // 默认旋转
  176. gl.glRotatef(10.0f, 1.0f, 1.0f, 0);
  177. }
  178. public void loadTexture(GL10 gl, int no, int drawableId) {
  179. // 定义纹理
  180. int[] textures = new int[1];
  181. switch (no) {
  182. // 绑定生成绑定纹理
  183. case 1:
  184. gl.glGenTextures(1, textures, 0);
  185. Cube.mTextureID_front = textures[0];
  186. gl.glBindTexture(GL10.GL_TEXTURE_2D, Cube.mTextureID_front);
  187. break;
  188. case 2:
  189. gl.glGenTextures(1, textures, 0);
  190. Cube.mTextureID__back = textures[0];
  191. gl.glBindTexture(GL10.GL_TEXTURE_2D, Cube.mTextureID__back);
  192. break;
  193. case 3:
  194. gl.glGenTextures(1, textures, 0);
  195. Cube.mTextureID_left = textures[0];
  196. gl.glBindTexture(GL10.GL_TEXTURE_2D, Cube.mTextureID_left);
  197. break;
  198. case 4:
  199. gl.glGenTextures(1, textures, 0);
  200. Cube.mTextureID_right = textures[0];
  201. gl.glBindTexture(GL10.GL_TEXTURE_2D, Cube.mTextureID_right);
  202. break;
  203. case 5:
  204. gl.glGenTextures(1, textures, 0);
  205. Cube.mTextureID_top = textures[0];
  206. gl.glBindTexture(GL10.GL_TEXTURE_2D, Cube.mTextureID_top);
  207. break;
  208. case 6:
  209. gl.glGenTextures(1, textures, 0);
  210. Cube.mTextureID_bottom = textures[0];
  211. gl.glBindTexture(GL10.GL_TEXTURE_2D, Cube.mTextureID_bottom);
  212. break;
  213. }
  214. gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER,
  215. GL10.GL_NEAREST);
  216. gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER,
  217. GL10.GL_LINEAR);
  218. gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S,
  219. GL10.GL_CLAMP_TO_EDGE);
  220. gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T,
  221. GL10.GL_CLAMP_TO_EDGE);
  222. gl.glTexEnvf(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE,
  223. GL10.GL_REPLACE);
  224. InputStream is = mContext.getResources()
  225. .openRawResource(drawableId);
  226. Bitmap bitmapTmp;
  227. try {
  228. bitmapTmp = BitmapFactory.decodeStream(is);
  229. } finally {
  230. try {
  231. is.close();
  232. } catch (IOException e) {
  233. // Ignore.
  234. }
  235. }
  236. GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmapTmp, 0);
  237. bitmapTmp.recycle();
  238. }
  239. private Cube mCube;
  240. // private int mTextureID;
  241. private Context mContext;
  242. public float mAngleX;
  243. public float mAngleY;
  244. }
  245. private final float TOUCH_SCALE_FACTOR = 180.0f / 320;
  246. private final float TRACKBALL_SCALE_FACTOR = 18.0f;
  247. private CubeRenderer mRenderer;
  248. private float mPreviousX;
  249. private float mPreviousY;
  250. }