伸縮しないandroid:backgroundを実装する方法は?


100

「ケーキを食べてそれを手に入れる」方法を説明するこの素晴らしいスレッドを見つけました。つまり、Button代わりに画像を使用しますImageButton(これはSetText()、、サイズ変更などを許可しません)

これは、View属性を使用して実現されます。

android:background="@drawable/bgimage"

これの唯一の問題は、ボタンのサイズに合わせて画像を拡大することです。

固定ボタンサイズ(ピクセル単位)をハードコーディングする前に、背景画像をまったく引き伸ばさないようにAndroidに指示し、トリミングまたはパディングする方法はありますか?

回答:


29

引き伸ばしたくない場合は、ImageViewを使用する必要があります。背景画像は常にビューに合わせて拡大されます。オブジェクトにイメージのアスペクトを強制するには、それをDrawableとして設定する必要があります。

それ以外の場合、ボタンのアイデアに固執している場合は、ボタンのスケーリングを強制して、画像が拡大しないようにする必要があります。

コード:

onCreate(Bundle bundle) {
  // Set content layout, etc up here

  // Now adjust button sizes
  Button b = (Button) findViewById(R.id.somebutton);
  int someDimension = 50; //50pixels
  b.setWidth(someDimension);
  b.setHeight(someDimension);
}

1
ありがとう+ 1. ImageView面白そうだ。にない属性があることに気づきましたButtonandroid:cropToPadding。代わりにImageViewを使用してもかまいませんsetOnClickListener()。からButtonに切り替えると何が失われImageViewますか?
ef2011

1
ところで、あなたが提案した2番目のソリューションはまだ画像を引き伸ばします。
ef2011

最終的に固定ボタンサイズ(ピクセル単位)を使用しましたが、最初の提案が代替ソリューションとして機能しているように見えるので、私はあなたの回答を受け入れます。
ef2011

1
@ ef2011 ImageViewの場合、背景画像として設定しないでください。それをaとして設定してから、trueに設定されsetDrawableResourceていることを確認してくださいsetAdjustViewBounds
Dr.J

9
不完全なソリューションに反対票を投じました。ここでの正しい解決策:stackoverflow.com/a/9362168/145046
Aleks N.

260

xmlビットマップを作成して、ビューの背景として使用できます。ストレッチを防ぐために、android:gravity属性を指定できます。

例えば:

<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/dvdr"
    android:tileMode="disabled" android:gravity="top" >
</bitmap>

画像のレンダリングをカスタマイズするために使用できる多くのオプションがあります

http://developer.android.com/guide/topics/resources/drawable-resource.html#Bitmap


素晴らしい答えのバディ!
Carnal

3
ImageViewsの使用は回避策であり、常に可能なオプションとは限りません-これは適切な解決策であると信じています:)
JakeP

3
実行時に背景を設定しています。実行時にビットマップを作成する解決策はありますか?
Vivek Kumar Srivastava 2014

1
私にとってこれは最良の解決策でしたが、「重力」属性を削除しました。これにより、デフォルト値「塗りつぶし」と一致します。これにより、画面に合わせて画像のサイズを変更できます。詳細については、@ Santoshリンクをご覧ください。ありがとう!
Hugo、

12
このアプローチには1つの問題しかありません。ドローアブルソースがすでにコンテナよりも大きい場合、これにより、イメージをサイズ変更せずに(重力に基づいて)クリップし、アスペクト比を維持して、コンテナに合わせます。
Shashwat Black 2014

25

問題ImageButtonButton修正する代わりに使用するだけです。

<ImageButton android:layout_width="30dp"
             android:layout_height="30dp"
             android:src="@drawable/bgimage" />

そして、あなたは設定することができます

android:background="@null"

必要に応じてボタンの背景を削除します。

クイックフィックス!! :-)


1
次に、setImageResource()メソッドで画像を設定します。
arlomedia 2014

ボタンの画像と背景色の両方が欲しかった...これは魅力のように機能しました
Abhishek Chauhan '17

私にとってはより正確に機能します(つまり、「layout_centerVertical」など)。
Maxim Firsoff 2017年

11

