为啥这个 `onDraw` 没有被触发?

Posted

技术标签:

【中文标题】为啥这个 `onDraw` 没有被触发?【英文标题】:Why this `onDraw` doesn't be triggered?为什么这个 `onDraw` 没有被触发? 【发布时间】:2012-09-03 03:07:19 【问题描述】:

我有一个扩展 View 的自定义视图:

public class MyView extends View 

    public List<Drawable> drawables = new ArrayList<Drawable>();

    public MyView(Context context) 
        super(context);
    

    public MyView(Context context, AttributeSet attrs) 
        super(context, attrs);
    

    public void addDrawable(Drawable drawable) 
        this.drawables.add(drawable);
        Log.i("myview", "new drawable added: " + drawables.size());
        invalidate();
    

    @Override
    protected void onDraw(Canvas canvas) 
        super.onDraw(canvas);
        Log.i("myview", "on draw, my drawables: " + drawables.size());
        for (Drawable d : drawables) 
            d.draw(canvas);
            Log.i("myview", "Draw drawable: " + d);
        
    

我在 main.xml 中声明了它:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_
              android:layout_>

    <Button android:id="@+id/btnAdd"
            android:layout_ android:layout_ android:text="add"/>

    <com.example.MyView android:id="@+id/imageView"
                        android:layout_
                        android:layout_
                        android:background="#6699cc">
    </com.example.MyView>

</LinearLayout>

在我的活动中,当点击按钮Add 时,一个drawable 将添加到MyView

public class MyActivity extends Activity 

    private Button btnAdd;
    private MyView myView;


    /**
     * Called when the activity is first created.
     */
    @Override
    public void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        findViews();
        setListeners();
    

    private void setListeners() 
        this.btnAdd.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View v) 
                myView.addDrawable(getResources().getDrawable(R.drawable.m1));
            
        );
        this.myView.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View v) 
            
        );
    

    private void findViews() 
        this.myView = (MyView) findViewById(R.id.imageView);
        this.btnAdd = (Button) findViewById(R.id.btnAdd);
    


但它不起作用。当我点击“添加”按钮时,控制台打印:

09-02 17:07:27.015: INFO/myview(1748): new drawable added: 1

并且屏幕没有显示图像。 onDraw 方法好像没有触发,如何解决?

【问题讨论】:

奇怪的是它是在我的android pad上触发的,而不是在模拟器上触发的。 【参考方案1】:

您必须为drawables 设置边界。

类似这样的:

drawable.setBounds(10,10,100,100); 
this.drawables.add(drawable);

【讨论】:

以上是关于为啥这个 `onDraw` 没有被触发?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 cellForRowAtIndexPath 没有被触发,但其他方法被触发了?

为啥 useEffect 没有被触发?

为啥我的 Action 事件没有被触发?

为啥 viewDidAppear 没有被触发?

为啥我的 redux-observable 史诗没有被触发?

为啥我的复选框更改事件没有被触发?