该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

9.从前述教程中整理出来的native activity框架

/*请忽视注释中提到的楼层,或结合叜駣的原教程阅读*/

#include

#include

#include

#include

const ASensor *sensor;/* 感应器 */

ASensorEventQueue *sensor_event_queue; /* 感应器事件队列 */

struct android_app *android_app;/* java扔给我们的系统状态 */

EGLSurface surface;/* egl 显示平面 */

EGLDisplay display;/* egl 显示设备 */

EGLContext context;/* egl 显示上下文 */

int x0, y0, x1, y1, x2, y2;

void refresh()

{

int x, y, z;/* 获得陀螺仪矢量的x/y/z值 */

ASensorEvent event;/* 创立一个感应器事件用来储存 */

int looper_id;/* 函数ALooper_pollAll()返回的事件代码 */

struct android_poll_source *source;

eglSwapBuffers(display, surface);/* 交换显示缓冲,display与surface于7楼创建,假定它们是全局变量 */

while ((looper_id = ALooper_pollAll(0, NULL, NULL, (void **)&source)) >= 0) /* 有事件发生,保存事件源到source,并保存事件代码 */

{

if (source)/* 如果事件源有效 */

source->process(android_app, source);

/* 将java扔给我们的系统状态与事件源扔进事件源中名为process的成员函数,对事件进行处理 */

if (looper_id == LOOPER_ID_USER)/* 如果返回的事件标识与我们初始化陀螺仪时设置的标识相同 */

while (ASensorEventQueue_getEvents(sensor_event_queue, &event, 1) > 0) /* 循环从感应器事件队列sensor_event_queue中获得事件,并保存到感应器事件event中,每次保存一个 */

{

x = event.acceleration.x;/* 从感应器事件event的成员acceleration中得到陀螺仪矢量的x值 */

y = event.acceleration.y;/* 从感应器事件event的成员acceleration中得到陀螺仪矢量的y值 */

z = event.acceleration.z;/* 从感应器事件event的成员acceleration中得到陀螺仪矢量的z值 */

}

}

}

int on_input_event(struct android_app *app, AInputEvent * input_event) /* app是java扔给我们的系统状态,input_event是java扔给我们的输入事件 */

{

if (AInputEvent_getType(input_event) == AINPUT_EVENT_TYPE_MOTION) /* 我们用AInputEvent_getType()得知输入事件是屏幕触碰 */

{

x0 = AMotionEvent_getX(input_event, 0);/* 将输入事件和触碰序号0,代入AMotionEvent_getX,得到0号手指的触碰横坐标 */

y0 = AMotionEvent_getY(input_event, 0);/* 将输入事件和触碰序号0,代入AMotionEvent_getX,得到0号手指的触碰纵坐标 */

x1 = AMotionEvent_getX(input_event, 1);/* 将输入事件和触碰序号1,代入AMotionEvent_getX,得到1号手指的触碰横坐标 */

y1 = AMotionEvent_getY(input_event, 1);/* 将输入事件和触碰序号1,代入AMotionEvent_getX,得到1号手指的触碰纵坐标 */

x2 = AMotionEvent_getX(input_event, 2);/* 将输入事件和触碰序号2,代入AMotionEvent_getX,得到2号手指的触碰横坐标 */

y2 = AMotionEvent_getY(input_event, 2);/* 将输入事件和触碰序号2,代入AMotionEvent_getX,得到2号手指的触碰纵坐标 */

}

return 0;/* 应当返回0,但如果认为input_event事件已经完全处理完毕的话,可以返回1 */

}

void on_app_cmd(struct android_app *app, int event_type) /* app是java扔给我们的系统状态,event_type是java扔给我们的事件类型 */

