如何实现一个android:不拉伸的背景?

时间:2011-05-05 18:06:22

标签: android android-layout

我发现这个great thread描述了如何“吃蛋糕并拥有它”,即使用Button代替ImageButton的图像(不允许SetText()调整等等。)。

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

android:background="@drawable/bgimage"

唯一的问题是它会拉伸图像以适应按钮大小。

没有硬编码固定按钮大小(以像素为单位!),有没有办法告诉Android 根本拉伸背景图像并裁剪或填充它?

11 个答案:

答案 0 :(得分:254)

您可以创建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

答案 1 :(得分:27)

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

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

例如在你的

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

答案 2 :(得分:25)

只需使用ImageButton代替Button即可解决问题。

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

你可以设置

android:background="@null"

如果需要,可以删除按钮背景。

快速修复!! : - )

答案 3 :(得分:8)

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

答案 4 :(得分:6)

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

塞尔

答案 5 :(得分:4)

使用Android Studio SDK工具中包含的 draw9patch ...您可以定义图像的可伸展区域。重要部件受到约束,图像看起来并非全部扭曲。关于dra9patch的一个很好的演示是HERE

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

答案 6 :(得分:3)

我有一张背景图片,尺寸不大,但尺寸很奇怪 - 因此拉伸和性能不佳。我创建了一个方法,其参数Context,View和drawable ID(int)将匹配设备屏幕大小。在例如Fragments 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);
}

答案 7 :(得分:1)

这是Santosh针对以编程方式创建的按钮的答案版本,无需单独的XML配置:

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系列,因为它与具有普通背景图像的按钮的工作方式略有不同。

答案 8 :(得分:0)

关键是将drawable设置为按钮的图像,而不是背景。像这样:

rb.setButtonDrawable(R.drawable.whatever_drawable);

答案 9 :(得分:0)

可以在他的xml中使用普通的ImageView并使其可点击  (机器人:可点击= “真”)? 您只需使用形状像按钮即圆角的图像作为src。

答案 10 :(得分:0)

您可以使用FrameLayout作为第一个孩子ImageView,然后将您的正常布局作为第二个孩子:

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