2013-05-17 4 views
0

J'ai un problème avec une vue personnalisée (qui est un RelativeLayout) que j'ai faite pour une application android (API 8). J'ai mis en place une vue personnalisée qui affiche de petites images sur un canevas. Tout fonctionne bien, sauf la première fois que la vue est dessinée.Android customview n'invalide pas les marges en onlayout ou ondraw

Les positions des images sont mises à l'échelle après la première mesure. Les coordonnées correctes sont données dans les fonctions onDraw et onLayout, mais les vues sont toujours dessinées sur les positions non mises à l'échelle. Si vous activez et désactivez l'écran, les vues sont dessinées sur la bonne position. Cependant, je ne peux pas sembler déclencher un redessin moi-même. Voici un extrait du code onLayout ci-dessous.

calculateMeasurements(); 
int x = (int) (v.getPositionX()*scaleX+offset[1]); 
int y = (int) (v.getPositionY()*scaleY+offset[0]); 

Log.w("View.onLayout", "__Creating v: (orig)(" + v.getPositionX()+","+v.getPositionY() + ")"+ 
"\n  (scaled)(" + x +","+y+")");  

RelativeLayout.LayoutParams params = 
(RelativeLayout.LayoutParams)foto_views.get(v.getIdentifier()).getLayoutParams(); 
params.setMargins(x, y, 0, 0); 
foto_views.get(v.getIdentifier()).setLayoutParams(params); 

Log.e("OpstellingView.onLayout" , " Layoutparams: (" 
+((RelativeLayout.LayoutParams)foto_views.get(v.getIdentifier()).getLayoutParams()).leftMargin + " ," 
+ ((RelativeLayout.LayoutParams)foto_views.get(v.getIdentifier()).getLayoutParams()).topMargin + " ," 
); 

foto_views.get(v.getIdentifier()).requestLayout(); 
foto_views.get(v.getIdentifier()).invalidate(); 
this.invalidate(); 

Dans calculateMeasurements(), les échelles correctes sont calculées. Je sais qu'il obtient onLayout et onDraw (et a les coordonnées correctes) parce que LogCat l'affiche dans le journal, mais comme je l'ai dit les vues ne sont pas dessinées à l'endroit correct.

Répondre

0

J'ai ajouté un AsyncTask pour charger les images, et maintenant les marges sont affichées correctement. Je ne sais toujours pas pourquoi cela fonctionne, mais c'est le cas. Je pense que c'est parce qu'un ProgressDialog force la vue à se redessiner.