画像上の特定の場所にテキスト ビューを動的に配置する必要があるアプリがあります。画像はビューに合わせてスケーリングされます。テキスト エントリは、ユーザーによって追加されます。テキストを適切に配置するために、RelativeLayout とマージンを使用しています。すべてが良いです。
ユーザーが画面を回転すると、onRetainNonConfigurationInstance() を使用してテキストの場所とビットマップを保存します。ビューが再作成されたら、ビューを RelativeLayout に追加し直します。ビューのサイズが異なるため、画像の縮尺も異なります。テキスト ボックスを同じ場所に配置するには、その点を考慮する必要があります。1つの問題を除いて、すべてのコードが機能しています....
TextView を作成し、fontSize を小さいサイズ (例: <11px) に設定すると、テキスト ボックスの上部は希望する場所に配置されますが、テキストは 11px フォントのようにベースラインに揃えられます。onCreate メソッドの倍率がわからないので、onMeasure と onLayout が呼び出されるまでフォント サイズを変更できません。forceLayout() と requestLayout() を試しましたが、配置の問題は解決していないようです。
レイアウトは次のとおりです。
<?xml version="1.0" encoding="utf-8"?>
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/scrollView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="0dp"
>
<com.xyx.ScalableLayout
android:id="@+id/layout"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:padding="0dp"
android:clickable="true"
android:gravity="top"
>
<com.xyx.ScaledImageView
android:id="@+id/formView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:padding="0dp"
/>
<com.xyx.ScalableLayout>
</ScrollView>
次のコードで textView が追加されます。
textView = new TextView(getContext());
textView.setPadding(0, 0, 0, 0);
textView.setSingleLine();
textView.setFocusableInTouchMode(false);
textView.setClickable(false);
textView.setGravity(Gravity.TOP);
textView.setText(entry.mText);
float fontSize = mImageView.mapSizeToView(entry.mPointSize);
textView.setTextSize(TypedValue.COMPLEX_UNIT_PT, fontSize);
params = new RelativeLayout.LayoutParams(
ViewGroup.MarginLayoutParams.WRAP_CONTENT,
ViewGroup.MarginLayoutParams.WRAP_CONTENT);
params.leftMargin = Math.round(viewLoc.x);
params.topMargin = Math.round(viewLoc.y);
addView(textView, params);
ScaledImageView が onSizeChanged() コールバックを取得すると、スケール値を設定し、次のコードで TextViews のフォント サイズと位置を更新します。
float fontSize = mImageView.mapSizeToView(entry.mPointSize);
textView.setTextSize(TypedValue.COMPLEX_UNIT_PT, fontSize);
PointF viewLoc = computeTopLeft(entry, entry.mTextView.getPaint());
params = (RelativeLayout.LayoutParams) textView.getLayoutParams();
params.leftMargin = Math.round(viewLoc.x);
params.topMargin = Math.round(viewLoc.y);
textView.setLayoutParams(params);
textView.forceLayout();
最後に、ScalableLayout で requestLayout() を実行します。
私はそれがたくさんのコードであることを知っていますが、私の問題はこれです。TextView を作成して画面に追加するときに適切な倍率 (mapSizeToView() で使用) を知っていれば、すべて正常に動作します。値が正しくない場合、TextView をそのフォント サイズで作成された場合と同じにする完全な再計算を行うものは何も見つかりません。私が一般的に理解しているAndroidレイアウト構造に関連していると思います。ただし、最初から再計算できない理由がわかりません(すべてのビューを破棄して再作成する以外に)。