2012-09-03 5 views
1

J'ai une vue personnalisée qui étend View:Pourquoi ce `onDraw` ne se déclenche pas?

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

je l'ai déclaré dans main.xml:

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

    <Button android:id="@+id/btnAdd" 
      android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="add"/> 

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

</LinearLayout> 

Et dans mon activité, lorsque le bouton Add est cliqué, un drawable sera ajouté à 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); 
    } 

} 

Mais cela ne fonctionne pas. Lorsque je clique sur le bouton « Ajouter », les impressions de la console:

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

Et l'écran n'a pas des images présentées. La méthode onDraw ne semble pas déclenchée, comment y remédier?

+0

Il est étrange qu'il est déclenché sur mon pad android, mais pas sur l'émulateur. – Freewind

Répondre

1

Vous devez définir des limites pour drawables.

Quelque chose comme ceci:

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