Как сохранить соотношение сторон на кнопках изображения в Android? - PullRequest
34 голосов
/ 11 января 2011

У меня есть 5 квадратных кнопок изображения, которые я хочу расположить рядом в нижней части экрана. У меня есть каждый набор (разные идентификаторы) как:

        <ImageButton
         android:id="@+id/box1" 
         android:layout_width="fill_parent"
         android:layout_height="wrap_content" 
         android:layout_gravity="center"
         android:adjustViewBounds="true"
         android:scaleType="fitXY"
         android:layout_weight="1"
         android:layout_margin="1dp"
         /> 

и у меня есть фон, назначенный в основной Java следующим образом:

    int[] imageIds = new int[] {R.id.box1,R.id.box2,R.id.box3,R.id.box4,R.id.box5};
    for(int i = 0; i<5; i++){
        imageButtons[i] = (ImageButton) findViewById(imageIds[i]);
        imageButtons[i].setBackgroundResource(R.drawable.blank);
    }

То, что я хотел бы сделать, это масштабировать ширину, чтобы она аккуратно помещалась рядом с нижней частью экрана (что теперь хорошо), но высота автоматически масштабируется, чтобы соответствовать ширине. Это возможно? Я не хочу использовать setImageSource, потому что тогда он помещает границу вокруг кнопки изображения.

Ответы [ 9 ]

32 голосов
/ 02 ноября 2011
   <LinearLayout
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:id="@+id/layoutButtons">

     <com.package.SquareButton         
        android:layout_height="fill_parent"
        android:layout_width="0dip"          
        android:layout_weight="1"

        <ImageView
        android:id="@+id/box1"
        android:layout_gravity="center"
        android:adjustViewBounds="true"
        android:scaleType="centerInside"
        android:layout_height="wrap_content"
        android:layout_width="0dp"          
        android:layout_weight="1" 
        android:layout_marginLeft="5dp" 
        android:layout_marginRight="5dp"/>

      </com.package.SquareButton>

      <com.package.SquareButton         
        android:layout_height="fill_parent"
        android:layout_width="0dip"          
        android:layout_weight="1"

        <ImageView
        android:id="@+id/box2"
        android:layout_gravity="center"
        android:adjustViewBounds="true"
        android:scaleType="centerInside"
        android:layout_height="fill_parent"
        android:layout_width="fill_parent"          
        android:layout_marginLeft="5dp" 
        android:layout_marginRight="5dp"/>

</com.package.SquareButton>

   .........          
 </LinearLayout>

А затем добавьте этот класс пользовательских кнопок:

public class SquareButton extends LinearLayout {

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

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

    // This is used to make square buttons.
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, widthMeasureSpec);
    }
}
29 голосов
/ 01 ноября 2011

У меня была похожая головная боль при попытке получить мои кнопки в ряд. Я нашел решение использовать ImageButton и свойство android:src (setImageSource в коде) в сочетании с android:background="@null"

Как я понимаю, * * * * * * * * * * * * Кнопка изображения не зависит от adjustViewBounds, это только imageView, который вы установили в android:src.

Тогда поведение по умолчанию - квадратная кнопка с изображением в центре. Вы можете переопределить это, установив фон @null, который оставляет вас только с изображением.

Затем вы можете использовать LinearLayout или таблицу для размещения кнопок. Я сделал все в XML и использовал следующий макет, чтобы создать ряд из двух кнопок в нижней части экрана, которые увеличивали или уменьшали, сохраняя соотношение сторон при разных размерах экрана устройства. Надеюсь, это поможет.

<TableLayout    
    android:id="@+id/tableLayout2"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_marginBottom="20dip"
    android:stretchColumns="*">

    <TableRow>

     <ImageButton
        android:id="@+id/button_one"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_gravity="center"
        android:layout_weight="0.5"
        android:adjustViewBounds="true"
        android:scaleType="fitCenter"  
        android:onClick="clickOne"
        android:background="@null"
        android:src="@drawable/button_one_drawable" />

    <ImageButton
        android:id="@+id/button_two"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_gravity="center"
        android:layout_weight="0.5"
        android:adjustViewBounds="true"
        android:scaleType="centerInside"  
        android:onClick="clickTwo"
        android:background="@null"
        android:src="@drawable/button_two_drawable" />

    </TableRow>      
</TableLayout>
12 голосов
/ 11 января 2011

вместо

android:scaleType="fitXY" 

использование:

android:scaleType="centerInside"

