【问题标题】:Do setBackgroundColor() call onDraw()?setBackgroundColor() 是否调用 onDraw()?
【发布时间】:2018-07-27 13:47:36
【问题描述】:

使用自定义视图我发现有些奇怪:

我注意到setBackgroundColor() 调用了onDraw()
到目前为止一切顺利
由于我想创建对 onDraw 的递归调用,我将 setBackgroundColor() 放在 onDraw() 中,期望 onDraw() 将永远被嵌套的 setBackgroundColor() 调用。

然而,这并没有发生,奇怪的事情发生了:
最初的onDraw() 代码被触发,当setBackgroundColor() 行被执行时,onDraw() 的代码继续正常运行(好像它不是递归调用)并且只有当onDraw() 返回时,是不是@ 987654331@ 再次被呼叫。

所以我对自己说,也许setBackgroundColor() 只会引发一个标志,让系统对onDraw() 的调用进行排队,也许系统会等待最初的onDraw() 调用返回,然后才称它为第二次。
但是当第二个onDraw() 被调用时(由于setBackgroundColor() 所谓的系统标志),代码运行正常,并且没有调用第三个调用。
setBackgroundColor() 怎么可能只引发一次递归调用?

这是代码: 计数器达到 2 并停止:

public class MyView extends View {
    int counter;

    public MyView(Context context) {
        super(context);
        counter = 0;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        counter++;
        setBackgroundColor(Color.GREEN);
    }
}

【问题讨论】:

    标签: java android android-animation android-view android-custom-view


    【解决方案1】:

    因为你只调用了两次:

    1. 打电话时super.onDraw()
    2. setBackgroundColor(Color.GREEN);

    调用super() 时不会调用MyView.onDraw(),因为继承规则。你应该学习java中的继承。

    【讨论】:

    • 如果 setBackgroundColor() 调用 onDraw(),并且(在我的代码中看到)onDraw() 显然调用 setBackgroundColor(),而不是他们认为永远互相调用
    • 你错了。你调用MyView.onDraw()->super.onDraw()->setBackgroundColor()(从super调用)->返回super.onDraw()->setBackgroundColor()(从myView调用)->结束。坚持废话之前请先研究继承Using the Keyword super
    • 如果我从代码中的另一个位置调用 setBackgroundColor(),它也会调用 onDraw(),所以从 onDraw() 中调用它时也会发生同样的情况
    【解决方案2】:

    我不明白你想在这里用死循环实现什么。在 onDraw 中调用 setBackground 是一种不好的做法。同时,setBackground 不会立即触发 onDraw。它使视图无效,该视图在将来的某个时间点调用 onDraw。

    要让视图重新绘制,也可以调用 requestLayout() 或 invalidate()。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-07
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 2016-10-30
      • 1970-01-01
      相关资源
      最近更新 更多