当前位置:  编程技术>移动开发
本页文章导读:
    ▪菱形3D范例        菱形3D实例 下面是具体的实现方法:首先需要建两个array,第一array是用来告诉opengl这个图形有哪些顶点:画一个三维的坐标轴,然后把你要画的点都算出来,然后放在这个array里。float l=1..........
    ▪ 3D圆桌面效果动画类        3D桌面效果动画类 public class CubeAnimation extends Animation implements Animation.AnimationListener { public static final int FACE_LEFT = 0; public static final int FACE_RIGHT = 1; private int mInd; private float mFromD.........
    ▪ |=演算       |=运算 声音 notification.defaults |=Notification.DEFAULT_SOUND; 震动 notification.defaults|=Notification.DEFAULT_VIBRATE; LED  notification.defaults |= Notification.DEFAULT_LIGHTS ......

[1]菱形3D范例
    来源: 互联网  发布时间: 2014-02-18
菱形3D实例
下面是具体的实现方法:
首先需要建两个array,第一array是用来告诉opengl这个图形有哪些顶点:
画一个三维的坐标轴,然后把你要画的点都算出来,然后放在这个array里。

float l=1.5f;
float[] vertex={

0.0f,l,0.0f,

l,0.0f,0.0f,

0.0f,0.0f,l,

-l,0.0f,0.0f,

0.0f,0.0f,-l,

0.0f,-l,0.0f

};

第二个array是告诉opengl 你要怎样组织这些点:
这里我要画三角形,所以每三个点是一组。
byte[] edge=
{
0,1,2,
1,2,5,

0,2,3,
5,2,3,

0,3,4,
5,3,4,

0,4,1,
5,4,1

};


这里的数字,是第一个array的index。
下面你要建立两个Buffer它们是用来存放这两个array的。

ByteBuffer bb = ByteBuffer.allocateDirect(vertex.length*4);
bb.order(ByteOrder.nativeOrder());
fbv=bb.asFloatBuffer();
fbv.put(vertex);
fbv.position(0);

ffe=ByteBuffer.allocateDirect(edge.length);
ffe.put(edge);
ffe.position(0);

这样一个三维的菱形就画好了。

下面你要写一个方法能让它自己把自己画出来!
public void draw(GL10 gl)
{
gl.glFrontFace(GL10.GL_CW);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, fbv);
gl.glDrawElements(GL10.GL_TRIANGLES, 24, GL10.GL_UNSIGNED_BYTE, ffe);

}


先说第一个glFrontFace,物体都有一个正面一个反面,这里告诉opengl显示这个物体按顺时针方向(CW=> clockwise)

gl.glVertexPointer(3, GL10.GL_FLOAT, 0, fbv);这个方法是把本程序所用的点都传递个opengl。opengl需要知道什么哪?首先是 这个点是几维的(opengl 支持2,3,4 维),这里是3所以是三维的,第二个参数告诉opengl,这个点是用什么样类型的变量来储存的,这里是float类型。第三个是步长(stride),这个我还没弄明白,不过我看的例子都为0. 最后把你建立好的三维坐标点都传给opengl

gl.glDrawElements。 这个方法是告诉opengl如果要画这个图形,应该怎么画。第一个参数,告诉opengl 用画三角形(这样opengl就以三个点为一组),然后告诉opengl你要用到多少个点(注意这个点是在第二个array里的点数)。 第三个是告诉opengl这些点(其实是三维坐标点的reference)的类型。这里是unsigned byte。最后把你排列点的array 放进去!

