web-dev-qa-db-ja.com

背景画像をビューに設定すると、ビューが拡大します

ビューの背景画像ビットマップを作成しましたが、ビューは背景画像のサイズに拡大されています。..

これは正常ですか?

<?xml version="1.0" encoding="utf-8"?>
    <bitmap xmlns:Android="http://schemas.Android.com/apk/res/Android"
        Android:src="@drawable/green"
        Android:tileMode="repeat"/>

これが私のビューにどのように適用されるかです

v.setBackgroundResource(R.drawable.backgroundgreen);

例えば...

画像を背景として設定した後、画像の高さが500ピクセルで、ビューの高さが200ピクセルの場合(wrap_contentを高さとして設定)、ビューの高さは500ピクセルになります...

31
Mars

私によると、あなたが直面している問題は問題ではなく、レイアウトの設計にAndroidを使用する方法です。

これは、3つのデフォルトの定数値で高さと幅を設定できることを意味します。

FILL_PARENT
Viewによって要求された高さまたは幅の特別な値。 FILL_PARENTは、ビューがその親と同じ大きさを望んでいることを意味し、もしあれば親のパディングを差し引いています。この値はAPIレベル8から非推奨になり、MATCH_PARENTに置き換えられました。

MATCH_PARENT
Viewによって要求された高さまたは幅の特別な値。 MATCH_PARENTは、ビューがその親と同じ大きさを望んでいることを意味し、もしあれば親のパディングを差し引いています。 APIレベル8で導入されました。

WRAP_CONTENT
Viewによって要求された高さまたは幅の特別な値。 WRAP_CONTENTは、Viewが、独自のパディングを考慮して、独自の内部コンテンツに適合するだけの大きさになりたいことを意味します。

これで、Viewの高さ/幅をWRAP_CONTENTに設定すると、ビューのコンテンツに表示するのに十分なサイズをビューに許可することになります。背景画像はViewのコンテンツでもあるため、画像と同じサイズのビューが表示されます。それは問題ではありません、それはそれが示されている方法です。

わかりました。しかし、あなたの状況では、あなたには問題があります。それは、あなたが見せたり見たりする背景があるからです。いくつかの方法を提案できます。

  1. 最初の非常に明白なこと:正しいサイズの画像を作成し、異なる drawable folder に保存します。

  2. constants ではなく、 [〜#〜] dp [〜#〜] でビューのサイズを指定します。必要に応じて、サイズごとに異なるレイアウトXMLファイルを作成し、 レイアウトフォルダー に保存します。

  3. 設計レイアウトに非常に有用なものを使用できます layout weight

28
MKJParekh

この同じ問題に直面しました。

背景画像のサイズがビューのサイズよりも大きい場合、ビューのサイズは画像のサイズに合わせて変更されます。

ソリューション


  1. ビューを相対レイアウト内に配置します。
  2. 背景画像を削除します。
  3. 相対レイアウト内のビューの前にImageViewを追加します
  4. ImageViewのsrcを背景画像に設定します

    <RelativeLayout
        .
        .
        . >
    
        <ImageView
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:layout_alignLeft="@+id/yourViewId"
            Android:layout_alignRight="@+id/yourViewId"
            Android:layout_alignTop="@+id/yourViewId"
            Android:layout_alignBottom="@+id/yourViewId"
            Android:adjustViewBounds="true" 
            //this will allow the image to resize with same proportions
            Android:src="@drawable/yourDrawable" />
    
        <YourView
            Android:id="@+id/yourViewId"
            .
            ..
            ... />
    
      </RelativeLayout>
    

もちろん、これはすべてコードで実行できます。

35
Sherif elKhatib

ラッパーレイアウトを作成し、そこに背景画像を配置することをお勧めします。私はそれをそのように使用しており、非常にうまく適合しています。以下の例を参照してください

<ScrollView
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/settingstab_scroll"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:scrollbars="vertical"
    Android:background="@drawable/wareninja_wallpaper_img"
    >
<!-- your layouts and components goes here -->
</ScrollView>


...
ソーシャルコーディング@ AspiroTV

3
guleryuz

その理由は非常に簡単です。 View :: getSuggestedMinimumWidth/Heightメソッドを参照する必要があります。

protected int getSuggestedMinimumWidth() {
    return (mBackground == null) ? mMinWidth : max(mMinWidth, mBackground.getMinimumWidth());
}

protected int getSuggestedMinimumHeight() {
    return (mBackground == null) ? mMinHeight : max(mMinHeight, mBackground.getMinimumHeight());
}

それを見ると、なぜ背景がビューを大きくするのか、特にBitmapDrawableをそれに割り当てる理由がわかるかもしれません。

簡単な解決策は、そのDrawable(たとえばBitmapDrawable)をラップしてから、getMinimumHeight()およびgetMinimumWidth()に対して0を返し、getIntrinsicHeight()およびgetIntrinsicWidth()をオーバーライドして-1を返すことです。

support-v7には、必要に応じて呼び出しを別のドロウアブルに委任するDrawableWrapperがあります。その1つを拡張し、上記のメソッドをオーバーライドできます。

また、support-v7を使用しない場合(すごい!)、そのクラスをプロジェクトにコピーしても問題ありません。

https://Android.googlesource.com/platform/frameworks/support/+/1949ae9aeaadf52ad7bd7bb74ca5419c67ea7f65/v7/appcompat/src/Android/support/v7/internal/widget/DrawableWrapper.Java

1
landerlyoung

それは私のために働いています。

< ?xml version="1.0" encoding="utf-8"?>
 < LinearLayout

xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:orientation="vertical"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent" Android:id="@+id/LinearLayoutTest">    
@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.prueba);


    ((LinearLayout)findViewById(R.id.LinearLayoutTest)).setBackgroundResource(R.drawable.greenrepeat);
}

あなたのコードでは、vは何ですか? fill_parentへのパラメーターがありますか?

1
AntPachon

私の場合、完璧に機能する1つの良い解決策は、Viewを拡張し、onMeasure()をオーバーライドすることです。

実行する手順は次のとおりです。

  1. 独自のクラスを作成し、使用するViewを拡張します。ここでは、たとえばButtonを使用します。
  2. メソッドonMeasure()をオーバーライドし、コードを下部に挿入します。これにより、最初の測定が完了した後にバックグラウンドリソースが設定されます。 2番目の測定イベントでは、既に測定されたパラメーターを使用します。

Buttonを拡張するカスタムビューのサンプルコード(ボタンを拡張するビューに変更します)

_public class MyButton extends Button {

    boolean backGroundSet = false;

    public MyButton(Context context) {
        super(context);
    }

    public MyButton(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public MyButton(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);          
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

        if(backGroundSet) {
            setMeasuredDimension(getMeasuredWidth(), getMeasuredHeight());
            return;
        }

        super.onMeasure(widthMeasureSpec, heightMeasureSpec);

        backGroundSet = true;
        setBackgroundResource(R.drawable.button_back_selector);

    }
}
_

ここで変更する必要があるのは、拡張するビューのタイプと、onMeasure()メソッドでビューに使用するバックグラウンドリソースだけです。

その後、レイアウトxmlでこのビューを使用するか、プログラムで追加します。

0
Chris623

Android:tileMode="repeat"を使用しないでください。あなたの緑のドローアブルはあなたのビューよりも大きいですか、小さいですか?さらに詳細を追加できますか?

0
slybloty