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,因此我们不能使用自定义视图。不过我们可以使用肮脏的技巧。
试试这个技巧:
硬编码 TextView
的 layout_width
和 layout_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>
我有一个 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,因此我们不能使用自定义视图。不过我们可以使用肮脏的技巧。
试试这个技巧:
硬编码
TextView
的layout_width
和layout_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>