有个问题,一波表情执行完后,view还在,导致控件不断重绘制

来源:2-2 表情雨特效实现2

超级NEC

2020-02-15 16:13

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();
    }
}


写回答 关注

2回答

  • weibo_哈梅尔剑帝_0
    2020-05-04 22:38:41

    确实会有问题, 单个表情的时候结束的时候onDraw会进入return的分支, 不在触发postInvalidate方法, 但是多表情的时候每次都会触发postInvalidate, 表情结束之后还在调用onDraw方法。

    不过这里实现可以简单一点, 循环绘制每个表情的时候在判断是否超出边界的时候同时检测是不是最后一个表情, 如果是主动stop, 然后return

    if (isOutOfBottomBound(i)){
        if (i == emotions.size() - 1){
            stop();
            return;
        }
        continue;
    }


  • 慕梦前来
    2020-04-11 23:27:01

    for的条件反复了吧

使用ViewPager实现卡片式问答项目(下)

本门课程将带大家利用ViewPager等技术实现卡片式问答项目下半部分的学习

3174 学习 · 2 问题

查看课程

相似问题