web-dev-qa-db-de.com

Wenn Sie ein Hintergrundbild auf eine Ansicht setzen, wird meine Ansicht gestreckt

Ich habe ein Hintergrundbild-Bitmap für eine Ansicht erstellt, und jetzt wird die Ansicht auf die Größe des Hintergrundbilds gestreckt.

ist das normal?

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

so wende ich es auf meine Ansicht an

v.setBackgroundResource(R.drawable.backgroundgreen);

zum Beispiel...

wenn das Bild 500px hoch ist und die Ansicht 200px hoch ist (wird wrap_content als Höhe festgelegt) nachdem das Bild als Hintergrund festgelegt wurde, wird meine Ansicht 500px hoch ...

31
Mars

Meiner Meinung nach ist das Problem, mit dem Sie konfrontiert sind, kein Problem, es ist die Art und Weise, wie Android zum Erstellen der Layouts verwendet wird.

Das bedeutet, dass Sie die Höhe und Breite mit 3 Standardkonstanten einstellen können:

FILL_PARENT
Spezialwert für die Höhe oder Breite, die von einem View angefordert wird. FILL_PARENT bedeutet, dass die Ansicht so groß sein soll wie ihr übergeordnetes Element, abgesehen von der Auffüllung des übergeordneten Elements, falls vorhanden. Dieser Wert wird ab API Level 8 veraltet und durch MATCH_PARENT ersetzt.

MATCH_PARENT
Spezialwert für die Höhe oder Breite, die von einem View angefordert wird. MATCH_PARENT bedeutet, dass die Ansicht so groß sein soll wie ihr übergeordnetes Element, abgesehen von der Auffüllung des übergeordneten Elements, falls vorhanden. Eingeführt in API Level 8.

WRAP_CONTENT
Spezieller Wert für die Höhe oder Breite, die von einem View angefordert wird. WRAP_CONTENT bedeutet, dass View gerade groß genug sein soll, um unter Berücksichtigung des eigenen Füllens den eigenen internen Inhalt zu berücksichtigen.

Wenn Sie jetzt die Höhe/Breite von View auf WRAP_CONTENT setzen, lassen Sie zu, dass die Ansicht so viel Größe hat, dass die Ansicht den Inhalt anzeigen kann. Das Hintergrundbild ist auch der Inhalt von View. Daher wird Ihre Ansicht in der Größe des Bildes angezeigt. Das ist kein Problem, so wird es gezeigt.

Okay, aber in Ihrer Situation ist das ein Problem für Sie, weil Sie einen Hintergrund haben, den Sie anzeigen können, und die Ansicht sollte dafür nicht gedehnt werden. Ich kann einige Möglichkeiten vorschlagen:

  1. Zunächst und sehr naheliegend: Erstellen Sie Bilder in der richtigen Größe und bewahren Sie sie in verschiedenen gezeichneten Ordnern auf.

  2. Geben Sie die Größe der Ansicht an, bei der Konstanten nicht verwendet wird, jedoch in DP . Wenn es notwendig wird, erstellen Sie unterschiedliche Layout-XML-Dateien für unterschiedliche Größen und bewahren Sie sie in Layout-Ordner auf.

  3. Sie können eine sehr nützliche Sache für das Design-Layout verwenden: Layout-Gewicht .

28
MKJParekh

Ich bin mit demselben Problem konfrontiert.

Wenn das Hintergrundbild eine Größe hat, die größer als die Größe der Ansicht ist, wird die Größe der Ansicht an die Größe des Bildes angepasst.

Lösung


  1. Fügen Sie die Ansicht in ein relatives Layout ein.
  2. Entfernen Sie das Hintergrundbild.
  3. Fügen Sie eine ImageView vor der View im relativen Layout hinzu
  4. Legen Sie die src der ImageView auf Ihr Hintergrundbild fest

    <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>
    

Das alles kann natürlich im Code erfolgen.

35
Sherif elKhatib

Ich schlage vor, ein Wrapper-Layout zu erstellen und das Hintergrundbild dort einzufügen. Ich verwende es so und passt sehr gut ... siehe Beispiel unten

<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>


...
Social Coding @ AspiroTV

3
guleryuz

Der Grund ist ziemlich einfach. Sie müssen die View :: getSuggestedMinimumWidth/Height-Methode sehen.

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

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

Wenn Sie das sehen, wissen Sie vielleicht, warum der Hintergrund eine Ansicht vergrößert, insbesondere warum ihm eine BitmapDrawable zugewiesen wird.

und die einfache Lösung besteht darin, dass Drawable (zB. BitmapDrawable) umbrochen wird, dann für getMinimumHeight () und getMinimumWidth () 0 zurückgibt und getIntrinsicHeight () und getIntrinsicWidth () überschreiben, um -1 zurückzugeben.

support-v7 verfügt über einen DrawableWrapper, der bei Bedarf Aufrufe an einen anderen Drawable delegiert. Sie können das erweitern und die oben besprochenen Methoden überschreiben.

und wenn Sie nicht support-v7 (WoW! Sie sind fantastisch) verwenden, kopieren Sie diese Klasse in Ihr Projekt.

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

1
landerlyoung

Es arbeitet für mich.

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

was ist in Ihrem Code v? Hat params zu fill_parent?

1
AntPachon

Eine gute Lösung, die in meinem Fall perfekt funktioniert, ist die Erweiterung von View und das Überschreiben von onMeasure().

Hier sind die Schritte, die zu tun sind:

  1. Erstellen Sie eine eigene Klasse und erweitern Sie das View, das Sie verwenden möchten, hier für Beispiel: Ich verwende Button.
  2. Überschreiben Sie die Methode onMeasure() und fügen Sie den Code unten ein. Dadurch wird die Hintergrundressource festgelegt, nachdem die erste Messung durchgeführt wurde. Für das zweite Messereignis werden die bereits gemessenen Parameter verwendet.

Beispielcode für eine benutzerdefinierte Ansicht, die Button erweitert (ändern Sie den Button in die Ansicht, die Sie erweitern möchten)

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

    }
}

Das einzige, was Sie hier ändern müssen, ist der Typ der Ansicht, die Sie erweitern möchten, und in der onMeasure()-Methode die Hintergrundressource, die Sie für die Ansicht verwenden möchten.

Anschließend verwenden Sie diese Ansicht einfach in Ihrer Layout-XML oder fügen Sie sie programmgesteuert hinzu.

0
Chris623

Verwenden Sie nicht Android:tileMode="repeat". Ist dein grünes Zeichen größer oder kleiner als deine Sicht? Könnte weitere Details hinzufügen?

0
slybloty