AndroidGlobalTime 是一个用来查看全球各地时间的运行在 Android 手机平台上的小软件,通过旋转地球来查看对应的地区时间。
效果如图:
该项目共10个目标文件!~
Shape抽象类:使用OpenGL ES绘制各种三维对象的抽象父类,每个子类是负责建立NIO缓冲区的顶点,纹理坐标,颜色,法线和指数。
Annulus类继承Shape抽象类:实现绘制一个环与一个指定的中心、以及内外半径。每一个彩色和其它像素的内圈和外圈的颜色都由内插法。
City类:代表一个城市、一个相关的位置、时区名称。
Clock类:实现绘制一个模拟时钟面的类与一个城市的当前时间信息。
GlobalTime类:显示主界面。
GTView类:主界面视图。
Message类:自定义消息体,一个文本和一个有效值。
GLView类:
Texture类:文本
Sphere类继承Shape抽象类:实现球。
PointCloud类继承Shape抽象类:绘制在夜侧的城市的灯光。
LatLongSphere类:纬度经度圈。
绘画实现:
/**
* 绘制给定的形状,发出这种形状的偏好设定纹理坐标,法线和颜色。
*/
public void draw(GL10 gl) {
gl.glVertexPointer(3, GL10.GL_FIXED, 0, mVertexBuffer);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
if (mEmitTextureCoordinates) {
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
gl.glTexCoordPointer(2, GL10.GL_FIXED, 0, mTexcoordBuffer);
gl.glEnable(GL10.GL_TEXTURE_2D);
} else {
gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
gl.glDisable(GL10.GL_TEXTURE_2D);
}
if (mEmitNormals) {
gl.glEnableClientState(GL10.GL_NORMAL_ARRAY);
gl.glNormalPointer(GL10.GL_FIXED, 0, mNormalBuffer);
} else {
gl.glDisableClientState(GL10.GL_NORMAL_ARRAY);
}
if (mEmitColors) {
gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
gl.glColorPointer(4, GL10.GL_FIXED, 0, mColorBuffer);
} else {
gl.glDisableClientState(GL10.GL_COLOR_ARRAY);
}
gl.glDrawElements(mPrimitive,
mNumIndices > 0 ? mNumIndices : mIndexBuffer.capacity(),
mIndexDatatype,
mIndexBuffer);
}
关键视图有GLView和GTView!实现了3D绘画以及时间显示~
现在看下项目附带的测试手势的实例,效果如图:
它们分别是两个不同的类,如下:
//实现手势手别监听
public class GesturesActivity extends Activity implements OnGesturePerformedListener
{
private GestureLibrary mLibrary;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//加载资源
mLibrary = GestureLibraries.fromRawResource(this, R.raw.spells);
if (!mLibrary.load())
{
finish();
}
GestureOverlayView gestures = (GestureOverlayView) findViewById(R.id.gestures);
gestures.addOnGesturePerformedListener(this);
}
public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture)
{
ArrayList<Prediction> predictions = mLibrary.recognize(gesture);
// 我们希望至少有一个预测
if (predictions.size() > 0)
{
Prediction prediction = predictions.get(0);
// 我们希望至少有一些信心的结果
if (prediction.score > 1.0)
{
//显示语法
Toast.makeText(this, prediction.name, Toast.LENGTH_SHORT).show();
}
}
}
}
public class GesturesListActivity extends ListActivity implements OnGesturePerformedListener
{
private GestureLibrary mLibrary;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// Populate the activity with the names of our contacts
Cursor query = managedQuery(Contacts.People.CONTENT_URI, new String[]
{ Contacts.People._ID, Contacts.People.DISPLAY_NAME }, null, null, Contacts.People.DEFAULT_SORT_ORDER);
ListAdapter adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, query, new String[]
{ Contacts.People.DISPLAY_NAME }, new int[]
{ android.R.id.text1 });
setListAdapter(adapter);
mLibrary = GestureLibraries.fromRawResource(this, R.raw.actions);
if (!mLibrary.load())
{
finish();
}
GestureOverlayView gestures = (GestureOverlayView) findViewById(R.id.gestures);
gestures.addOnGesturePerformedListener(this);
}
public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture)
{
ArrayList<Prediction> predictions = mLibrary.recognize(gesture);
if (predictions.size() > 0)
{
if (predictions.get(0).score > 1.0)
{
String action = predictions.get(0).name;
if ("action_add".equals(action))
{
Toast.makeText(this, "Adding a contact", Toast.LENGTH_SHORT).show();
} else if ("action_delete".equals(action))
{
Toast.makeText(this, "Removing a contact", Toast.LENGTH_SHORT).show();
} else if ("action_refresh".equals(action))
{
Toast.makeText(this, "Reloading contacts", Toast.LENGTH_SHORT).show();
}
}
}
}
}
源码简单易懂!~
学习的目标是成熟!~~~