如何实现一个不伸展的android:background?

我发现这个伟大的线程描述如何“吃蛋糕,也有它”,即使用图像的Button而不是ImageButton (它不允许SetText() ,resize等)。

这是通过使用View属性来实现的:

 android:background="@drawable/bgimage" 

唯一的问题是,它拉伸图像,以适应button的大小。

短的硬编码固定的button大小(以像素为单位),有没有办法告诉Android 不要拉伸的背景图像,不是裁剪或填充它?

如果你不想让它伸展,你应该使用ImageView 。 背景图像将始终伸展以适应视图。 您需要将其设置为Drawable来强制图像方面的对象。

否则,如果你坚持button的想法,那么你将需要强制button缩放,以防止图像拉伸。

比如在你的

 OnCreate(Bundle bundle) { //set content layout, etc up here //now adjust button sizes Button B = (Button) findViewById(R.id.somebutton); int someDimension = 50; //50pixels B.setWidth(someDimension); B.setHeight(someDimension); } 

您可以创build一个xml位图并将其用作视图的背景。 为了防止拉伸,您可以指定android:gravity属性。

例如:

 <?xml version="1.0" encoding="utf-8"?> <bitmap xmlns:android="http://schemas.android.com/apk/res/android" android:src="@drawable/dvdr" android:tileMode="disabled" android:gravity="top" > </bitmap> 

有很多选项可以用来自定义图像的渲染

http://developer.android.com/guide/topics/resources/drawable-resource.html#Bitmap

简单地使用ImageButton而不是Button修复了这个问题。

 <ImageButton android:layout_width="30dp" android:layout_height="30dp" android:src="@drawable/bgimage" /> 

你可以设置

 android:background="@null" 

如果你想要删除button背景。

快速解决 !! 🙂

我在一个RelativeLayout中使用一个ImageView,它与我的普通布局重叠。 没有要求的代码。 它将图像的大小设置为屏幕的全高(或任何其他使用的布局),然后将图像左右裁剪以适合宽度。 在我的情况下,如果用户转动屏幕,图片可能会太小。 因此,我使用match_parent,如果太小,会使图像的宽度拉伸。

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:id="@+id/main_backgroundImage" android:layout_width="match_parent" //comment: Stretches picture in the width if too small. Use "wrap_content" does not stretch, but leaves space android:layout_height="match_parent" //in my case I always want the height filled android:layout_alignParentTop="true" android:scaleType="centerCrop" //will crop picture left and right, so it fits in height and keeps aspect ratio android:contentDescription="@string/image" android:src="@drawable/your_image" /> <LinearLayout android:id="@+id/main_root" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > </LinearLayout> </RelativeLayout> 

我有同样的问题:你应该只使用9补丁图像(.9.png),而不是你的原始图片。

哔叽

使用Android Studio SDK工具中的draw9patch …。 您可以定义图像的可拉伸区域。 重要的部分是受限制的,图像看起来并不全是扭曲的。 这是一个关于dra9patch的好演示

使用draw9patch将您现有的splash.png更改为new_splash.9.png,将new_splash.9.png拖放到drawable-hdpi项目文件夹中,确保AndroidManifest和styles.xml是正确的,如下所示:

AndroidManifest.xml中:

 <application ... android:theme="@style/splashScreenStyle" > 

styles.xml:

 <style name="splashScreenStyle" parent="Theme.AppCompat.Light.DarkActionBar"> <item name="android:windowBackground">@drawable/new_splash</item> </style> 

以下是Santosh为编程式创build的button的答案,不需要单独的XMLconfiguration:

 Button button = new Button(getContext()); Bitmap backgroundBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.my_button); BitmapDrawable backgroundDrawable = new BitmapDrawable(getResources(), backgroundBitmap); backgroundDrawable.setGravity(Gravity.CENTER); // also LEFT, CENTER_VERTICAL, etc. backgroundDrawable.setColorFilter(new PorterDuffColorFilter(Color.RED, PorterDuff.Mode.SRC_ATOP)); button.setBackground(backgroundDrawable); 

我包括了ColorFilter线,因为它与具有正常背景图像的button有点不同。

我有一个背景图像,尺寸不大,但具有奇怪的尺寸 – 因此,拉伸和糟糕的performance。 我做了一个参数上下文,一个视图和一个可绘制的ID(int),将匹配设备的屏幕大小的方法。 在例如一个片段onCreateView中使用这个来设置背景。

 public void setBackground(Context context, View view, int drawableId){ Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), drawableId); bitmap = Bitmap.createScaledBitmap(bitmap, Resources.getSystem().getDisplayMetrics() .widthPixels, Resources.getSystem().getDisplayMetrics().heightPixels, true); BitmapDrawable bitmapDrawable = new BitmapDrawable(context.getResources(), bitmap); view.setBackground(bitmapDrawable); } 

关键是将drawable设置为button的图像,而不是作为背景。 喜欢这个:

 rb.setButtonDrawable(R.drawable.whatever_drawable); 

可以在他的xml中使用一个普通的ImageView,并使其可以点击(android:clickable =“true”)? 你只需要使用一个形状像一个button,即圆angular的图像。

您可以使用带有ImageViewFrameLayout作为第一个孩子,然后使用您的普通布局作为第二个孩子:

 <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:id="@+id/background_image_view" android:layout_width="match_parent" android:layout_height="match_parent" android:scaleType="centerCrop" android:src="@drawable/your_drawable"/> <LinearLayout android:id="@+id/your_actual_layout" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> </LinearLayout> </FrameLayout>