EmotionRainView在一波表情执行完毕后,onDraw一直空绘制,浪费资源。然后由于EmotionRainView全屏布局,没法消失,导致界面遮挡。所以最好是表情雨执行完毕后,自动停止。如下:
将 ondraw方法最后一行
//重绘 postInvalidate();
改造为:
if(end()){ LogUtil.i("========运行结束========"); stopRain(); }else { //重绘 postInvalidate(); LogUtil.i("=====重绘======="); } end()方法如下: private boolean end(){ for (int i = 0; i < mEmotionList.size(); i++) { Emotion emotion=mEmotionList.get(i); if(emotion.getY()<ScreenUtil.getHeight()){ return false; } } return true; }
当然,在MainActivity的ondestroy方法中依然要执行停止方法:
@Override protected void onDestroy() { super.onDestroy(); if(mEmotionView!=null){ mEmotionView.stopRain(); } }
确实会有问题, 单个表情的时候结束的时候onDraw会进入return的分支, 不在触发postInvalidate方法, 但是多表情的时候每次都会触发postInvalidate, 表情结束之后还在调用onDraw方法。
不过这里实现可以简单一点, 循环绘制每个表情的时候在判断是否超出边界的时候同时检测是不是最后一个表情, 如果是主动stop, 然后return
if (isOutOfBottomBound(i)){ if (i == emotions.size() - 1){ stop(); return; } continue; }
for的条件反复了吧