17

为了清楚起见,这个问题已被显着编辑

假设我有一个 100x100px 的 .png 资源:
在此处输入图像描述

我想将该图像用作我TextView的 s 的背景,其大小由其内容决定,该内容在运行时是可变的。特别是,我希望该图像在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长度以及大小。

我怎样才能实现我的目标?

4

5 回答 5

14

我自己没有尝试过,但你可以试试这个想法/黑客/解决方法:

视图(TextView)的最小高度/宽度由其背景可绘制对象(除其他外)确定。它使用背景 Drawable 的 getMinimumHeight() 和 getMinimumWidth() 来确定 View 的最小高度和宽度。

看起来您希望 View 的最小高度和宽度为 0(不包括填充),并且 View 的宽度/高度应仅基于 View 的内容(在您的情况下为 TextView 的文本)。

在您的 Activity 的 onCreate 或 Fragment 的 onCreateView 中尝试操作,您可以在其中获取您尝试“修复”的 TextView。让我们将此 TextView 称为“电视”:

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);
...
...
于 2013-02-25T17:55:52.250 回答
1

这种方法对我有用。

  1. 清除 TextView 背景
  2. (在 postRunnable 中)保存 TextView 的宽度和高度
  3. (在 postRunnable 中)为 TextView 设置新背景
  4. (在 postRunnable 中)将宽度和高度设置为 TextView

例子

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;
        }
    });
}

希望有帮助~

于 2019-07-01T11:21:20.373 回答
0

我猜你的问题就在这里:

android:layout_width="wrap_content" android:layout_height="wrap_content"

它设置宽度来包裹内容,内容包括背景图片。我不确定您的视图的上下文是什么,但是如果您可以从代码或 xml 文件中设置高度,那么您的问题应该会消失。如果背景仍然不符合您的喜好,您可能还想添加 android:scaleType="centerCrop" 或 centerInside 作为 Houcine 提到的。

如果您告诉我们这些模糊观点的背景,我们或许可以为您提供更多信息。

于 2013-02-22T22:48:48.503 回答
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 集:

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.

如果您提前知道视图的大小并且知道它会裁剪,您可以将一个 Bitmap-XML 用于 tileMode,另一个用于重力,然后使用适当的。不幸的是,不理想。

于 2013-02-24T02:42:31.120 回答
0

你总是可以使用:

android:layout_width="match_parent"
android:layout_height="match_parent"
于 2013-02-22T23:12:35.420 回答