標籤:android color 使用 width os cti
/**
* 緩衝區工具類
*/
public class BufferUtil {
/**
* 將浮點數群組轉換成位元組緩衝區
*/
public static ByteBuffer arr2ByteBuffer(float[] arr){
ByteBuffer ibb = ByteBuffer.allocateDirect(arr.length * 4);
ibb.order(ByteOrder.nativeOrder());
FloatBuffer fbb = ibb.asFloatBuffer();
fbb.put(arr);
ibb.position(0);
return ibb ;
}
/**
* 將list轉換成位元組緩衝區
*/
public static ByteBuffer list2ByteBuffer(List<Float> list){
ByteBuffer ibb = ByteBuffer.allocateDirect(list.size() * 4);
ibb.order(ByteOrder.nativeOrder());
FloatBuffer fbb = ibb.asFloatBuffer();
for(Float f : list){
fbb.put(f);
}
ibb.position(0);
return ibb ;
}
}
/**
* 渲染器
*/
public abstract class AbstractMyRenderer implements android.opengl.GLSurfaceView.Renderer
{
private float ratio;
public float xrotate = 0f;//圍繞x軸旋轉角度
public float yrotate = 0f;//圍繞x軸旋轉角度
/**
* 1.
*/
public void onSurfaceCreated(GL10 gl, EGLConfig config)
{
//清平色
gl.glClearColor(0f, 0f, 0f, 1f);
//啟用頂點緩衝區數組
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
}
/**
* 2.
*/
public void onSurfaceChanged(GL10 gl, int width, int height) {
//設定視口
gl.glViewport(0, 0, width, height);
ratio = (float)width / (float)height;
//投影矩陣
gl.glMatrixMode(GL10.GL_PROJECTION);
//載入單位矩陣
gl.glLoadIdentity();
//設定平截頭體
gl.glFrustumf(-ratio, ratio, -1, 1, 3f, 7f); }
/**
* 3.
*/
public abstract void onDrawFrame(GL10 gl);
}
**
* 稜錐,正方形
*/
public class MyTriangleConeRenderer extends AbstractMyRenderer{
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
gl.glClearColor(0f, 0f, 0f, 1f);
//頂點緩衝區
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
//啟用顏色緩衝區
gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
}
public void onDrawFrame(GL10 gl) {
//清除顏色緩衝區和深度緩衝區
gl.glClear(GL10.GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_BUFFER_BIT);
//設定繪圖顏色
gl.glColor4f(1f, 0f, 0f, 1f);
//啟用深度測試
gl.glEnable(GL10.GL_DEPTH_TEST);
//啟用表面剔除
gl.glEnable(GL10.GL_CULL_FACE);
//指定前面()
//ccw:counter clock wise-->逆時針
//cw:clock wise--> 順時針
gl.glFrontFace(GL10.GL_CCW);
//剔除背面
gl.glCullFace(GL10.GL_BACK);
//GL10.GL_SMOOTH:平滑著色(預設)
//GL10.GL_FLAT:單調模式
gl.glShadeModel(GL10.GL_FLAT);
//操作模型視圖矩陣
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();
//設定眼球的參數
GLU.gluLookAt(gl,0f,0f,5f, 0f, 0f, 0f, 0f,1f,0f);
//旋轉角度
gl.glRotatef(xrotate, 1, 0, 0);
gl.glRotatef(yrotate, 0, 1, 0);
//計算點座標
float r = 0.5f ;//半徑
float x = 0f,y = 0f,z = -0.5f ;
/******************** 錐面 ************************/
//頂點座標集合
List<Float> coordsList = new ArrayList<Float>();
//添加錐頂點
coordsList.add(0f);
coordsList.add(0f);
coordsList.add(0.5f);
//頂點顏色集合
List<Float> colorList = new ArrayList<Float>();
colorList.add(1f);//r
colorList.add(0f);//g
colorList.add(0f);//b
colorList.add(1f);//a
/******************** 錐底 ************************/
//錐底座標
List<Float> coordsConeBottomList = new ArrayList<Float>();
coordsConeBottomList.add(0f);
coordsConeBottomList.add(0f);
coordsConeBottomList.add(-0.5f);
boolean flag = false ;
//底面
for(float alpha = 0f ; alpha < Math.PI * 6 ; alpha = (float) (alpha + Math.PI / 8)){
//錐面
x = (float) (r * Math.cos(alpha));
y = (float) (r * Math.sin(alpha));
coordsList.add(x);
coordsList.add(y);
coordsList.add(z);
//錐底座標
coordsConeBottomList.add(x);
coordsConeBottomList.add(y);
coordsConeBottomList.add(z);
//點顏色值
if(flag = !flag){
//黃色
colorList.add(1f);
colorList.add(1f);
colorList.add(0f);
colorList.add(1f);
}
else{
//紅色
colorList.add(1f);
colorList.add(0f);
colorList.add(0f);
colorList.add(1f);
}
}
//點顏色值
if(flag = !flag){
//黃色
colorList.add(1f);
colorList.add(1f);
colorList.add(0f);
colorList.add(1f);
}
else{
//紅色
colorList.add(1f);
colorList.add(0f);
colorList.add(0f);
colorList.add(1f);
}
//顏色緩衝區
ByteBuffer colorBuffer = BufferUtil.list2ByteBuffer(colorList);
gl.glColorPointer(4, GL10.GL_FLOAT, 0, colorBuffer);
//繪製錐面
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, BufferUtil.list2ByteBuffer(coordsList));
gl.glDrawArrays(GL10.GL_TRIANGLE_FAN, 0, coordsList.size() / 3);
//剔除正面
gl.glCullFace(GL10.GL_FRONT);
//繪製錐底
colorBuffer.position(4);
gl.glColorPointer(4, GL10.GL_FLOAT, 0, colorBuffer);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, BufferUtil.list2ByteBuffer(coordsConeBottomList));
gl.glDrawArrays(GL10.GL_TRIANGLE_FAN, 0, coordsConeBottomList.size() / 3);
}
}
//主介面
public class MainActivity extends Activity {
private AbstractMyRenderer render;
private MyGLSurfaceView view;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
view = new GLSurfaceView(this);
render = new MyTriangleConeRenderer();
view.setRenderer(render);
//GLSurfaceView.RENDERMODE_CONTINUOUSLY:持續渲染(預設)
//GLSurfaceView.RENDERMODE_WHEN_DIRTY:髒渲染,命令渲染
view.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
setContentView(view);
}
public boolean onKeyDown(int keyCode, KeyEvent event) {
float step = 5f ;
//up
if(keyCode == KeyEvent.KEYCODE_DPAD_UP){
render.xrotate = render.xrotate - step ;
} else if(keyCode == KeyEvent.KEYCODE_DPAD_DOWN){
render.xrotate = render.xrotate + step ;
} else if(keyCode == KeyEvent.KEYCODE_DPAD_LEFT){
render.yrotate = render.yrotate + step ;
} else if(keyCode == KeyEvent.KEYCODE_DPAD_RIGHT){
render.yrotate = render.yrotate - step ;
}
//請求渲染,和髒渲染配合使用
view.requestRender();
return super.onKeyDown(keyCode, event);
}
}