第二个大的步骤是创建一个让这个三维坐标运行的环境(Renderer)。
这是一个interface类
首先,在onDrawFrame里,我们告诉本程序这个三维图形的行为:
在做任何事情之前,我们要清空所有以前内存里的东西,这个内存包括:Color 和Depth
gl.glClear(GL10.GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_BUFFER_BIT);
然后告诉opengl你要用那个MatrixMode 这个就比较难解释了。
如果写程序 只要记住 GL_MODELVIEW 是管理图形的 缩放,移动,和转动就行了.(如果那个朋友想理解的更深一点,可以联系我,我可以把我的笔记发过去或者参考 http://glasnost.itcarlow.ie/~powerk/GeneralGraphicsNotes/projection/projection_viewing.html )。


gl.glTranslatef(0, 0, -3.0f);
这个方法告诉opengl把图形沿z轴迁移3个unit。这三个值分别是x,y,z轴。
gl.glRotatef(angle,0, 1, 0);
这个方法告诉我们以y为轴。 转angle个度数。注意这里的1和0是告诉沿着那个轴转,别的值应该没有意义。
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
还记得上边说的opengl分client side和service side吗。 这个是告诉opengl如果client side调用draw什么的时候,这个vertex array是可用的。opengl有很多这样的可选项,所以需要告诉opengl,因为我们已经设置了vertex array(我们的第一个array),所以告诉opengl 它是可用的(如果不告诉,opengl会忽略)!

trian.draw(gl);
这个方法是把图形画出来。

angle++;
为了达到动态的效果,我们让每一个frame 的angle,比上一个多一度。
当显示空间大小发生变化的时候,我们应该告诉opengl一下信息:

public void onSurfaceChanged(GL10 gl, int width, int height) 
{
gl.glViewport(0, 0, width, height);
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
float ratio = (float)width/height;
gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);

}


首先是opengl可用的空间 :
gl.glViewport(0, 0, width, height);
想象一下用这四个点画出来的四边形,就是opengl所能用的空间。

gl.glMatrixMode(GL10.GL_PROJECTION);
这个matrix是如何把三维坐标转换为二维坐标并把它放在显示器上。
gl.glLoadIdentity
是告诉opengl初始化这个matrix。

gl.glFrustumf
要把三维的东西用二维显示出来,需要知道几个东西,第一是这个显示平面有多大,你可以看多近和多远。这里的头四个参数,建立了一个四边形,告诉opengl把图形显示在这个范围了。后两个参数告诉opengl这里显示平面里可以显示三维空间里最近和最远的位置。

当这个三维图形建立的是时候,我们可以告诉opengl一些基本参数。这里把能省略的都省略了(其实什么都没有也可以运行!)
public void onSurfaceCreated(GL10 gl, EGLConfig arg1) 
{
gl.glEnable(GL10.GL_DEPTH_TEST);
gl.glClearColor(0,0, 0, 0);
}

gl.glEnable(GL10.GL_DEPTH_TEST); 告诉opengl要检查depth,为什么哪。在三维空间里一个物体A在另一个物体B后面,那么这个A被B挡住里,所以你是看不见的。我们要告诉opengl,我们不想看见被挡住的东西。这个GL_DEPTH_TEST 就是这个功能。
gl.glClearColor(0,0, 0, 0);
设置这个背景颜色为黑色,应为我们没有给我们的三维图形设置颜色(为了简单),它的初始化颜色是白色。

以下是源代码:
package Beta.ThreeD;

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;

import javax.microedition.khronos.opengles.GL10;

public class TriangleShape 
{

private final float l=1.5f;

private FloatBuffer fbv;

private ByteBuffer ffe;

public TriangleShape()

{

float[] vertex={

0.0f,l,0.0f,

l,0.0f,0.0f,

0.0f,0.0f,l,

-l,0.0f,0.0f,

0.0f,0.0f,-l,

0.0f,-l,0.0f

};


byte[] edge=

{

0,1,2,

1,2,5,



0,2,3,

5,2,3,



0,3,4,

5,3,4,



0,4,1,

5,4,1

};

ByteBuffer bb = ByteBuffer.allocateDirect(vertex.length*4);

bb.order(ByteOrder.nativeOrder());

fbv=bb.asFloatBuffer();

fbv.put(vertex);

fbv.position(0);




ffe=ByteBuffer.allocateDirect(edge.length);

ffe.put(edge);

ffe.position(0);

}

public void draw(GL10 gl)

{

gl.glFrontFace(GL10.GL_CW);

gl.glVertexPointer(3, GL10.GL_FLOAT, 0, fbv);

gl.glDrawElements(GL10.GL_TRIANGLES, 24, GL10.GL_UNSIGNED_BYTE, ffe);

}
}


