使用layer-list创建背景drawable,图标被拉伸了

14

嗨,我正在尝试为我的闪屏界面创建一个背景drawable,将在主题中设置。但用于保持中心位置的位图可拉伸,我无法弄清楚如何使其保持正常。以下是我的drawable代码: splash_screen_bg.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
    <shape xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape="rectangle">
        <gradient
            android:angle="360"
            android:centerColor="@color/colorAccentXDark"
            android:endColor="@color/Black"
            android:gradientRadius="500dp"
            android:startColor="@color/colorAccentXDark"
            android:type="radial"
            android:useLevel="false" />
    </shape>
</item>
<item
    android:bottom="50dp"
    android:top="50dp">
    <shape xmlns:android="http://schemas.android.com/apk/res/android"
        android:innerRadius="500dp"
        android:innerRadiusRatio="1"
        android:shape="oval">
        <gradient
            android:angle="360"
            android:centerColor="@color/colorAccentXDark"
            android:endColor="@color/colorAccentXDark"
            android:gradientRadius="400dp"
            android:startColor="@color/colorAccent"
            android:type="radial"
            android:useLevel="false" />
    </shape>
</item>
<item android:gravity="center">
    <bitmap android:src="@drawable/ty_logo" />
</item>
</layer-list>

这里是我设置一个drawable作为activity背景的代码:

 <style name="TYTheme" parent="SearchActivityTheme.NoActionBar">
    <item name="colorPrimaryDark">@color/colorAccentXDark</item>
    <item name="android:alertDialogTheme">@style/AlertDialogTheme</item>
    <item name="android:windowBackground">@drawable/splash_screen_bg</item>
</style>

所以说这里的位图可绘制对象ty_logo是一个png文件,在我的手机上被拉伸了。由于bitmapDrawable没有scaleType选项,我不知道该如何处理它。


1
你找到这个问题的答案了吗?我现在也遇到了同样的问题,但是找不到解决方案。 - baal
还没有得到解决方案。 - himanshu1496
4个回答

8
在你的位图集中添加gravity并设置为center
<item android:gravity="center">
    <bitmap android:src="@drawable/ty_logo" 
            android:gravity="center" />
</item>

4
我希望你提供的ty_logo像素合适,并为不同的设备屏幕提供了不同像素的图像(如ldpi、mdpi、hdpi、xhdpi等)。如果没有,请参考类似问题的答案:在xml中调整位图大小 否则,如果你的目标版本是API 23,则可以轻松解决此问题,因为已经提供了width、height和gravity属性。
如果不是,下面的代码应该可以使用gravity属性来处理位图。再次假设您的标志不具有比设备分辨率更高的像素。
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
...

<item>
      <bitmap android:src="@drawable/ty_logo"
        android:gravity="center" />
</item>

...
</layer-list>

2
你可以将位图包裹在ScaleDrawable <scale>中,并在LayerListDrawable中使用ScaleDrawable
<item android:gravity="center">
    <scale android:drawable="@drawable/ty_logo"
         android:scaleHeight="80%"
         android:scaleWidth="80%" >
    </scale> 
</item>

18
我尝试添加这个内容,但现在“ty_logo”甚至都不可见了。 - himanshu1496

0

不使用Bitmapwidth-heightmargin的简单技巧

适用于API +23

如果我们将可绘制对象的重力设置为中心以外的位置(API +23),它们会被拉伸。这是我的解决方案,即层列表中的层列表

<layer-list>
<!-- Your original vector using layer-list in layer-list -->
<item
    android:gravity="top">
    <layer-list>
        <item android:gravity="center"
              android:drawable="@drawable/ic_check_white_48dp"/>
    </layer-list>
</item>
</layer-list>

这在API +23中有效,因为center-gravity没有拉伸效果,并保持了可绘制对象的纵横比。但是,在API 21和22中,center-gravity不起作用,所以这种方法行不通。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接