想做一个类似雷达那样效果的android应用,以我自己的位置为坐标原点,圆圈逐渐向外扩展,最好以后还能显示别人的位置。我利用Android中的Renderer来做的。
NdkGlRender.java
main.cpp如下:
Android.mk如下
效果图:
最后上效果图
主要代码如下:
NdkGlActivity.java
public class NdkGlActivity extends Activity {
private String TAG = "NdkGlActivity";
private NdkGlRender ndkglrender;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
GLSurfaceView surface = new GLSurfaceView(this);
ndkglrender = new NdkGlRender(this);
surface.setRenderer(ndkglrender);
setContentView(surface);
}
}
NdkGlRender.java
public class NdkGlRender implements Renderer {
private Activity activity;
static {
//load library
System.loadLibrary("rusteze_ss");
}
public NdkGlRender(Activity activity) {
this.activity = activity;
}
// declare native function
native private void onNdkSurfaceCreated();
native private void onNdkSurfaceChanged(int width, int height);
native private void onNdkDrawFrame(AssetManager ass);
@Override
public void onDrawFrame(GL10 arg0) {
// TODO Auto-generated method stub
AssetManager ass = activity.getResources().getAssets();
onNdkDrawFrame(ass);
}
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
// TODO Auto-generated method stub
onNdkSurfaceChanged(width, height);
}
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
// TODO Auto-generated method stub
onNdkSurfaceCreated();
}
}
接下来主要是CPP代码了
main.cpp如下:
#include <jni.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <GLES/gl.h>
#include "logcat.h"
#include <sys/types.h>
#include <android/asset_manager.h>
#include <android/asset_manager_jni.h>
#include "com_example_demoact_NdkGlRender.h"
#include <time.h>
#define LOG_TAG "opengl"
typedef unsigned char byte;
typedef struct {
GLfloat x, y, z;
} XYZ;
static clock_t start = 0, end = 0;
typedef struct {
GLfloat x, y, z,p;
} line_vertex;
static float radius=0;
static float rotateQuad;
#define PI 3.14159265
#define DTOR PI/180
static byte indices[8] = { 0, 1, 1, 2, 2, 3, 3, 0 }; //索引数组
static void drowcircle(){
int angle=0;
line_vertex line[1];
for(angle=0;angle<=360;){
line[0].x=radius*cos(angle*DTOR);
line[0].y=radius*sin(angle*DTOR);
angle=angle+1;
line[0].z=radius*cos((angle)*DTOR);
line[0].p=radius*sin((angle)*DTOR);
glVertexPointer ( 2, GL_FLOAT, 0, line );
glDrawArrays ( GL_LINES, 0, 2 );
}
}
JNIEXPORT void JNICALL Java_com_example_demoact_NdkGlRender_onNdkSurfaceCreated(
JNIEnv* env, jobject obj) {
LOGI("now in onNdkSurfaceCreated");
// 启用阴影平滑
glShadeModel(GL_SMOOTH);
start = clock();
// 黑色背景
glClearColor(0, 0, 0, 1);
// 设置深度缓存
glClearDepthf(1.0f);
// 启用深度测试
glEnable(GL_DEPTH_TEST);
glEnable(GL_LINE_SMOOTH);
// 所作深度测试的类型
glDepthFunc(GL_LEQUAL);
// 告诉系统对透视进行修正
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST);
glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
}
JNIEXPORT void JNICALL Java_com_example_demoact_NdkGlRender_onNdkSurfaceChanged(
JNIEnv* env, jobject obj, jint width, jint height) {
LOGI("now in onNdkSurfaceChanged");
//图形最终显示到屏幕的区域的位置、长和宽
glViewport(0, 0, width, height);
//指定矩阵
glMatrixMode(GL_PROJECTION);
//将当前的矩阵设置为glMatrixMode指定的矩阵
glLoadIdentity();
glOrthof(-2, 2, -2, 2, -2, 2);
// glOrthof(0, 0, 0, 0, 0, 0);
}
JNIEXPORT void JNICALL Java_com_example_demoact_NdkGlRender_onNdkDrawFrame(
JNIEnv* env, jobject obj, jobject assetManager) {
//启用顶点设置功能,之后必须要关闭功能
glEnableClientState(GL_VERTEX_ARRAY);
//清屏
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glFrontFace(GL_CW);
drowcircle();
//CreateUnitSphere(10, 10);
//关闭顶点设置功能
glDisableClientState(GL_VERTEX_ARRAY);
//rotateQuad -= 2.5f;
double t = 0.00;
end = clock();
t = (double) (end - start) / CLOCKS_PER_SEC;
if(t>0.05){
radius+=0.1;
start = clock();
}
if(radius>=4){
radius=0;
}
}
Android.mk如下
LOCAL_PATH := $(call my-dir)
LOCAL_CFLAGS += -O3 -fvisibility=hidden -ffunction-sections -fdata-sections
LOCAL_LDFLAGS += -Wl,--gc-sections
include $(CLEAR_VARS)
LOCAL_MODULE := rusteze_ss
LOCAL_SRC_FILES := main1.cpp
LOCAL_LDLIBS := -lGLESv1_CM -L$(SYSROOT)/usr/lib -lz -llog -lEGL -landroid
cmd-strip = $(TOOLCHAIN_PREFIX)strip $1
cmd-strip = $(TOOLCHAIN_PREFIX)strip --strip-debug -x $1
include $(BUILD_SHARED_LIBRARY)
效果图: