为了清楚起见,此问题已经过重大修改。
假设我的.png资源为100x100px:
我希望将该图像用作TextView
的背景,其大小由其内容决定,该内容在运行时是可变的。特别是,我希望在TextView
大小大于100x100px时平铺图像,并且我希望在TextView
小于100x100px时裁剪它。
后者似乎很难。
我有一个可绘制的资源bg_tile.xml
:
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@drawable/bg"
android:tileMode="repeat" />
我的布局文件:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:background="@drawable/bg_tile"
android:text="Short text"
android:textSize="20sp" />
<TextView android:layout_margin="8dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/bg_tile"
android:text="Long text long text long text long text long text long text long text long text long textlong text long text long text long text long text long text long text long text long textlong text long text long text long text long text long text long text long text long text "
android:textSize="20sp" />
</LinearLayout>
以下是此代码结果的屏幕截图,以及我期望/我想要的内容之一:
如您所见,平铺部分正常工作,底部瓷砖正在切断。但是,当TextView
小于背景时,TextView
会占用背景的大小。
android:gravity="clip_vertical|clip_horizontal"
- 即使没有tilemode,这也行不通。match_parent
作为布局参数 - 不是选项。TextView
的内容有多长,以及它的大小。我如何实现目标?
答案 0 :(得分:13)
我自己没试过,但你可以尝试这个想法/黑客/解决方法:
视图(TextView)的最小高度/宽度由其背景可绘制(以及其他内容)决定。它使用背景Drawable的getMinimumHeight()和getMinimumWidth()来确定View的最小高度和宽度。
看起来您希望View的最小高度和宽度为0(不包括填充),View的宽度/高度应仅基于View的内容(在您的情况下,TextView的文本)。
在您的Activity的 onCreate 或片段的 onCreateView 中尝试此操作,您可以在其中获取正在尝试“修复”的TextView。我们称这个TextView为'tv':
TextView tv;
...
...
tv = (TextView)...findViewById(...);
....
// Swap the 'standard' bitmap background with one that has no minimum width/height.
BitmapDrawable background = (BitmapDrawable)tv.getBackground(); // assuming you have bg_tile as background.
BitmapDrawable newBackground = new BitmapDrawable(background.getBitmap) {
@Override
public int getMinimumWidth() {
return 0;
}
@Override
public int getMinimumHeight() {
return 0;
}
};
newBackground.setTileModeXY(background.getTileModeX(), background.getTileModeY());
tv.setBackgroundDrawable(newBackground);
...
...
答案 1 :(得分:1)
此方法对我有用。
示例
public void setTextViewBg(final TextView textView, final Drawable newBgDrawable) {
textView.setBackground(null);
textView.post(new Runnable() {
@Override
public void run() {
int width = textView.getWidth();
int height = textView.getHeight();
textView.setBackgroundDrawable(newBgDrawable);
LinearLayout.LayoutParams layoutParams = (LayoutParams) textView.getLayoutParams();
layoutParams.width = width;
layoutParams.height = height;
}
});
}
希望有帮助〜
答案 2 :(得分:0)
我猜你的问题就在这里:
机器人:layout_width = “WRAP_CONTENT” 机器人:layout_height = “WRAP_CONTENT”
设置包装内容的宽度,内容包括背景图像。我不确定您的视图的上下文是什么,但如果您只能从代码或xml文件设置高度,那么您的问题就会消失。您可能还想添加android:scaleType =“centerCrop”或centerInside作为Houcine提到,如果背景仍然不符合您的喜好。
如果您告诉我们这些模糊观点的背景,我们可能会为您提供更多信息。
答案 3 :(得分:0)
您可以随时使用:
android:layout_width="match_parent"
android:layout_height="match_parent"
答案 4 :(得分:0)
试试这个:
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@drawable/bg_light"
android:tileMode="repeat"
android:gravity="clip_vertical|clip_horizontal" />
其他选项:http://developer.android.com/guide/topics/resources/drawable-resource.html#Bitmap
编辑:我阅读文档,这不适用于tileMode set:
android:tileMode
Keyword. Defines the tile mode. When the tile mode is enabled, the bitmap is repeated. Gravity is ignored when the tile mode is enabled.
如果您提前了解了视图的大小并知道它会剪辑,那么您可以为tileMode创建一个Bitmap-XML,为重力创建另一个Bitmap-XML,然后使用适当的一个。不幸的是,这并不理想。