РЕДАКТИРОВАТЬ1: Попробуйте это:

    <LinearLayout
            android:orientation="vertical"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:id="@+id/layoutToInflateButtons"
            >
    <ImageButton 
        android:id="@+id/box1"
        android:layout_gravity="center"
        android:adjustViewBounds="true"
        android:scaleType="centerInside"          
        android:layout_weight="1"          
        android:layout_margin="1dp"
        />          
    </LinearLayout>
3 голосов
/ 03 августа 2016

Вы можете использовать Google Percent Relative Layout, который помогает вам управлять соотношением сторон просмотра.

Вы можете использовать это так

     <android.support.percent.PercentRelativeLayout
             xmlns:android="http://schemas.android.com/apk/res/android"
             xmlns:app="http://schemas.android.com/apk/res-auto"
             android:layout_width="match_parent"
             android:layout_height="match_parent">

         <ImageButton
             android:id="@+id/box1" 
             android:layout_width="fill_parent"
             android:layout_height="wrap_content" 
             android:layout_gravity="center"
             android:adjustViewBounds="true"
             android:scaleType="fitXY"
             app:layout_aspectRatio="100%"
             android:layout_weight="1"
             /> 
     </android.support.percent.PercentFrameLayout>

Соотношение сторон 100% сделает ширину такой же, как высота.

пример:

android:layout_width="300dp"
app:layout_aspectRatio="178%"

ширина 178% от высоты. Это формат, который ожидает layout_aspectRatio

Вы можете прочитать это подробно здесь

1 голос
/ 07 октября 2012

После проверки примера приложения Google I / O этого года я обнаружил, что Google использует значения измерений для указания высоты или ширины переменных в зависимости от типа экрана. Для получения подробной информации вы можете проверить исходный код от http://code.google.com/p/iosched/.

Вы можете указать высоту кнопки для примера в values-xhdpi или values-sw720dp как:

 <resources>
    <dimen name="button_height">50dp</dimen>
</resources>

И тогда вы можете просто использовать это значение размера при указании высоты:

android:layout_height="@dimen/button_height"
1 голос
/ 31 октября 2011

Я уверен, что вы хотите иметь эти 5 кнопок одинаковой ширины / высоты. Если это так, возьмите LinearLayout и поместите все эти 5 кнопок с layout_width="0dip" и layout_weight="1"

Например:

<LinearLayout
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:id="@+id/layoutButtons">

    <ImageButton 
        android:id="@+id/box1"
        android:layout_gravity="center"
        android:adjustViewBounds="true"
        android:scaleType="centerInside"
        android:layout_height="wrap_content"
        android:layout_width="0dip"          
        android:layout_weight="1"/>

    <ImageButton 
        android:id="@+id/box2"
        android:layout_gravity="center"
        android:adjustViewBounds="true"
        android:scaleType="centerInside"
        android:layout_height="wrap_content"
        android:layout_width="0dip"          
        android:layout_weight="1"/>    

   .........          
 </LinearLayout>
0 голосов
/ 20 мая 2015

Изучите создание пользовательской кнопки ImageButton. Мне это нравится, потому что это один класс. Вот кнопка, которая регулирует свою высоту в зависимости от соотношения сторон изображения. Я полагаю, вы можете настроить под свои нужды:

public class AspectImageButton extends ImageButton {


public AspectImageButton(Context context) {
    super(context);
    // TODO Auto-generated constructor stub
    this.getDrawable();

}

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

    int width = getMeasuredWidth();

    Drawable d=this.getDrawable(); //grab the drawable

    float fAspectRatio=(float)d.getIntrinsicWidth()/(float)d.getIntrinsicHeight();

    float fHeight=(float)width/fAspectRatio;//get new height

    setMeasuredDimension(width, (int)fHeight);
}

public AspectImageButton(Context context, AttributeSet attrs) {
    super(context, attrs);

    // TODO Auto-generated constructor stub
}

public AspectImageButton(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);

    // TODO Auto-generated constructor stub
}

}

тогда в xml просто используйте это так:

<com.package.AspectImageButton
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:src="@drawable/home_1b"
                android:background="@null"
                android:scaleType="fitXY"
                android:adjustViewBounds="true" />
0 голосов
/ 21 сентября 2013
ViewGroup.LayoutParams params = imageButtonName.getLayoutParams();
// Changes the height(or width) and width(or height) to the specified 
params.height = layout.getWidth();
0 голосов
/ 04 ноября 2011

Установите ширину кнопок ImageButtons на fill_parent и используйте тип масштаба fitStart для изображений, обнимающих левое поле, и fitEnd для изображений справа. Должен сделать трюк, по крайней мере, насколько ваш пример изображения идет. У вас могут возникнуть проблемы с интервалом, если пропорциональная ширина изображений превышает ширину экрана, но это должно работать для вас.

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