xml代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/lla"
> <!-- LinearLayout布局 -->
<RatingBar
android:id="@+id/RatingBar01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:max="5"
android:rating="1"
>
</RatingBar> <!-- 添加ToggleButton -->
</LinearLayout>
Ball类
package com.example.android_sample_5_2;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.IntBuffer;
import java.util.ArrayList;
import javax.microedition.khronos.opengles.GL10;
public class Ball {
private IntBuffer mVertexBuffer;//顶点坐标数据缓冲
private IntBuffer mNormalBuffer;//顶点法向量数据缓冲
private ByteBuffer mIndexBuffer;//顶点构建索引数据缓冲
public float mAngleX;//沿x轴旋转角度
public float mAngleY;//沿y轴旋转角度
public float mAngleZ;//沿z轴旋转角度
int vCount=0;
int iCount=0;
public Ball(int scale)
{
//顶点坐标数据的初始化================begin============================
final int UNIT_SIZE=10000;
ArrayList<Integer> alVertix=new ArrayList<Integer>();//存放顶点坐标的ArrayList
final int angleSpan=18;//将球进行单位切分的角度
for(int vAngle=-90;vAngle<=90;vAngle=vAngle+angleSpan)//垂直方向angleSpan度一份
{
for(int hAngle=0;hAngle<360;hAngle=hAngle+angleSpan)//水平方向angleSpan度一份
{//纵向横向各到一个角度后计算对应的此点在球面上的坐标
double xozLength=scale*UNIT_SIZE*Math.cos(Math.toRadians(vAngle));
int x=(int)(xozLength*Math.cos(Math.toRadians(hAngle)));
int z=(int)(xozLength*Math.sin(Math.toRadians(hAngle)));
int y=(int)(scale*UNIT_SIZE*Math.sin(Math.toRadians(vAngle)));
//将计算出来的XYZ坐标加入存放顶点坐标的ArrayList
alVertix.add(x);alVertix.add(y);alVertix.add(z);
}
}
vCount=alVertix.size()/3;//顶点的数量为坐标值数量的1/3,因为一个顶点有3个坐标
//将alVertix中的坐标值转存到一个int数组中
int vertices[]=new int[vCount*3];
for(int i=0;i<alVertix.size();i++)
{
vertices[i]=alVertix.get(i);
}
//创建顶点坐标数据缓冲
//vertices.length*4是因为一个整数四个字节
ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length*4);
vbb.order(ByteOrder.nativeOrder());//设置字节顺序
mVertexBuffer = vbb.asIntBuffer();//转换为int型缓冲
mVertexBuffer.put(vertices);//向缓冲区中放入顶点坐标数据
mVertexBuffer.position(0);//设置缓冲区起始位置
//创建顶点法向量数据缓冲
//vertices.length*4是因为一个float四个字节
ByteBuffer nbb = ByteBuffer.allocateDirect(vertices.length*4);
nbb.order(ByteOrder.nativeOrder());//设置字节顺序
mNormalBuffer = vbb.asIntBuffer();//转换为int型缓冲
mNormalBuffer.put(vertices);//向缓冲区中放入顶点坐标数据
mNormalBuffer.position(0);//设置缓冲区起始位置
//特别提示:由于不同平台字节顺序不同数据单元不是字节的一定要经过ByteBuffer
//转换,关键是要通过ByteOrder设置nativeOrder(),否则有可能会出问题
//顶点坐标数据的初始化===========