我有一个应用程序需要动态对齐图像上某些位置的文本视图。缩放图像以适合视图。文本条目由用户添加。我正在使用RelativeLayout和margin来正确定位文本。一切都很好。
当用户旋转屏幕时,我使用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()回调时,它会设置缩放值并使用以下代码更新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布局结构有关,我通常理解。但是,我不明白为什么我不能从头开始重新计算(没有拆除所有视图并重新创建它们)。