AppWidget 中的旋转文本

Rotated text in AppWidget

我有一个 App Widget 的布局,它有一个 3x3 的旋转 TextView 网格:

<LinearLayout
    style="@style/WidgetButtonLayout"
    android:id="@+id/widget_buttons_text_port" >

    <LinearLayout style="@style/WidgetButtonRow">
        <TextView
            style="@style/WidgetButton.Text"
            android:rotation="-90"
            android:id="@+id/upperLeft_text_port" />
        <TextView
            style="@style/WidgetButton.Text"
            android:rotation="-90"
            android:id="@+id/upperMiddle_text_port" />
        <TextView
            style="@style/WidgetButton.Text"
            android:rotation="-90"
            android:id="@+id/upperRight_text_port" />
    </LinearLayout>

    <LinearLayout style="@style/WidgetButtonRow">
        <TextView
            style="@style/WidgetButton.Text"
            android:rotation="-90"
            android:id="@+id/middleLeft_text_port" />
        <TextView
            style="@style/WidgetButton.Text"
            android:rotation="-90"
            android:id="@+id/middleMiddle_text_port" />
        <TextView
            style="@style/WidgetButton.Text"
            android:rotation="-90"
            android:id="@+id/middleRight_text_port" />
    </LinearLayout>

    <LinearLayout style="@style/WidgetButtonRow">
        <TextView
            style="@style/WidgetButton.Text"
            android:rotation="-90"
            android:id="@+id/lowerLeft_text_port" />
        <TextView
            style="@style/WidgetButton.Text"
            android:rotation="-90"
            android:id="@+id/lowerMiddle_text_port" />
        <TextView
            style="@style/WidgetButton.Text"
            android:rotation="-90"
            android:id="@+id/lowerRight_text_port" />
    </LinearLayout>

</LinearLayout>

样式所在位置:

<style name="WidgetButtonLayout">
    <item name="android:layout_width">match_parent</item>
    <item name="android:layout_height">match_parent</item>
    <item name="android:orientation">vertical</item>
    <item name="android:weightSum">3</item>
</style>

<style name="WidgetButtonRow">
    <item name="android:layout_width">match_parent</item>
    <item name="android:layout_height">wrap_content</item>
    <item name="android:orientation">horizontal</item>
    <item name="android:layout_weight">1</item>
    <item name="android:weightSum">3</item>
</style>

<style name="WidgetButton">
    <item name="android:layout_weight">1</item>
    <item name="android:layout_width">0dp</item>
    <item name="android:layout_height">match_parent</item>
    <item name="android:layout_margin">1dp</item>
    <item name="android:gravity">center</item>
</style>

<style name="WidgetButton.Text">
    <item name="android:textSize">15sp</item>
    <item name="android:text">@string/button_settings</item>
    <item name="android:textColor">@color/widgetButtonText</item>
    <item name="android:background">@color/transparent</item>
</style>

这工作正常,除了每个网格框中的文本基于未旋转的宽度而不是旋转的宽度换行,因此文本在有 space 时换行,因为它不是。 .. 参见例如下面小部件中左上角的网格框:

知道如何解决这个问题吗?我确实考虑过只使用固定的且比需要的更宽的 TextView,但这里的问题是 TextView 是根据网格布局动态调整大小的。

编辑请注意,由于这是在 App Widget 的上下文中设置的,因此此布局适用于 RemoteView,我无法使用 setRotation() 在 TextView 上以编程方式设置旋转(请参阅 ) 和其他类似选项同样受到限制。

如果不是特定的 AppWidget 案例,我会建议您使用自定义视图,例如 this 答案建议。

虽然它是Widget,因此我们不能使用自定义视图。不过我们可以使用肮脏的技巧。

试试这个技巧:

  • 硬编码 TextViewlayout_widthlayout_height 大于预期的文本大小 - 例如 1024dp x 1024dp。

  • 将您的TextView放在FrameLayout

  • 使用 gravity 属性将文本定位在 TextView 边界内。

  • 使用 layout_gravity 属性将 TextView 定位在 FrameLayout

在你的情况下,它将看起来像这样:

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:orientation="horizontal">

        <FrameLayout
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:padding="8dp">
            <TextView
                android:layout_width="1024dp"
                android:layout_height="1024dp"
                android:layout_gravity="center"
                android:gravity="center"
                android:rotation="-90"
                android:text="Some text smaller than container" />
        </FrameLayout>
        <FrameLayout
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:padding="8dp">
            <TextView
                android:layout_width="1024dp"
                android:layout_height="1024dp"
                android:layout_gravity="center"
                android:gravity="center"
                android:rotation="-90"
                android:text="Some text smaller than container" />
        </FrameLayout>
        <FrameLayout
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:padding="8dp">
            <TextView
                android:layout_width="1024dp"
                android:layout_height="1024dp"
                android:layout_gravity="center"
                android:gravity="center"
                android:rotation="-90"
                android:text="Some text smaller than container" />
        </FrameLayout>

    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:orientation="horizontal">

        <FrameLayout
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:padding="8dp">
            <TextView
                android:layout_width="1024dp"
                android:layout_height="1024dp"
                android:layout_gravity="center"
                android:gravity="center"
                android:rotation="-90"
                android:text="Some text smaller than container" />
        </FrameLayout>
        <FrameLayout
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:padding="8dp">
            <TextView
                android:layout_width="1024dp"
                android:layout_height="1024dp"
                android:layout_gravity="center"
                android:gravity="center"
                android:rotation="-90"
                android:text="Some text smaller than container" />
        </FrameLayout>
        <FrameLayout
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:padding="8dp">
            <TextView
                android:layout_width="1024dp"
                android:layout_height="1024dp"
                android:layout_gravity="center"
                android:gravity="center"
                android:rotation="-90"
                android:text="Some text smaller than container" />
        </FrameLayout>

    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:orientation="horizontal">

        <FrameLayout
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:padding="8dp">
            <TextView
                android:layout_width="1024dp"
                android:layout_height="1024dp"
                android:layout_gravity="center"
                android:gravity="center"
                android:rotation="-90"
                android:text="Some text smaller than container" />
        </FrameLayout>
        <FrameLayout
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:padding="8dp">
            <TextView
                android:layout_width="1024dp"
                android:layout_height="1024dp"
                android:layout_gravity="center"
                android:gravity="center"
                android:rotation="-90"
                android:text="Some text smaller than container" />
        </FrameLayout>
        <FrameLayout
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:padding="8dp">
            <TextView
                android:layout_width="1024dp"
                android:layout_height="1024dp"
                android:layout_gravity="center"
                android:gravity="center"
                android:rotation="-90"
                android:text="Some text smaller than container" />
        </FrameLayout>

    </LinearLayout>

</LinearLayout>