/*
* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.ex;
import java.io.IOException;
import java.io.InputStream;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.opengl.GLSurfaceView;
import android.opengl.GLUtils;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.widget.Toast;
/**
* Wrapper activity demonstrating the use of {@link GLSurfaceView}, a view that
* uses OpenGL drawing into a dedicated surface.
*
* Shows: + How to redraw in response to user input.
*/
public class Main extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Create our Preview view and set it as the content of our
// Activity
mGLSurfaceView = new TouchSurfaceView(this);
setContentView(mGLSurfaceView);
mGLSurfaceView.requestFocus();
mGLSurfaceView.setFocusableInTouchMode(true);
}
@Override
protected void onResume() {
// Ideally a game should implement onResume() and onPause()
// to take appropriate action when the activity looses focus
super.onResume();
mGLSurfaceView.onResume();
}
@Override
protected void onPause() {
// Ideally a game should implement onResume() and onPause()
// to take appropriate action when the activity looses focus
super.onPause();
mGLSurfaceView.onPause();
}
private GLSurfaceView mGLSurfaceView;
}
/**
* Implement a simple rotation control.
*
*/
class TouchSurfaceView extends GLSurfaceView {
private boolean axesX = true;
public void setAxesX(boolean b) {
axesX = b;
}
public TouchSurfaceView(Context context) {
super(context);
mRenderer = new CubeRenderer(context);
setRenderer(mRenderer);
setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
}
@Override
public boolean onTrackballEvent(MotionEvent e) {
float dx = Math.abs(e.getX() * TRACKBALL_SCALE_FACTOR);
float dy = Math.abs(e.getY() * TRACKBALL_SCALE_FACTOR);
if (dx > dy && dx > 2.5) {
mRenderer.mAngleX += e.getX() * TRACKBALL_SCALE_FACTOR;
mRenderer.mAngleY += e.getY() * TRACKBALL_SCALE_FACTOR;
this.setAxesX(true);
} else if (dx < dy && dy > 2.5) {
mRenderer.mAngleX += e.getX() * TRACKBALL_SCALE_FACTOR;
mRenderer.mAngleY += e.getY() * TRACKBALL_SCALE_FACTOR;
this.setAxesX(false);
}
requestRender();
return true;
}
@Override
public boolean onTouchEvent(MotionEvent e) {
float x = e.getX();
float y = e.getY();
switch (e.getAction()) {
case MotionEvent.ACTION_MOVE:
float dx = x - mPreviousX;
float dy = y - mPreviousY;
if (Math.abs(dx) > Math.abs(dy) && Math.abs(dx) > 2.5) {
mRenderer.mAngleX += dx * TOUCH_SCALE_FACTOR;
mRenderer.mAngleY += dy * TOUCH_SCALE_FACTOR;
this.setAxesX(true);
} else if (Math.abs(dx) < Math.abs(dy) && Math.abs(dy) > 2.5) {
mRenderer.mAngleX += dx * TOUCH_SCALE_FACTOR;
mRenderer.mAngleY += dy * TOUCH_SCALE_FACTOR;
this.setAxesX(false);
}
requestRender();
}
mPreviousX = x;
mPreviousY = y;
return true;
}
/**
* Render a cube.
*/
private class CubeRenderer implements GLSurfaceView.Renderer {
public CubeRenderer(Context context) {
mContext = context;
mCube = new Cube();
}
public void onDrawFrame(GL10 gl) {
Log.i("=============", "this.mAngleX=" + this.mAngleX
+ ",this.mAngleY=" + this.mAngleY);
gl.glTexEnvx(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE,
GL10.GL_MODULATE);
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
MyUtil.deBug("drawFrame");
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
// gl.glTranslatef(0, 0.0f, -1.0f);
if (axesX) {
gl.glRotatef(mAngleX, 0, 1, 0);
} else {
gl.glRotatef(mAngleY, 1, 0, 0);
}
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
mCube.draw(gl);
}
// 当屏幕 改变时候,比如手机横着拿,变成竖着拿,先onSurfaceCreated 在两次onSurfaceChanged 。
public void onSurfaceChanged(GL10 gl, int width, int height) {
gl.glViewport(0, 0, 320, 320);
/**
* float ratio = (float) width / height;
* gl.glMatrixMode(GL10.GL_PROJECTION); gl.glLoadIdentity();
* gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);
*
* gl.glMatrixMode(GL10.GL_MODELVIEW);
**/
// Toast.makeText(mContext, "width=" + width,
// Toast.LENGTH_SHORT).show();
}
// 当屏幕 改变时候,比如手机横着拿,变成竖着拿,先onSurfaceCreated 在两次onSurfaceChanged 。
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
// 载入纹理 自己写的方法
loadTexture(gl, 1, R.drawable.cube_front);
loadTexture(gl, 2, R.drawable.cube_back);
loadTexture(gl, 3, R.drawable.cube_left);
loadTexture(gl, 4, R.drawable.cube_right);
loadTexture(gl, 5, R.drawable.cube_top);
loadTexture(gl, 6, R.drawable.cube_bottom);
gl.glDisable(GL10.GL_DITHER);
gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);
gl.glClearColor(1, 1, 1, 1);
gl.glEnable(GL10.GL_CULL_FACE);
gl.glShadeModel(GL10.GL_SMOOTH);
gl.glEnable(GL10.GL_DEPTH_TEST);
// 默认旋转
gl.glRotatef(10.0f, 1.0f, 1.0f, 0);
}
public void loadTexture(GL10 gl, int no, int drawableId) {
// 定义纹理
int[] textures = new int[1];
switch (no) {
// 绑定生成绑定纹理
case 1:
gl.glGenTextures(1, textures, 0);
Cube.mTextureID_front = textures[0];
gl.glBindTexture(GL10.GL_TEXTURE_2D, Cube.mTextureID_front);
break;
case 2:
gl.glGenTextures(1, textures, 0);
Cube.mTextureID__back = textures[0];
gl.glBindTexture(GL10.GL_TEXTURE_2D, Cube.mTextureID__back);
break;
case 3:
gl.glGenTextures(1, textures, 0);
Cube.mTextureID_left = textures[0];
gl.glBindTexture(GL10.GL_TEXTURE_2D, Cube.mTextureID_left);
break;
case 4:
gl.glGenTextures(1, textures, 0);
Cube.mTextureID_right = textures[0];
gl.glBindTexture(GL10.GL_TEXTURE_2D, Cube.mTextureID_right);
break;
case 5:
gl.glGenTextures(1, textures, 0);
Cube.mTextureID_top = textures[0];
gl.glBindTexture(GL10.GL_TEXTURE_2D, Cube.mTextureID_top);
break;
case 6:
gl.glGenTextures(1, textures, 0);
Cube.mTextureID_bottom = textures[0];
gl.glBindTexture(GL10.GL_TEXTURE_2D, Cube.mTextureID_bottom);
break;
}
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER,
GL10.GL_NEAREST);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER,
GL10.GL_LINEAR);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S,
GL10.GL_CLAMP_TO_EDGE);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T,
GL10.GL_CLAMP_TO_EDGE);
gl.glTexEnvf(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE,
GL10.GL_REPLACE);
InputStream is = mContext.getResources()
.openRawResource(drawableId);
Bitmap bitmapTmp;
try {
bitmapTmp = BitmapFactory.decodeStream(is);
} finally {
try {
is.close();
} catch (IOException e) {
// Ignore.
}
}
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmapTmp, 0);
bitmapTmp.recycle();
}
private Cube mCube;
// private int mTextureID;
private Context mContext;
public fl
Android应用源码之3D立方体旋转demo-IT计算机-毕业设计.zip
版权申诉
29 浏览量
2022-04-06
20:45:03
上传
评论
收藏 2.23MB ZIP 举报
芝麻粒儿
- 粉丝: 5w+
- 资源: 2万+
最新资源
- Qt开发知识、经验总结 包括Qss,数据库,Excel,Model/View等
- IV数据.xlsx
- 一些深度学习中的小例子,适合新手学习使用
- foldcraftlauncher_262944.apk
- 珍藏多年的基于matlab实现潮流计算程序源代码集合,包含多个潮流计算程序.rar
- 使用FPGA实现串-并型乘法器
- 基于matlab实现针对基于双曲线定位的DV-Hop算法中误差误差出一种基于加权双曲线定位的DV-Hop改进算法.rar
- 基于matlab实现由遗传算法开发的整数规划,车辆调度问题.rar
- 电视家7.0(对电视配置要求高).apk
- 免费计算机毕业设计-基于JavaEE的医院病历管理系统设计与实现(包含论文+源码)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