如何保持在android中的图像button的长宽比?

我有5个方形ImageButtons,我想排在屏幕的底部并排。 我有每一个设置(不同的ID)为:

<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,因为那么它会在imagebutton周围放置一个边框。

Solutions Collecting From Web of "如何保持在android中的图像button的长宽比?"

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

然后添加这个自定义button类:

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

我试图把我的纽扣连接起来也有类似的头痛。 我find的解决scheme是与android:background="@null"结合使用ImageButtonandroid:src属性(代码中的setImageSource

据我所知,图像button的背景不受adjustViewBounds影响,它只是在android:src设置的adjustViewBounds

然后默认的行为就是给你一个方形的button,在它的中间有一个imageView。 您可以通过将背景设置为@null来覆盖,只留下图像。

然后,您可以使用LinearLayout或表格来布局button。 我用XML做了所有事情,并使用以下布局在屏幕底部创build一排两个button,可以向上或向下缩放,以不同的设备屏幕尺寸保持纵横比。 希望这可以帮助。

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

代替

 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> 

我相信你想要有5个等于宽度/高度的button。 如果是这种情况,然后采取LinearLayout并把所有这5个button与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> 

您可以使用Google的百分比相对布局来帮助您pipe理视图宽高比。

你可以像这样使用它

  <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期望的格式

你可以在这里详细阅读

从今年的Google I / O示例应用程序中,我发现Google正在使用维度值来根据屏幕types指定varios的高度或宽度。 有关详细信息,可以从http://code.google.com/p/iosched/查看源代码&#x3002;

你可以在value-xhdpi或values-sw720dp中指定button的高度,例如:

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

然后,您可以在指定高度时使用此维度值:

 android:layout_height="@dimen/button_height" 

将ImageButton的宽度设置为fitStart ,对拥有左边距的图像使用scaletype fitStart ,对fitStart的图像使用fitEnd。 应该做的伎俩,至less就你的示例图像去。 如果图像的比例宽度超过屏幕宽度,则可能会有一些间距问题,但它应该适合您。

 ViewGroup.LayoutParams params = imageButtonName.getLayoutParams(); // Changes the height(or width) and width(or height) to the specified params.height = layout.getWidth(); 

研究制作一个自定义ImageButton。 我喜欢这个,因为它只有一个类。 这是一个按照图像宽高比调整高度的button。 我想你可以调整你的需求:

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