我有一个应用程序需要动态对齐图像上某些位置的文本视图。图像被缩放以适合视图。文本条目由用户添加。我正在使用 RelativeLayout 和边距来正确定位文本。一切都很好。
当用户旋转屏幕时,我使用 onRetainNonConfigurationInstance() 保存文本位置和位图。重新创建视图后,我将视图重新添加到 RelativeLayout。现在,由于视图的大小不同,图像的比例也不同。要将文本框保持在同一位置,我必须考虑到这一点。除了一个问题外,我所有的代码都在工作......
如果我创建一个 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() 回调时,它会设置缩放值并使用以下代码更新 TextView 的字体大小和位置:
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 布局结构有关。但是,我不明白为什么我不能从头开始重新计算(没有拆除所有视图并重新创建它们)。