0

Android アプリ (API 8) 用に作成したカスタム ビュー (RelativeLayout) に問題があります。キャンバスに小さな画像を表示するカスタム ビューを実装しました。ビューが最初に描画されるときを除いて、これはすべて正常に機能します。

画像の位置は、最初の測定後にスケーリングされます。onDrawおよび関数で正しい座標が指定されonLayoutますが、ビューはまだスケーリングされていない位置に描画されます。画面のオンとオフを再度切り替えると、ビューは正しい位置に描画されます。ただし、自分で再描画をトリガーすることはできません。以下はonLayoutコードのスニペットです。

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

ではcalculateMeasurements()、正しい縮尺が計算されます。onLayoutLogCat がログに表示されるため、 (そして正しい座標を持っている) に到達することはわかっていonDrawますが、前述のように、ビューは正しい場所に描画されません。

4

1 に答える 1