2011-07-15 2 views
0

J'essaie d'afficher les vues dont les coordonnées sur l'écran dépendent des données des capteurs. J'ai réussi à montrer un texte comme expliqué dans that SO question et j'essaye maintenant d'afficher quelques TextViews à la place, mais en appelant invalidate() sur mes TextViews, ils ne sont pas dessinés ...TextView non dessiné lors de l'opération invalidate()

Quelqu'un peut-il aider?

Merci

ARView.java

public class ARView extends TextView 
{ 
    public String name; 
    public float azimuth; 
    public float distance; 
    public float inclination; 
    public Location location; 

    public ARView(Context context) 
    {   
     super(context); 
     setText(name); 
    } 
} 

ARActivity.java

Ici, j'ajouter mon ARView à sa vue parent.

public class ARActivity extends Activity{ 

    private ARLayout ar; 
    private CBCameraView cv; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 

      super.onCreate(savedInstanceState); 

      ar = new ARLayout(getApplicationContext()); 

      cv = new CBCameraView(this.getApplicationContext()); 

      FrameLayout rl = new FrameLayout(this.getApplicationContext()); 

      rl.addView(cv, GlobalVars.screenWidth, GlobalVars.screenHeight); 
      rl.addView(ar, GlobalVars.screenWidth, GlobalVars.screenHeight); 

      setContentView(rl); 

      Location location = new Location("me"); 
      location.setLatitude(41.371974); 
      location.setLongitude(2.166978); 

      ARView fs = new ARView(this.getApplicationContext()); 
      fs.azimuth = 0; 
      fs.inclination = 0; 
      fs.location = location; 
      fs.name="Bar seco"; 
      ar.addARView(fs);      
    } 
} 

ARLayout.java

Ici, je reçois des données de capteurs, mettre à jour mes coordonnées de ARViews et nous espérons les attirer ...

public class ARLayout extends View implements LocationListener, SensorEventListener 
{ 

    // ... 

    @Override 
    public void onSensorChanged(SensorEvent event) { 

     // here I get sensors data and update my views 

     for(int i=0; i<nArViews; i++) 
     { 

      ARView view = arViews.get(i);    

      int x = ...; // new x coordinate of my ARView 
      int y = ...; // new y coordinate of my ARView 

      view.layout(x, y, view.getBottom(), view.getRight()); // set new coordinates to my ARViews 

     } 

     invalidate(); // draw my ARLayout  
    } 

    public void onDraw(Canvas c) 
    { 
     for(int i=0; i<nArViews; i++) 
     {     
      ARView view = arViews.get(i); 
      view.invalidate(); // I thought it would draw my ARViews, but it doesn't :(
     } 
    } 

    // more stuff 

} 

Répondre

0

Je ne sais pas si cela est la solution au problème spécifique, mais je sais que c'est un autre problème. Supprimer l'appel invalidate() dans la méthode onDraw(). Vous avez seulement besoin d'appeler invalider une fois par tirage. Si vous le supprimez de onDraw(), l'écran ne sera mis à jour que lorsque vous disposerez de nouvelles données de capteur. L'écran ne dessinera pas réellement jusqu'à ce que onDraw() laisse aussi.

Vous pouvez également déplacer l'appel à invalidate() APRÈS la boucle for en onDraw() et le supprimer entièrement de onSensorChanged(). Cela rendra l'écran constamment redessiné si vous avez des données de capteur ou non.

0

Il semble que vous modifiez uniquement les positions de la vue. Vous n'avez pas besoin d'appeler invalidate et vous n'avez pas besoin d'annuler onDraw. Pour ce genre de choses, l'OS sait quand redessiner. Invalidate et onDraw est uniquement pour le dessin personnalisé.

Questions connexes