package Beta.ThreeD;

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;

import android.opengl.GLSurfaceView.Renderer;

public class MySimpleRendered implements Renderer
{

private int angle=50;

private TriangleShape trian;

public MySimpleRendered()

{

trian = new TriangleShape();

}

@Override

public void onDrawFrame(GL10 gl) 

{

// TODO Auto-generated method stub

gl.glClear(GL10.GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_BUFFER_BIT);

gl.glMatrixMode(GL10.GL_MODELVIEW);

gl.glLoadIdentity();

gl.glTranslatef(0, 0, -3.0f);

gl.glRotatef(angle,0, 1, 0);

gl.glRotatef(angle, 1, 0, 0);

gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);

trian.draw(gl);

angle++;

}


@Override

public void onSurfaceChanged(GL10 gl, int width, int height) 

{

// TODO Auto-generated method stub

gl.glViewport(0, 0, width, height);

gl.glMatrixMode(GL10.GL_PROJECTION);

gl.glLoadIdentity();

float ratio = (float)width/height;

gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);



}


@Override

public void onSurfaceCreated(GL10 gl, EGLConfig arg1) 

{

gl.glEnable(GL10.GL_DEPTH_TEST);

gl.glClearColor(0,0, 0, 0);

}

}
package Beta.ThreeD;

import android.app.Activity;
import android.os.Bundle;
import android.opengl.GLSurfaceView;
public class Triangle extends Activity {
    /** Called when the activity is first created. */

private GLSurfaceView my_view;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        my_view = new GLSurfaceView(this);
        my_view.setRenderer(new MySimpleRendered());
        this.setContentView(my_view);
    }
    public void onResume()
    {
    
super.onResume();
    
my_view.onResume();
    }
    public void onPause()
    {
    
super.onPause();
    
my_view.onPause();
    }
}

1 楼 15921310063 2011-03-29  
很牛。佩服。

    
[2] 3D圆桌面效果动画类
    来源: 互联网  发布时间: 2014-02-18
