Установка фонового изображения для просмотра расширяет мой взгляд - PullRequest
31 голосов
/ 20 ноября 2011

Я создал растровое изображение фонового изображения для представления, и теперь представление растягивается до размера фонового изображения ....

это нормально?

<?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 как высота) после установки изображения в качестве фона мой вид становится 500px в высоту ...

Ответы [ 7 ]

35 голосов
/ 23 ноября 2011

Я столкнулся с такой же проблемой.

Если фоновое изображение имеет размер, превышающий размер представления, размер представления изменится в соответствии с размером изображения.

Решение


  1. Поместить вид в Относительный макет.
  2. Удалить фоновое изображение.
  3. ДобавитьImageView перед просмотром в относительной компоновке
  4. Установите src ImageView на фоновое изображение

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

Это все можетбыть сделано в коде, конечно.

28 голосов
/ 28 ноября 2011

По моему мнению, проблема, с которой вы сталкиваетесь, не является проблемой, это способ использования 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. Первый и очень очевидный: создавайте изображения правильного размера и храните их в разных папках для рисования .

  2. Укажите размер просмотра, не используя константы , но в DP .Если возникнет необходимость, создайте разные XML-файлы макетов для разных размеров и сохраните их в папках макетов .

  3. Вы можете использовать очень полезную вещь для макета дизайна: макет вес .

3 голосов
/ 24 ноября 2011

Я предлагаю создать макет оболочки и поместить туда фоновое изображение.Я использую это таким образом и очень хорошо вписывается.см. пример ниже

<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

1 голос
/ 20 апреля 2016

Причина довольно проста. Вы должны увидеть метод 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), затем возвращает 0 для getMinimumHeight () и getMinimumWidth (), и лучше переопределить getIntrinsicHeight () и getIntrinsicWidth () для возврата -1.

support-v7 имеет DrawableWrapper, который при необходимости делегирует вызовы другому drawable. вы можете расширить этот и переопределить методы, о которых говорилось выше.

и если вы не используете support-v7 (WoW! Вы классные), скопируйте этот класс в свой проект.

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

1 голос
/ 20 ноября 2011

Это работает для меня.

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

0 голосов
/ 24 ноября 2016

Одно хорошее решение, которое отлично работает в моем случае, - это расширение View и переопределение onMeasure().

Вот шаги, которые нужно сделать:

  1. Создайте собственный класс и расширьте View, который вы хотите использовать, здесь для пример я буду использовать Button.
  2. Переопределите метод onMeasure() и вставьте код внизу. Это установит фоновый ресурс после выполнения первой меры. Для второго события измерения будут использоваться уже измеренные параметры.

Пример кода для пользовательского представления, которое расширяет Button (измените 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 голосов
/ 20 ноября 2011

Не используйте android:tileMode="repeat".Ваш зеленый оттягиваемый больше или меньше, чем ваш взгляд?Не могли бы вы добавить больше деталей?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...