【问题标题】:Background Image Placement背景图像放置
【发布时间】:2010-05-06 13:41:49
【问题描述】:

我正在尝试将我的根 LinearLayout 元素(在两个维度上都设置为 fill_parent)设置为具有始终位于屏幕左下角的背景图像,无论设备的方向如何。如果有某种方法可以设置背景图像位置,例如您可以使用“背景位置:左下角”对 css 进行的设置,那就太好了。但我没有看到在 Android 中实现这一目标的方法。有没有办法做到这一点?

感谢您的帮助。

【问题讨论】:

    标签: android background-image android-layout


    【解决方案1】:

    您必须使用 XML 文件中的位图创建一个可绘制的自定义位图(例如“res/drawables/my_drawable.xml”

    <?xml version="1.0" encoding="utf-8"?>
    <bitmap
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:src="@drawable/my_png_file"
        android:gravity="bottom|left" />
    

    然后将此可绘制 xml 设置为视图的背景(“@drawables/my_drawable”)。 不过,可绘制的 XML 格式在 Android 站点中的文档记录非常少,因此弄清楚如何自行解决绝对不是一个容易的问题。

    【讨论】:

    • 如何在另一个 XML 中引用该 XML 位图?
    • 与您引用任何其他可绘制对象的方式相同 - 在我的示例中,如果您将其命名为 my_drawable.xml 它会在任何可以引用任何其他类型的地方引用为 @drawable/my_drawable可绘制(如 android:backgroundandroid:drawableLeft 在 textview 上等)
    • 没有文件夹 res/drawables。如果您尝试创建它,则会发生错误。我创建了一个 xml 文件夹并将其放在那里并修复了错误
    • 感谢这段代码,没想到要试试位图
    【解决方案2】:

    如果发现以编程方式执行此操作的优势:图像适合布局而不是更大。不知道为什么。

    代码:

    Bitmap bmp = BitmapFactory.decodeResource(getResources(),
                    R.drawable.image);
    BitmapDrawable bitmapDrawable = new BitmapDrawable(bmp);
    bitmapDrawable.setGravity(Gravity.BOTTOM|Gravity.RIGHT);
    LinearLayout layout = (LinearLayout) findViewById(R.id.background_root);
    layout.setBackgroundDrawable(bitmapDrawable);
    

    【讨论】:

    • 这样做的另一个好处是它可以应用于许多只改变图像的视图
    【解决方案3】:

    将您的 LinearLayout 包装成一个 RelativeLayout 并向其中添加一个 ImageView。使用 android:layout_alignParentBottom 和 android:layout_alignParentLeft 您可以将图像放在左下方。

    <RelativeLayout
        android:id="@+id/relativeLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    
        <ImageView
            android:id="@+id/imageView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_alignParentLeft="true"
            android:src="@drawable/my_image" />
    
        <LinearLayout
            android:id="@+id/linearLayout"
            ... >
    

    确保 ImageView 是在背景中绘制图像的 RelativeLayout 的第一个元素。

    【讨论】:

      【解决方案4】:

      我的答案只是上述答案的更新 如果您使用 XML 作为背景,则可能会出现纵横比问题

      所以使用这个代码

      Bitmap bmp = BitmapFactory.decodeResource(getResources(),
                      R.drawable.image);
      BitmapDrawable bitmapDrawable = new BitmapDrawable(bmp);
        bitmapDrawable.setGravity(Gravity.BOTTOM| Gravity.RIGHT| Gravity.FILL_HORIZONTAL);
      LinearLayout layout = (LinearLayout) findViewById(R.id.background_root);
      layout.setBackgroundDrawable(bitmapDrawable);
      

      Gravity.Fill_HORIZONTAL 将适合您应用背景的布局宽度,您也可以在 XML 文件中提及这一点,但正如我所说,这将出现图像比例问题

      【讨论】: