2016-03-11 16:27:36 659浏览
在Android模拟器中,当用鼠标单击一次模拟器屏幕然后释放,会先触发ACTION DOWN,然后ACTION UP。如果是在屏幕上移动那么才会触发ACTION MOVE的动作。但是这只是模拟器的效果,接下来看一下真机与模拟器的区别。
Android培训Android开发应用之触发屏幕图形触摸器的优化
当我们的Android开发应用之触发屏幕图形触摸器的优化用户在玩游戏的时候,尤其是RPG这种类型的游戏,肯定需要会长时间的去触屏按我们的虚拟按键,比如我们会在屏幕上画上一个虚拟方向盘类似这样子。那么其实ACTION MOVE这个事件会被Android一直在响应。
为什么会一直响应ACTIoN MOVE这个动作昵?如果用户没有移动手指而是静止不动也会一直响应?具体原因有如下两点:
第一点:因为Android对于触屏事件很敏感。
第二点:虽然我们的手指感觉是静止没有移动,其实事实不是如此!当我们的手指触摸到手机屏幕上之后,感觉静止没动,其实手指在不停地微颤。对此,读者可以具体尝试。
开始具体分析,如果ACTION MOVE此时间一直被Android一直不停地响应并处理,无疑对我们游戏的性能增加了不少的负担。比如我们项目线程绘图时间每次用了100ms,那么当手指触摸屏幕,这短暂的0.1秒内大概会产生10个左右的MotionEvent,并且系统会尽可能快地把这些event发给监听线程,这样在这一段时间内CPU就会忙于处理onTouchEvent,严重的话可能会造成画面一卡一卡的。
那么我们其实根本用不着按键响应这么多次,而只需在我们每次绘图后,或者绘图前接受一次用户按键即可,这样能让帧率不至于下降的太厉害。我们需要控制这个时间让它慢下来,随着我们的绘图时间一起来合作,这样就能减少系统线程的负担。
也可能有的读者会问为什么不用sleep()的方法,其实如果只是想让线程休眠指定时间的话可以用sleep0函数,但是这个没有资源锁的限制。而Object的wait()和notify()方法通常用在时间不定的条件限制等待,并且必须写在同步代码块中。
也可能有的读者会问为什么不用当前类的object来使用:this.wait(),而是new一个object。因为synchronized中的Object表示Object调用wait()必须拥有该对象的监视锁,当前我们有了object的锁,就要用object调用wait()。