3D桌面效果动画类
public class CubeAnimation extends Animation implements
        Animation.AnimationListener {
    public static final int FACE_LEFT = 0;
    public static final int FACE_RIGHT = 1;
    private int mInd;
    private float mFromDegrees;
    private float mToDegrees;
    private float mCenterX;
    private float mCenterY;
    private int mHorizonType = 1;
    private float mHorizonValue = 0.5F;
    private Camera mCamera;
    private View mView;

    public CubeAnimation(int ind) {
        this.mInd = ind;
        this.mFromDegrees = 0.0F;
        this.mToDegrees = 90.0F;
    }

    public CubeAnimation(Context context, AttributeSet attrs) {
        super(context, attrs);
        TypedArray a = context.obtainStyledAttributes(attrs,
                R.styleable.CubeAnimation);

        this.mFromDegrees = 0.0F;
        this.mToDegrees = 90.0F;

        Description d = Description.parseValue(a.peekValue(0));
        this.mHorizonType = d.type;
        this.mHorizonValue = d.value;

        this.mInd = a.getInt(1, 0);

        boolean t = a.getBoolean(2, true);
        if (!(t)) {
            this.mInd = (1 - this.mInd);
            this.mToDegrees = 0.0F;
            this.mFromDegrees = 90.0F;
        }
        a.recycle();
    }

    public void onAnimationStart(Animation anim) {
        this.mView.setVisibility(View.VISIBLE);
    }

    public void onAnimationEnd(Animation anim) {
        this.mView.setVisibility((this.mInd == 0) ? 0 : 8);
        this.mInd = (1 - this.mInd);
    }

    public void onAnimationRepeat(Animation anim) {
    }

    public static void startCubeAnimation(Context context, int id, View view1,
            View view2) {
        XmlPullParser parser;
        try {
            parser = context.getResources().getAnimation(id);
            AttributeSet attrs = Xml.asAttributeSet(parser);

            int type = parser.getEventType();
            int depth = parser.getDepth();
            while (true) {
                while (true) {
                    if ((((type = parser.next()) == 3) && (parser.getDepth() <= depth))
                            || (type == 1))
                        break label172;
                    if (type == 2)
                        break;
                }

                String name = parser.getName();

                if (name.equals("cube")) {
                    CubeAnimation anim1 = new CubeAnimation(context, attrs);
                    anim1.mInd = 1;
                    anim1.mView = view1;
                    anim1.setAnimationListener(anim1);
                    CubeAnimation anim2 = new CubeAnimation(context, attrs);
                    anim2.mInd = 0;
                    anim2.mView = view2;
                    anim2.setAnimationListener(anim2);
                    view1.startAnimation(anim1);
                    label172: view2.startAnimation(anim2);
                }
            }
        } catch (Resources.NotFoundException ex) {
            Log.e("CubeAnimation", "NotFoundException");
        } catch (XmlPullParserException ex) {
            Log.e("CubeAnimation", "XmlPullParserException");
        } catch (IOException ex) {
            Log.e("CubeAnimation", "IOException");
        }
    }

    public void initialize(int width, int height, int parentWidth,
            int parentHeight) {
        super.initialize(width, height, parentWidth, parentHeight);
        this.mCenterX = resolveSize(1, 0.5F, width, parentWidth);
        this.mCenterY = resolveSize(1, 0.5F, height, parentHeight);
        if (this.mHorizonType == 0) {
            this.mHorizonValue /= height;
        }

        this.mCamera = new Camera();
    }

    protected void applyTransformation(float interpolatedTime, Transformation t) {
        float fromDegrees = this.mFromDegrees;
        float degrees = fromDegrees + (this.mToDegrees - fromDegrees)
                * interpolatedTime;

        float centerX = this.mCenterX;
        float centerY = this.mCenterY;
        Camera camera = this.mCamera;

        Matrix matrix = t.getMatrix();

        camera.save();

        float b = 0.0F;
        float e = -this.mHorizonValue;

        if (this.mInd == 0) {
            degrees += 90.0F;
        }

        camera.rotateY(degrees);

        camera.getMatrix(matrix);
        camera.restore();

        if (this.mInd == 0) {
            matrix.preScale(-1.0F, 1.0F, centerX, 0.0F);
        }

        float tranX = 320.0F * interpolatedTime;

        float tranY = -centerY * e + b;
        matrix.preTranslate(0.0F, centerY * e);
        matrix.postTranslate(tranX, tranY);
    }

    protected static class Description {
        public int type;
        public float value;

        static Description parseValue(TypedValue value) {
            Description d = new Description();
            if (value == null) {
                d.type = 0;
                d.value = 0.0F;
            } else {
                if (value.type == 6) {
                    d.type = (((value.data & 0xF) == 1) ? 2 : 1);

                    d.value = TypedValue.complexToFloat(value.data);
                    return d;
                }
                if (value.type == 4) {
                    d.type = 0;
                    d.value = value.getFloat();
                    return d;
                }
                if ((value.type >= 16) && (value.type <= 31)) {
                    d.type = 0;
                    d.value = value.data;
                    return d;
                }
            }

            d.type = 0;
            d.value = 0.0F;

            return d;
        }
    }
} 

    
[3] |=演算
    来源: 互联网  发布时间: 2014-02-18
|=运算

声音 notification.defaults |=Notification.DEFAULT_SOUND;

震动 notification.defaults|=Notification.DEFAULT_VIBRATE;

LED  notification.defaults |= Notification.DEFAULT_LIGHTS


    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3