package com.zlb.DemoRect2; import static android.opengl.GLES10.GL_CCW; import static android.opengl.GLES10.GL_FLOAT; import static android.opengl.GLES10.GL_TEXTURE_2D; import static android.opengl.GLES10.GL_TRIANGLE_STRIP; import static android.opengl.GLES10.GL_UNSIGNED_SHORT; import static android.opengl.GLES10.glDrawElements; import static android.opengl.GLES10.glEnable; import static android.opengl.GLES10.glFrontFace; import static android.opengl.GLES10.glTexCoordPointer; import static android.opengl.GLES10.glVertexPointer; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.FloatBuffer; import java.nio.ShortBuffer; import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL10; import javax.microedition.khronos.opengles.GL11; import android.app.Activity; import android.opengl.GLSurfaceView; import android.opengl.GLU; import android.opengl.GLSurfaceView.Renderer; import android.os.Bundle; import android.os.SystemClock; import android.util.Log; public class DemoRect2Activity extends Activity { GLSurfaceView mGLSurfaceView; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mGLSurfaceView = new GLSurfaceView(this); mGLSurfaceView.setRenderer(new RectRenderer()); setContentView(mGLSurfaceView); } @Override protected void onPause() { // TODO Auto-generated method stub super.onPause(); mGLSurfaceView.onPause(); } @Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); mGLSurfaceView.onResume(); } } class RectRenderer implements Renderer { private Triangle mTriangle; private long mLastTime; public RectRenderer() { mTriangle = new Triangle(); } public void onDrawFrame(GL10 gl) { gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); gl.glMatrixMode(GL10.GL_MODELVIEW); gl.glLoadIdentity(); // gl.glTranslatef(0.0f, 0.0f, -8.0f); GLU.gluLookAt(gl, 0f, 0f, 1f, 0f, 0f, 0f, 0f, 1f, 0f); long time = SystemClock.uptimeMillis() % 4000L; float angle = 0.090f * ((int) time); Log.d("zhang", "///////////////////////////////////////=======angle = "+angle); gl.glRotatef(angle, 0, 1f, 0); mTriangle.draw(gl); } public void onSurfaceChanged(GL10 gl, int width, int height) { if (height == 0) { height = 1; } gl.glViewport(0, 0, width, height); gl.glMatrixMode(GL10.GL_PROJECTION); gl.glLoadIdentity(); Log .d("zhanglibin", ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"); // GLU.gluPerspective(gl, 45.0f, (float) width / (float) height, 0.1f, // 100.0f); // gl.glFrustumf(-(float)width/height,(float)width/height, -1f, 1f, 2f, 100f); // GLU.gluOrtho2D(gl, 0f, (float)width, 0f, (float)height); // gl.glOrthof(-(float)width/2, (float)width/2, -(float)height/2, // (float)height/2, -1, 100f); GLU.gluOrtho2D(gl, -(float)width/2, (float)width/2, -(float)height/2, (float)height/2); gl.glMatrixMode(GL10.GL_MODELVIEW); gl.glLoadIdentity(); } public void onSurfaceCreated(GL10 gl, EGLConfig config) { gl.glShadeModel(GL10.GL_SMOOTH); gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); gl.glClearDepthf(1.0f); gl.glDepthFunc(GL10.GL_LEQUAL); gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST); } } class Triangle { public Triangle() { ByteBuffer vbb = ByteBuffer.allocateDirect(VERTS * 3 * 4); vbb.order(ByteOrder.nativeOrder()); mFVertexBuffer = vbb.asFloatBuffer(); ByteBuffer tbb = ByteBuffer.allocateDirect(VERTS * 2 * 4); tbb.order(ByteOrder.nativeOrder()); mTexBuffer = tbb.asFloatBuffer(); ByteBuffer ibb = ByteBuffer.allocateDirect(VERTS * 2); ibb.order(ByteOrder.nativeOrder()); mIndexBuffer = ibb.asShortBuffer(); // float[] coords = { // // X, Y, Z // -0.5f, -0.25f, 0, 0.5f, -0.25f, 0, 0.0f, 0.559016994f, 0 }; // float[] coords = { // // X, Y, Z // 0, 0, -20, 1, 0, -20, 0.5f, 1, -20 }; float[] coords = { // X, Y, Z 100f, -100f, 0f, -100f, -100f, 0f, 100f, 100f, 0f, -100f, 100f, 0f}; for (int i = 0; i < VERTS; i++) { for (int j = 0; j < 3; j++) { mFVertexBuffer.put(coords[i * 3 + j] * 2.0f); } } for (int i = 0; i < VERTS; i++) { for (int j = 0; j < 2; j++) { mTexBuffer.put(coords[i * 3 + j] * 2.0f + 0.5f); } } for (int i = 0; i < VERTS; i++) { mIndexBuffer.put((short) i); } mFVertexBuffer.position(0); mTexBuffer.position(0); mIndexBuffer.position(0); } public float getWidth() { return 0f; } public void draw(GL10 gl) { glFrontFace(GL_CCW); gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); glVertexPointer(3, GL_FLOAT, 0, mFVertexBuffer); glEnable(GL_TEXTURE_2D); glDrawElements(GL_TRIANGLE_STRIP, VERTS, GL_UNSIGNED_SHORT, mIndexBuffer); } private final static int VERTS = 4; private FloatBuffer mFVertexBuffer; private FloatBuffer mTexBuffer; private ShortBuffer mIndexBuffer; }
旋转效果不咋滴,和GLU.gluOrtho2D这个方法有关,因为这个方法是正投影,如果把这个方法替换为GLU.gluPerspective或者gl.glFrustumf则效果正常。
显示单位px和dip以及sp的区别
dip: device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA、HVGA和QVGA 推荐使用这个,不依赖像素。
px: pixels(像素). 不同设备显示效果相同,一般我们HVGA代表320x480像素,这个用的比较多。
pt: point,是一个标准的长度单位,1pt=1/72英寸,用于印刷业,非常简单易用;
sp: scaled pixels(放大像素). 主要用于字体显示best for textsize。
由此,根据 google 的建议,TextView 的字号最好使用 sp 做单位,而且查看
TextView
的源码可知 Android 默认使用 sp 作为字号单位。
###################################################################
关于换算(以 sp 和 pt 为例)
查看 TextView 等类的源码,可知:
case COMPLEX_UNIT_PX:
return value;
case COMPLEX_UNIT_SP:
return value * metrics.scaledDensity;
case COMPLEX_UNIT_PT:
return value * metrics.xdpi * (1.0f/72);
--------------------------
scaledDensity = DENSITY_DEVICE / (float) DENSITY_DEFAULT;
xdpi = DENSITY_DEVICE;
--------------------------
DENSITY_DEFAULT = DENSITY_MEDIUM = 160;
============================================
所以: 假设 pt 和 sp 取相同的值 1,则可设 1pt 和 1sp 之间系数为 x,
1 * DENSITY_DEVICE / 72 = x * 1 * DENSITY_DEVICE / 160 =>
x = 160 / 72 = 2.2222
也就是说在 Android 中, 1pt 大概等于 2.22sp
以上供参考,如果 UI 能够以 sp 为单位提供设计是最好的,如果设计中没有 sp
的概念,则开发人员也可以通过适当的换算取近似值。
转载内容: http://hi.baidu.com/lfcaolibin/blog/item/f3f60d1e438deefee0fe0bae.html
什么是Dip和Sp
过去,程序员通常以像素为单位设计计算机用户界面。例如,定义一个宽度为300像素的表单字段,列之间的间距为5个像素,图标大小为16×16像素 等。这样处理的问题在于,如果在一个每英寸点数(dpi)更高的新显示器上运行该程序,则用户界面会显得很小。在有些情况下,用户界面可能会小到难以看清 内容。
与分辨率无关的度量单位可以解决这一问题。Android支持下列所有单位。
px(像素):屏幕上的点。
in(英寸):长度单位。
mm(毫米):长度单位。
pt(磅):1/72英寸。
dp(与密度无关的像素):一种基于屏幕密度的抽象单位。在每英寸160点的显示器上,1dp = 1px。
dip:与dp相同,多用于android/ophone示例中。
sp(与刻度无关的像素):与dp类似,但是可以根据用户的字体大小首选项进行缩放。
为了使用户界面能够在现在和将来的显示器类型上正常显示,建议大家始终使用sp作为文字大小的单位,将dip作为其他元素的单位。当然,也可以考虑使用矢量图形,而不是用位图
来源:
http://sifutian.iteye.com/blog/680935
LLVM带了了ARC,神一样的东西~梦幻般的思想。
彻底了解了GC和引用计数那个好的争论。
Automatic Reference Counting
Automatic Reference Counting (ARC) for Objective-C makes memory management the job of the compiler. By enabling ARC with the new Apple LLVM compiler, you will never need to type retain or release again, dramatically simplifying the development process, while reducing crashes and memory leaks. The compiler has a complete understanding of your objects, and releases each object the instant it is no longer used, so apps run as fast as ever, with predictable, smooth performance.