Posted on 13-11-2015
Filed Under (技术) by waterlin

在 Android 中,要实现动画效果,要么通过循环调用 canvas.draw 系统方法,要么通过调用 Opengl ES 中的 GLSurfaceView.Renderer,通过实现方法 onDrawFrame 来进行绘制。

canvas 画图确实要简单得多,但要实现更好的性能最好还是调用 OpenGL 方法,因为它的性能相对来说要好一些。

实现动画的关键就是实现 GLSurfaceView.Renderer 接口内的方法,最重要的一个就是 onDrawFrame,这个方法的原理是 Android 系统会开起一个线程,在此线程内不断的调用 onDrawFrame,以实现动画效果。因此只要在 onDrawFrame 方法里实现你自己需要重复绘制的内容即可。

可以通过 GLSurfaceView 的 setRenderMode 这个方法来设置是通过其它地方的消息来刷新 onDrawFrame,抑或让系统自动刷新 onDrawFrame 这个函数。

在我的测试结果下,如果让系统自动调用 onDrawFrame 函数,会精确地 20 毫秒刷新一次。

另外,如果需要限制 onDrawFrame 的速度,可以在 onDrawFrame 函数里使用 Thread.Sleep 来延长一下线程的执行时间,不过这个时间需要精确计算一下才能达到控制一秒刷新若干帧的要求,需要考虑到当前线程周期里已经消耗的时间等因素。

(0) Comments    Read More   
Posted on 24-10-2014
Filed Under (技术) by waterlin

最近在写一个与手机有关的应用,大致上可以认为是豌豆荚的精简版本,通过大量的调用 adb.exe 来实现相关的功能。在确认 adb.exe 的输出结果时,需要解析一下 adb.exe 执行后输出的字符串内容。

大部分情况下都很正常,就是有一个很特殊的情况:在刚开机第一次运行 adb.exe 时,adb.exe 的输出内容解析起来的结果不对。因为我的机器很少关机从没碰到过类似的问题,只有测试人员在各种情况下测试才发现这个问题:开机后第一次启动程序执行结果异常,但是第二次就正常了。

找来找去,最后终于知道结果了:在 adb.exe 第一次运行时的输出内容会略为不同。在开机后第一次运行 adb.exe 时,会额外输出以下内容:

而在我写代码的时候, adb.exe 都不知道已经执行过多少次了,所以我从来没有捕捉到这个信息。要知道,如果你的代码里没有预见到 adb server 第一次启动时输出的额外内容,解析起来多半会出错误的结果。

这就是原因,估计有一些人也会碰到类似的坑。

(0) Comments    Read More