2012-05-08 2 views
0

Je veux savoir si nous pouvons appeler la méthode Ondraw() d'Android conditionnellement basée sur un drapeau. Par exemple, ondraw() doit être appelé uniquement lorsqu'une trame particulière est décodée.En utilisant la fonction OnDraw() sous Android conditionnellement

Tenir compte de cette situation:

decoder(); /// @NDK 

set flag; 

if (Flag==set) 

{ 

OnDraw() works and displays an image 

}  

else 

OnDraw sleeps; 

Peut-on mettre en œuvre ce type d'activités dans Android, si oui, comment?

+2

ce que vous cherchez est View.invalidate(). onDraw ne sera appelé que si un invalide a été émis au préalable. – Renard

+0

Merci. Dans mon cas, la pause pour ondraw() ne durera que quelques millisecondes - juste pour la durée du décodage de la trame - (et cela aussi sera différent pour les frames differenet) est-ce que j'utilise toujours View.invalidate()? – gpuguy

+0

Je pense que vous devriez le tester. J'ai toujours 50-60 images pour mes vues personnalisées où j'étais invalide directement dans onDraw. Mais si cela ne fonctionne pas pour vos contraintes, vous devez passer à quelque chose de plus complexe comme un SurfaceView avec un thread de rendu dédié. – Renard

Répondre

0

Dans votre commentaire, vous avez demandé un exemple de code. J'imagine que vous avez une vue personnalisée dans votre mise en page qui affiche les images décodées. En principe, il pourrait ressembler à ceci:

class FrameView extends View { 

    private Bitmap mBitmap; 

    public FrameView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     //Your drawing logic 
     canvas.drawBitmap(mBitmap,0,0, null); 
    } 

    private void setFrame(final Bitmap b){ 
     if (mBitmap!=null){ 
      mBitmap.recycle(); 
     } 
     mBitmap = b; 
     //trigger onDraw, if this method is not called from a ui thread switch to postInvalidate() 
     this.invalidate(); 
    } 
} 

Vous prenez une poignée ce point de vue en appelant findViewById() dans votre activité. Ensuite, dans votre thread de décodage, vous appelez setFrame sur la vue. Veillez à utiliser postInvalidate() si setFrame est appelé depuis l'extérieur de l'UI-thread.

+0

A travaillé pour moi !! Merci – gpuguy

Questions connexes