TextView gravity =“top”但动态更改字体大小不会使文本与顶部对齐

时间:2012-06-20 14:55:10

标签: layout text textview alignment font-size

我有一个应用程序需要动态对齐图像上某些位置的文本视图。缩放图像以适合视图。文本条目由用户添加。我正在使用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布局结构有关,我通常理解。但是,我不明白为什么我不能从头开始重新计算(没有拆除所有视图并重新创建它们)。

0 个答案:

没有答案