【问题标题】:Why onDraw is not called after invalidate()?为什么在 invalidate() 之后不调用 onDraw?
【发布时间】:2013-07-11 14:04:36
【问题描述】:

我在 stackoverflow 上找到了很多帖子,但我仍然无法解决我的问题。这是我的代码片段:

public class MyView extends RelativeLayout {

Button b1;
Button b2;
Context sContext;
public static int i = 0;
private int w = 400;
private int h = 400;
private int w2 = 100;
private int h2 = 100;

public MyView(Context context) {
    super(context);
    sContext = context;
    init();
}

public MyView(Context context, AttributeSet attrs) {
    super(context, attrs);
    sContext = context;
    init();
}

private void init() {
    b1 = new Button(sContext);
    addView(b1);
    b1.setBackgroundColor(Color.YELLOW);

    b1.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

            if (w >= 600) {
                MyView.this.setBackgroundColor(Color.GREEN);
                //b1.setBackgroundColor(Color.RED);
            } else {
                MyView.this.setX(100);
            }

            MyView.this.invalidate();
            w += 100;
            w2 += 20;
        }

    });
}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    //b1.setBackgroundColor(Color.RED);
    Toast.makeText(sContext, ""+i, Toast.LENGTH_SHORT).show();
    ++i;
}
}

你能解释一下为什么我按 b1 的前 3 次没有调用 onDraw 吗?因为我每次按 b1 时都会调用 invalidate。非常感谢!

【问题讨论】:

标签: android


【解决方案1】:

默认情况下,所有 ViewGroup 子类都不调用它们的 onDraw 方法,您应该通过调用 setWillNotDraw(false) link 来启用它

【讨论】:

    【解决方案2】:

    借用链接@

    Android Custom Layout - onDraw() never gets called

    试试下面的方法吧

    1.如果您要扩展 ViewGroup(在您的情况下为 RelativeLayout),您应该覆盖 dispatchDraw() 而不是 onDraw()

    话题@讨论

    https://groups.google.com/forum/?fromgroups=#!topic/android-developers/oLccWfszuUo

    protected void dispatchDraw (Canvas canvas)

    由 draw 调用以绘制子视图。这可能会被派生类覆盖,以便在绘制其子级之前(但在绘制其自己的视图之后)获得控制权

    参数

    canvas 用于绘制视图的画布

    例子

    public class Hello  extends Activity {
    
        private MyView myView;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
                    super.onCreate(savedInstanceState);
                    Log.e("hello", "hello");
                    this.myView = new MyView(this);
                    setContentView(this.myView);
    
        }
         public class MyView extends RelativeLayout
           {
    
          private Paint myPaint = new Paint();
          private int[] numbers;
          public MyView(Context paramContext)
          {
            super(paramContext);
            Log.e("MyView", "MyView");
            setFocusable(true);
            setBackgroundResource(R.drawable.ic_launcher);
          }
          @Override
          protected void dispatchDraw(Canvas canvas){         
    
                super.dispatchDraw(canvas);     
                Log.i("...............","drawing");   
            }
    
      }
    }
    

    2.如果您在构造函数调用setWillNotDraw(false) 中覆盖onDraw,那么它应该可以工作。

    http://developer.android.com/reference/android/view/View.html#setWillNotDraw(boolean)

    public MyView(Context context) {
    super(context);
    sContext = context;
    init();
    setWillNotDraw(false); 
    }
    

    【讨论】:

    • +1000 谢谢!即使这不是正确的答案,dispatchDraw() 也为我做了! :D
    • @ahmed_khan_89 你是什么意思它不是正确的答案。答案是对的。答案中指出了两种解决方法
    • 抱歉造成误会。我的意思是,提出问题的人没有选择答案作为正确答案。我不是说答案是错误的。
    • @ahmed_khan_89 哦。好的
    【解决方案3】:

    您需要调用 setWillNotDraw(false); 才能调用您的 onDraw 方法:

    private void init() {
      setWillNotDraw(false);
      ...
    }
    

    【讨论】:

      【解决方案4】:

      我使用 4.1 Jelly Bean API 16 在 C# 中未调用 OnDraw。我从使用 API 16 SDK 编译切换到使用 7.1 Nougat SDK 编译。它彻底解决了问题。我仍然在 API 16 的 manifest min sdk 中,它在我的 Jelly Beam avd 中运行良好。

      【讨论】:

        【解决方案5】:

        在我的例子中,onDraw 没有被调用,因为我返回了 0 作为视图的宽度或高度。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多