17

わかりやすくするために、この質問は大幅に編集されています

100x100pxの.pngリソースがあるとしましょう。
ここに画像の説明を入力してください

その画像をsの背景として使用したいと思いTextViewます。このサイズは、実行時に可変であるコンテンツによって決定されます。特に、TextViewサイズが100x100pxより大きい場合はその画像を並べて表示し、100x100pxTextViewより小さい場合は画像をトリミングする必要があります。

後者は難しいようです。

サンプルコード

ドローアブルリソースがあり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>

何が起こっていますか

これがこのコードの結果のスクリーンショットであり、私が期待するもの/私が望むものの1つです: ここに画像の説明を入力してください

ご覧のとおり、タイリング部分が機能し、下のタイルが切り取られています。ただし、TextViewが背景よりも小さい場合、は背景TextViewのサイズになります。

推奨される解決策

  • android:gravity="clip_vertical|clip_horizontal"-これは、タイルモードがなくても機能しません。
  • レイアウトパラメータとして使用match_parent-オプションではありません。
  • TextView固定の高さを設定する-コンテンツの長さ、およびそのサイズを知る方法はありません。

どうすれば目標を達成できますか?

4

5 に答える 5

14

私はこれを自分で試したことはありませんが、このアイデア/ハック/回避策を試すことができます:

ビュー(TextView)の最小の高さ/幅は、(とりわけ)その背景の描画可能性によって決定されます。背景のDrawableのgetMinimumHeight()とgetMinimumWidth()を使用して、ビューの最小の高さと幅を決定します。

ビューの最小の高さと幅を0(パディングを除く)にし、ビューの幅/高さはビューのコンテンツ(この場合はTextViewのテキスト)のみに基づく必要があるようです。

アクティビティの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);
...
...
于 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ファイルから高さを設定できれば、問題は解決するはずです。それでも背景が好みに合わない場合は、Houcineが述べたように、android:scaleType="centerCrop"またはcenterInsideを追加することもできます。

これらの漠然とした見解の文脈を教えていただければ、おそらくより多くの情報を提供することができます。

于 2013-02-22T22:48:48.503 に答える
0

いつでも使用できます:

android:layout_width="match_parent"
android:layout_height="match_parent"
于 2013-02-22T23:12:35.420 に答える
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.

ビューのサイズが事前にわかっていて、クリップすることがわかっている場合は、tileMode用に1つのBitmap-XMLを使用し、重力用に別のBitmap-XMLを使用して、適切なものを使用できます。残念ながら、理想的ではありません。

于 2013-02-24T02:42:31.120 に答える