Подтвердить что ты не робот

Настройка фонового изображения на вид растягивает мой взгляд

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

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

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

4b9b3361

Ответ 1

По моему мнению, проблема, с которой вы сталкиваетесь, не является проблемой, именно так используется Android для разработки макетов.

Это означает, что вы можете установить высоту и ширину с тремя постоянными значениями по умолчанию:

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, поэтому вы увидите как размер изображения, так и изображение. Это не проблема, как это показано.

Хорошо, но в вашей ситуации проблема для вас, потому что у вас есть фон для показа и просмотра, для этого не нужно растягивать. Я могу предложить несколько способов:

  • Первое и очень очевидное: сделайте изображения с правильным размером и сохраните их в разных доступных папках.

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

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

Ответ 2

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

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

Решение


  • Поместите представление в относительную компоновку.
  • Удалить фоновое изображение.
  • Добавить ImageView перед представлением в Relative Layout
  • Установите 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>
    

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

Ответ 3

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

<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

Ответ 4

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

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

Ответ 5

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

и если вы не используете support-v7 (WoW! you're awesome), скопируйте этот класс в свой проект также хорошо.

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

Ответ 6

Не используйте android:tileMode="repeat". Является ли ваш зеленый вытягиваемый больше или меньше вашего вида? Могли бы добавить более подробную информацию?

Ответ 7

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

Вот шаги:

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

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