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.