通常のレイアウトでオーバーレイするRelativeLayoutでImageViewを使用しています。コードは不要です。画像を画面の高さ全体(または使用する他のレイアウト)にサイズ変更し、幅に合わせて画像を左右にトリミングします。私の場合、ユーザーが画面を回転させると、画像が少し小さすぎる可能性があります。したがって、私はmatch_parentを使用します。これは、小さすぎる場合に画像の幅を拡大します。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:id="@+id/main_backgroundImage"
        android:layout_width="match_parent"
        //comment: Stretches picture in the width if too small. Use "wrap_content" does not stretch, but leaves space

        android:layout_height="match_parent"
        //in my case I always want the height filled

        android:layout_alignParentTop="true"
        android:scaleType="centerCrop"
        //will crop picture left and right, so it fits in height and keeps aspect ratio

        android:contentDescription="@string/image"
        android:src="@drawable/your_image" />

    <LinearLayout
        android:id="@+id/main_root"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >
    </LinearLayout>

</RelativeLayout>

この実際には存在しないはずの問題のためにはるかに簡単に解決策
AKOSNikházy

6

同じ問題が発生しました。元の画像の代わりに9パッチ画像(.9.png)のみを使用する必要があります。

サージ


5

Android StudioのSDKツールに含まれているdraw9patch ...を使用します。画像の伸縮可能な領域を定義できます。重要な部分は制限されており、画像はすべて歪んで見えません。dra9patchの優れたデモはこちらです

draw9patchを使用して既存のsplash.pngをnew_splash.9.pngに変更し、new_splash.9.pngをdrawable-hdpiプロジェクトフォルダーにドラッグして、AndroidManifestとstyles.xmlが以下のように適切であることを確認します。

AndroidManifest.xml:

<application
...
        android:theme="@style/splashScreenStyle"
>

styles.xml:

<style name="splashScreenStyle" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="android:windowBackground">@drawable/new_splash</item>
</style>

3

サイズは大きくありませんが、奇妙なサイズの背景画像がありました。そのため、ストレッチとパフォーマンスの低下がありました。デバイスの画面サイズと一致するパラメーターContext、View、およびドローアブルID(int)を使用してメソッドを作成しました。例えばFragments onCreateViewでこれを使用して、背景を設定します。

public void setBackground(Context context, View view, int drawableId){
    Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(),drawableId);

    bitmap = Bitmap.createScaledBitmap(bitmap, Resources.getSystem().
             getDisplayMetrics().widthPixels,
             Resources.getSystem().getDisplayMetrics().heightPixels,
             true);

    BitmapDrawable bitmapDrawable = new BitmapDrawable(context.getResources(), 
                                    bitmap);

    view.setBackground(bitmapDrawable);
}

1

以下は、プログラムで作成されたボタンに対するSantoshの回答のバージョンです。個別のXML構成は必要ありません。

Button button = new Button(getContext());
Bitmap backgroundBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.my_button);
BitmapDrawable backgroundDrawable = new BitmapDrawable(getResources(), backgroundBitmap);
backgroundDrawable.setGravity(Gravity.CENTER); // also LEFT, CENTER_VERTICAL, etc.
backgroundDrawable.setColorFilter(new PorterDuffColorFilter(Color.RED, PorterDuff.Mode.SRC_ATOP));
button.setBackground(backgroundDrawable);

ColorFilter行は、通常の背景画像のボタンとは少し異なるため、含めました。


1

最初の子としてa FrameLayoutを使用しImageView、次に2番目の子として通常のレイアウトを使用できます。

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

  <ImageView
        android:id="@+id/background_image_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scaleType="centerCrop"
        android:src="@drawable/your_drawable"/>

  <LinearLayout
        android:id="@+id/your_actual_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

  </LinearLayout>

</FrameLayout>

0

重要なのは、ドローアブルを背景ではなくボタンの画像として設定することです。このような:

rb.setButtonDrawable(R.drawable.whatever_drawable);

これは、CompoundButtonのメソッドですが、Buttonのメソッドではありません。
arlomedia 2014

0

彼のxmlでプレーンなImageViewを使用してクリック可能にすることができますか(android:clickable = "true")?ボタンのような形、つまり角が丸い画像をsrcとして使用するだけです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.