close
当前位置: 物联网在线 > 技术文库 > android >

Android动态壁纸解析(4)

触摸事件我们是交给 Renderer 处理的。 Renderer 中的实现如下:

public boolean onTouchEvent(MotionEvent event) { float x = event.getX(); float y = event.getY(); // If a touch is moved on the screen if (event.getAction() == MotionEvent.ACTION_MOVE) { // Calculate the change float dx = x - oldX; float dy = y - oldY; // Define an upper area of 10% on the screen int upperArea = 0; // Zoom in/out if the touch move has been made in the upper if (y < upperArea) { z -= dx * TOUCH_SCALE / 2; // Rotate around the axis otherwise } else { xrot += dy * TOUCH_SCALE; yrot += dx * TOUCH_SCALE; } } // Remember the values oldX = x; oldY = y; // We handled the event return true; }

可以看到, Renderer 中仅仅是通过触摸的位置设置了它的一些变量。前面说过动态壁纸会不停的绘制,因此在不断根据这些变量进行绘制,变量一改变,绘制的位置、方向等等就改变了,从而达到了动态的效果。用户看来就是跟着自己的手势动了起来。

另外,上一个demo中我们绘制时没有对这些变量进行处理,现在我们加上两句代码。

@Override public void onDrawFrame(GL10 gl) { gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); gl.glLoadIdentity(); // Reset The Current Modelview Matrix // Check if the light flag has been set to enable/disable lighting gl.glEnable(GL10.GL_LIGHTING); // Check if the blend flag has been set to enable/disable blending gl.glEnable(GL10.GL_BLEND); // Turn Blending On ( NEW ) gl.glDisable(GL10.GL_DEPTH_TEST); // Turn Depth Testing Off ( NEW ) // Drawing gl.glTranslatef(0.0f, 0.0f, z); // Move z units into the screen // Scale the Cube to 80 percent, otherwise it would be too large for the screen gl.glScalef(0.8f, 0.8f, 0.8f); // Rotate around the axis based on the rotation matrix (rotation, x, y, z) gl.glRotatef(xrot, 1.0f, 0.0f, 0.0f); // X gl.glRotatef(yrot, 0.0f, 1.0f, 0.0f); // Y cube.draw(gl, 0); }

跟前面的对比发现,还真只加了两句代码。聪明的你能看出是哪两句么?

运行效果:

Android动态壁纸解析

What fk

同学们可能会问,最上面的效果是不需要触摸就自动动的,现在的效果不一样啊。

其实仔细想一想,触摸我们都解决了,自动的难道会难么?这个就当留了个课后作业给大家。

提示:有几句代码为给注释掉了。

结论

前一篇文章 讲述Android的架构方面的知识,很多同学说根本看不懂。想当年我语文高考87分,差三分及格,以后我们还是多上代码吧。

当然写这篇文章的目的不是为了让大家都去写动态壁纸应用,因为已经有一款非常优秀的了,没错,那就是 Style , Style , Style

这是一个典型的OpenGL应用场景,通过这篇文章大家也能对动态壁纸开发有一定的了解。我更希望的是,大家能动手将代码跑起来,动手的过程就是强化学习的过程。

引用

Style艺术壁纸

OpenGL (需科学上网)

Android动态壁纸支持 (需科学上网)

感谢各位,感谢开源!


(责任编辑:ioter)

用户喜欢...

Android Weekly #276 安卓开发周刊 中文版

您是否了解过Android的Lifecycle-Aware库?(android.jlelse.eu) 我们如何了解Lifecycle-Aware库代码? Nishant Srivastava展示了可以跟踪活动或Lifecycle-Aware的Lifecycle Arch组件的片段,并相应地调整其行为。 为Mos...


Android Weekly #275 安卓开发周刊 中文版

MapMe — Android地图适配器 (medium.com) Josh Burton介绍MapMe,是一个用Kotlin编写的Android库,可以将适配器模式带到地图上。 赞助 CloudRail - 连接到API 10x更快 (cloudrail.com) 当我们用单一的界面连接到所...


使用Android Studio开发可独立运行(runnable)混淆过的Jar程序

之前开发Java程序一直都是使用Eclipse 开发Jar程序,现在开发基本上都已经弃用Eclipse了,但是有时偶尔开发个小的Jar程序,还要切换回去好麻烦,刚好前几天有人问几个相关的问题,就顺便整...


Android Weekly #274 安卓开发周刊 中文版

探索Android Oreo上的别后执行限制(medium.com) 在这篇文章中,Joe Birch解释了关于Android Oreo在后台运行服务的变化。 non-Time领主的time – 第5部分 (blog.stylingandroid.com) Mark Allison继续分析JSR 310 date和...


Android Weekly #273 安卓开发周刊 中文版

开源你的Android代码(android.jlelse.eu) 通过您的开源Android代码,您将(希望地)为Android社区提供有价值的代码,收到建设性的反馈,并与您最初建立的内容进行协作从而使您的代码变得更好。这...


Android Weekly #272 安卓开发周刊 中文版

Android Dev 101:每个初学者都应该知道的一些做法() 看一些初学者或媒介等级开发人员(不要错过任何人)应该知道的一些做法,以便更好地摆脱Android框架。 99.9% crash free sessions (medium.com) Chr...


Android Weekly #271 安卓开发周刊 中文版

依赖注入检查(medium.com) 在本文中,MihályNagy引入了依赖注入检查,一种开源注释处理器,可帮助您解决一些出现在所有JSR 330 DI库中常见的问题。 使用Android Studio插件提高效率 (blog.mindorks.com...


Android Weekly #270 安卓开发周刊 中文版

带有RxJava2的SOLID Android分析 (medium.com) 在这篇文章中,Aris Papadopoulos将解释如何正确创建一个分析系统,同时遵循SOLID原则,并使用RxJava2来解决问题。 (blog.stylingandroid.com) Java中的编程时间很难...


Android内存泄漏思考

Android内存泄漏是一个经常要遇到的问题,程序在内存泄漏的时候很容易导致OOM的发生。那么如何查找内存泄漏和避免内存泄漏就是需要知晓的一个问题,首先我们需要知道一些基础知识。...


Android Weekly #269 安卓开发周刊 中文版

在Google上快速提出操作 () Wolfram Rittmeyer分享了开始在Google上快速创建操作所需的所有信息(为了家庭与助理)。 RxJava中的错误处理(rongi.github.io) 一旦开始编写RxJava代码,你就会意识到有些事...