Android游戏开发:如何仅重绘单个View且避免重叠View重绘?
嘿,这个场景我做小游戏的时候也踩过坑!咱们先搞清楚为啥另一个View会跟着重绘:Android的窗口重绘机制会把所有覆盖「脏区域」(就是你调用invalidate标记的需要更新的区域)的View都标记为待重绘,所以重叠的View就被连带触发了。要实现只平移第二个View且不触发重绘,试试下面几个方法:
优先用属性动画类的平移API
Android提供的setTranslationX()、setTranslationY()(或者setTranslationZ()处理Z轴层级)是专门做这种「无重绘平移」的。这些方法基于硬件加速,直接操作View的渲染缓存(可以理解成把View的画面当成一张图片来移动),完全不会触发onDraw()方法。
举个简单的例子:// 把第二个View向右平移100像素 secondView.setTranslationX(100f);这个操作轻量又高效,非常适合游戏里的位移需求。
给View开启硬件层缓存(如果默认没开的话)
现在Android设备默认都开启了硬件加速,但如果你的特殊场景下没开,或者需要更明确地控制缓存,可以手动给第二个View设置硬件层:secondView.setLayerType(View.LAYER_TYPE_HARDWARE, null);开启后,系统会把View渲染到一个硬件纹理上,之后的平移、缩放等操作都是直接操作这个纹理,不会触发重绘。不过要注意:如果之后需要修改第二个View的内容,记得先调用
secondView.invalidate()更新缓存,或者在不需要的时候关闭硬件层(setLayerType(View.LAYER_TYPE_NONE, null)),不然会一直显示旧内容。精确控制invalidate的区域(适合部分重叠场景)
如果第一个View的重绘只涉及局部区域,你可以不用调用无参的invalidate(),而是指定具体的重绘范围:// 只重绘第一个View的左上方100x100区域 firstView.invalidate(0, 0, 100, 100);只要这个区域没覆盖到第二个View,系统就不会触发第二个View的重绘。不过如果两个View完全重叠,这个方法就没效果了,还是前两个方法更靠谱。
内容的提问来源于stack exchange,提问作者takluiper

