android如何更改<item>宽度和高度</item>

时间:2012-05-22 17:16:33

标签: android xml

我正在制作<layer-list>为drawable。

我有我的背景图片,我希望第二层更小, 但似乎我在android:layer_widthandroid:layer_height内写的并不重要。

第二层尺寸仍然相同。

这是我的xml:

<?xml version="1.0" encoding="utf-8"?>
<layer-list
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

    <item
        android:drawable="@drawable/picuser" 
        android:layout_width="50dp"
        android:layout_height="50dp" />

    <item
        android:drawable="@drawable/ic_launcher" 
        android:layout_width="10dp"
        android:layout_height="10dp" />
</layer-list>

7 个答案:

答案 0 :(得分:30)

这是一种解决方法,但它对我有用 您可以使用填充以使第二个drawable更小。

<item android:drawable="@drawable/circyle" />

<item
    android:drawable="@drawable/plus" 
    android:top="10dp"
    android:bottom="10dp"
    android:right="10dp"
    android:left="10dp" />

答案 1 :(得分:19)

我希望这能让你朝着正确的方向前进:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@drawable/picuser"/>

    <item>

        <bitmap
            android:src="@drawable/ic_launcher"
            android:gravity="center" />
    </item>
</layer-list>

正如您所见here<item>没有layout_width / layout_height属性。

答案 2 :(得分:10)

与某人说的不同,<item>也有宽度和高度属性。感谢@Entreco发布的演示。
android:width的{​​{1}}和android:heightDrawable的{​​{1}}和android:layout_width相似,不像android:layout_height View并且match_parent,但您可以通过将属性wrap_content设置为match_parentandroid:gravity来实现left|right的相同行为(用于匹配父级的宽度) ,或start|end(用于匹配父母的身高)。

不幸的是,这些属性仅在 API 23 之后可用。

但是,考虑到我建议的上述方法取代top|bottommatch_parentandroid:width属性可用于android:height元素(必须放在<size>)没有任何API限制,您可以使用简单的解决方法:

<shape>

上述解决方案利用了<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item> <shape android:shape="rectangle"> <size android:width="152dp" android:height="152dp"/> <solid android:color="#00FFFFFF"/> </shape> </item> <item> <bitmap android:gravity="left|right|top|bottom" android:src="@mipmap/ic_launcher"/> </item> </layer-list> (带有透明<item>)和未经过尺寸设置<shape>的{​​{1}}设置为<bitmap> {1}}用于匹配父级的维度。因此,android:gravity的实际大小将取决于同一父级中唯一大小的left|top|right|bottom的大小。

编辑:

感谢@Emil S,他注意到上述解决方案不能用作窗口背景。它只能作为任何视图的背景或前景正常工作。我不知道这种奇怪行为的特殊原因,但我可以猜测,当系统创建一个具有<bitmap>属性指定的背景的窗口时,没有执行布局,因为尚未启动任何进程。因此,我认为,Android最终将在屏幕尺寸上光栅化可绘制并将其拉伸以填充整个窗口。这可以解释如何发生这种情况。

编辑:

@JoãoCarlos在使用自适应图标(由背景和前景制作的图标,支持矢量绘图)时,指出我的解决方案不起作用(因为它会导致循环继承)。但是,他的观点是无稽之谈,因为自适应图标需要 API 26 :可以在启动画面上直接使用<item>android:windowBackground或其他东西(他们只需要 API 23 ) 因此,为了让任何版本的Android都可以运行,您需要区分两个drawable,前者用于 API&lt; 23 ,使用我发布的解决方案,后者用于 API&gt; = 23 ,使用我在帖子开头所说的两个属性。

答案 3 :(得分:8)

从API等级23及更高版本,您可以实际设置宽度和宽度。物品的高度

<item
    android:drawable="@drawable/splash_logo"
    android:height="100dp"
    android:width="100dp"/>

注意:使用android:widthandroid:height代替android:layout_widthandroid:layout_height

答案 4 :(得分:2)

我已经尝试了很多,但我找不到一种可靠的方法来将徽标置于XML布局中。 最后,我发现了以下解决方法:

mToolbar.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            ImageView imageView = (ImageView)mToolbar.findViewById(R.id.logo);
            if (mToolbar == null)
                return;
            int toolbarWidth = mToolbar.getWidth();
            int imageWidth = imageView.getWidth();
            imageView.setX((toolbarWidth - imageWidth) / 2);
        }
    });

layout_toolbar.xml:

<android.support.v7.widget.Toolbar 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/toolbar"
    style="@style/Toolbar"
    android:layout_width="match_parent"
    android:layout_height="@dimen/toolbar_height"                                                                   
    android:background="@drawable/toolbar_background"
    android:focusable="false"                                
    app:titleTextAppearance="@style/AppTheme.Toolbar.Title">

    <ImageView
        android:id="@+id/logo"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/toolbar_logo" />
</android.support.v7.widget.Toolbar>

答案 5 :(得分:1)

尝试一下:

<?xml version="1.0" encoding="utf-8"?>
<!-- The android:opacity=”opaque” line is critical in preventing a flash 
of black as your theme transitions. -->
<layer-list
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:opacity="opaque">

    <!-- The background color, preferably the same as your normal theme -->
    <item android:drawable="@android:color/white" />

    <item
        android:height="100dp"
        android:width="100dp"
        android:gravity="center">

        <bitmap
            android:src="@drawable/ic_launcher_bc_512"/>
    </item>
</layer-list>

答案 6 :(得分:0)

向后兼容的解决方案:

<item>
    <shape
        android:shape="rectangle">

        <size
            android:width="152dp"
            android:height="152dp"/>

        <solid
            android:color="#00FFFFFF"/>
    </shape>
</item>

<item>
    <bitmap
        android:gravity="left|right|top|bottom"
        android:src="@mipmap/ic_launcher"/>
</item>

注意事项和解决方案:

  1. 作为窗口背景,这是行不通的

    • API 级别 ≥ 24
      为了在窗口背景中使用,可能值得尝试自定义可绘制对象。可以在 this 之类的样式中引用它们。
    • API 级别 <24
      我还没有找到任何解决方案。
  2. 这也不适用于自适应图标

    • 参考Entreco's answer
      由于自适应图标需要 API 级别 26,因此可以使用从 API 级别 23 开始可用的 android:widthandroid:height 属性。

欲了解更多信息,