{

switch (event_type)/* 我们根据java扔给我们的事件类型做出不同的反应 */

{

case APP_CMD_INIT_WINDOW:/* java扔给我们的事件类型是:初始化窗口 */

{

const EGLint attribs[] = {

EGL_SURFACE_TYPE, EGL_WINDOW_BIT,

EGL_BLUE_SIZE, 8,

EGL_GREEN_SIZE, 8,

EGL_RED_SIZE, 8,

EGL_DEPTH_SIZE, 8,

EGL_NONE

};

EGLint w, h, dummy, format;

EGLint numConfigs;

EGLConfig config;

display = eglGetDisplay(EGL_DEFAULT_DISPLAY);

eglInitialize(display, 0, 0);

eglChooseConfig(display, attribs, &config, 1, &numConfigs);

eglGetConfigAttrib(display, config, EGL_NATIVE_VISUAL_ID, &format);

ANativeWindow_setBuffersGeometry(app->window, 0, 0, format);

surface = eglCreateWindowSurface(display, config, app->window, NULL);

context = eglCreateContext(display, config, NULL, NULL);

eglMakeCurrent(display, surface, surface, context);

break;

}

case APP_CMD_TERM_WINDOW:/* java扔给我们的事件类型是:关闭窗口 */

eglMakeCurrent(display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);

eglDestroyContext(display, context);

eglDestroySurface(display, surface);

eglTerminate(display);

break;

case APP_CMD_GAINED_FOCUS:/* java扔给我们的事件类型是:获得焦点 */

ASensorEventQueue_enableSensor(sensor_event_queue, sensor); /* 为感应器事件队列(sensor_event_queue)启用陀螺仪感应器(sensor) */

ASensorEventQueue_setEventRate(sensor_event_queue, sensor, 1000000 / 60); /* 设定感应器的事件频率,换算后是1/60秒,与一般的屏幕刷新率一致) */

break;

case APP_CMD_LOST_FOCUS:/* java扔给我们的事件类型是:失去焦点 */

ASensorEventQueue_disableSensor(sensor_event_queue, sensor); /* 为感应器事件队列(sensor_event_queue)关闭感应器(sensor) */

break;

}

}

void android_main(struct android_app *app)

{

ASensorManager *sensor_manager;/* 感应器管理器 */

app_dummy();/* 确保glue的功能没有被忽略 */

app->onAppCmd = on_app_cmd;/* 将9楼完成的on_app_cmd回传函数赋值到app的onAppCmd成员 */

app->onInputEvent = on_input_event;/* 将13楼完成的on_input_event回传函数赋值到app的onInputEvent成员 */

android_app = app;/* 将参数app赋值到全局变量android_app */

sensor_manager = ASensorManager_getInstance(); /* 获得感应器管理器 */

sensor = ASensorManager_getDefaultSensor(sensor_manager, ASENSOR_TYPE_ACCELEROMETER); /* 获得陀螺仪感应器 */

sensor_event_queue = ASensorManager_createEventQueue(sensor_manager, app->looper, LOOPER_ID_USER, NULL, NULL); /* 创建系统循环更新时的感应器事件队列 */

/* 自定义部分,主循环也包含在这个部分中 */

while (1)

{

refresh();

}

}

android程序设计魔方矩阵,【图片】【记录】零基础用c4droid写一个3D魔方软件_c4droid吧_百度贴吧...相关推荐

  1. Android Studio新手–下载安装配置–零基础入门–基本使用–调试技能–构建项目基础–使用AS应对常规应用开发

    转自:http://blog.csdn.net/yanbober/article/details/45306483 目标:Android Studio新手–>下载安装配置–>零基础入门–& ...

  2. 新书推荐:《Android Studio开发实战:从零基础到App上线》终章

    <Android Studio开发实战:从零基础到App上线>是一部Android开发的实战教程,由浅入深.由基础到高级,带领读者一步一步走进App开发的神奇世界. 全书共分为16章.其中 ...

  3. 平面设计零基础怎么设计出一个完美的名片

    本文由:"学设计上兔课网"原创,图片素材来自网络,仅供学习分享 平面设计零基础怎么设计出一个完美的名片?每个人都会有专属的名片,好的名片可以让你的商业精英形象愈发生动起来.今天,为 ...

  4. 零基础教你搭建一个自己的靶场!

    零基础教你搭建一个自己的靶场! 目录 零基础教你搭建一个自己的靶场! 前言 部署 准备工作 安装环境 docker 的安装 docker-compose的安装 配置环境 安装 下载 配置 总结 前言 ...

  5. 零基础学java web开发_从零基础学Java成为一个专业的java web 开发者

    原标题:从零基础学Java成为一个专业的java web 开发者 "我怎么才能成为一个Java Web开发者?"对于这个问题,答案其实并不简单.成为一个Java Web开发人员包括 ...

  6. 零基础系统学习Maya(玛雅)软件,每天30分钟【软件精通】

    零基础系统学习Maya(玛雅)软件,每天30分钟[软件精通] 视频是分段播放, 免费教学,由于网站限制只能播放一集,想看全集教程的请移步哔哩哔哩搜索"3D建模云教室"观看 如果你一 ...

  7. DirectX11--实现一个3D魔方(1)

    前言 可以说,魔方跟我的人生也有一定的联系. 在高中的学校接触到了魔方社,那时候的我虽然也能够还原魔方,可看到大神们总是可以非常快地还原,为此我也走上了学习高级公式CFOP的坑.当初学习的网站是在魔方 ...

  8. DirectX11--实现一个3D魔方(3)

    前言 (2019/1/9 09:23)上一章我们主要讲述了魔方的旋转,这个旋转真是有毒啊,搞完这个部分搭键鼠操作不到半天应该就可以搭完了吧- (2019/1/9 21:25)啊,真香 有人发这张图片问 ...

  9. DirectX11--实现一个3D魔方(2)

    前言 上一章我们主要讲述了魔方的构造和初始化.纹理的准备工作.目前我还没有打算讲Direct3D 11关于底层绘图的实现,因此接下来这一章的重点是魔方的旋转.因为我们要的是能玩的魔方游戏,而不是一个观 ...

最新文章

  1. hello world!!(Java)
  2. opencv 3.1编译 linux,Ubuntu 编译安装 OpenCV 3.1
  3. duilib基本布局学习(模仿百度网盘)及绑定按钮事件
  4. 串口 COM口 USB-TTL RS-232 RS-485 不同标准 区别 释疑
  5. [MySQL FAQ]系列 -- 数据不算大,备份却非常慢
  6. 【专栏必读】王道考研408操作系统万字笔记(从学生角度辅助大家理解):各章节导航及思维导图
  7. 阿里大鱼php发送短信,阿里大鱼短信发送PHP代码
  8. virtualbox linux通用网卡,详解VirtualBox + CentOS 虚拟机网卡配置
  9. 算法高级(9)-线程池的实现方式
  10. python取列表中位数_Python如何获取列表(List)的中位数
  11. 虚拟机中centos7 安装过程中没有自动获取到网络
  12. 一盘商家一盘货,拼多多为什么比手淘便宜?
  13. python海龟库函数大全_python海龟库的使用
  14. c++ 迷宫思路_C++实现简单走迷宫的代码
  15. Android应用盈利广告平台的嵌入方法详解
  16. 概述-数据建模是什么?
  17. 关于计算机知识脑筋急转弯,脑筋急转弯及知识竞答
  18. 数位dp总结 之 从入门到模板
  19. AFL fuzzing tcpdump-tcpdump-4.9.0
  20. Python 常用基础模块(二):os模块

热门文章

  1. 论面向服务架构设计及其应用
  2. mysql的NULL和空值
  3. 客快物流大数据项目(八十八):ClickHouse快速入门
  4. html css动画自动旋转,不炫技,SVG+CSS3 旋转动画属性就能实现的梦幻效果
  5. 三分屏课件制作_剪映如何制作三宫格视频(分屏功能)详细制作步骤
  6. Oracle 12c PDB浅析(r9笔记第10天)
  7. 利用虚拟机访问NAS群辉硬盘文件文档内容
  8. 如何打造自己的朋友圈?原来大咖都是这样发圈的
  9. 撕掉《绿皮书》:是时候解决科技领域的白人至上的问题了
  10. ServerSQL数据库查锁、解锁