Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/197.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何在图层列表中居中绘制矢量而无需缩放_Android_Android Drawable_Layer List_Android Vectordrawable - Fatal编程技术网

Android 如何在图层列表中居中绘制矢量而无需缩放

Android 如何在图层列表中居中绘制矢量而无需缩放,android,android-drawable,layer-list,android-vectordrawable,Android,Android Drawable,Layer List,Android Vectordrawable,我试图在层列表中使用矢量可绘制,而不缩放矢量。例如: <layer-list> <item android:drawable="@color/grid_item_activated"/> <item android:gravity="center" android:drawable="@drawable/ic_check_white_48dp"/> </layer-list> 理想的效果是将复选图标置于可绘制层的中心,而不进行缩放

我试图在
层列表中使用
矢量可绘制
,而不缩放矢量。例如:

<layer-list>
    <item android:drawable="@color/grid_item_activated"/>
    <item android:gravity="center" android:drawable="@drawable/ic_check_white_48dp"/>
</layer-list>
理想的效果是将复选图标置于可绘制层的中心,而不进行缩放。问题是,上面的图层列表会使复选图标缩放以适应图层大小

如果我为每个密度用PNG替换矢量可绘制并修改图层列表,我可以产生所需的效果:

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


是否有任何方法可以使用
VectorDrawable
实现此目的?

我在尝试将VectorDrawable集中在分层列表上时遇到了相同的问题

我有一个解决方法,虽然不完全相同,但它可以工作,您需要为整个可绘制项目设置一个大小,并向向量项添加填充:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape>
            <size android:height="120dp" android:width="120dp"/>
            <solid android:color="@color/grid_item_activated"/>
        </shape>
    </item>
    <item android:top="24dp"
          android:bottom="24dp"
          android:left="24dp"
          android:right="24dp"
          android:drawable="@drawable/ic_check_white_48dp"/>
</layer-list>

上面形状的大小设置整个可绘制图像的大小,在本例中为120dp,在本例中,第二项上的填充为24dp,使矢量图像居中


这与在API 21和22中使用向量的工作方式不同,但与使用重力=“center”
的工作方式不同。

一直在努力解决相同的问题。我找到的唯一解决方法是设置可拉伸尺寸,并使用重力将其对齐,以解决此问题并避免可拉伸的比例增大:

<layer-list>
    <item android:drawable="@color/grid_item_activated"/>
     <item
        android:gravity="center"
        android:width="48dp"
        android:height="48dp"
        android:drawable="@drawable/ic_check_white_48dp"/>
</layer-list>


希望有帮助

我目前正在开发一个启动屏幕,其中有一个水平和垂直居中的矢量绘图工具。以下是我在API级别25上得到的信息:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android" android:opacity="opaque">

<!-- background color, same as theme -->
<item android:drawable="@android:color/white"/>

<!-- app logo -->

<item
    android:drawable="@drawable/my_app_logo"
    android:gravity="center_horizontal|center_vertical"
    android:width="200dp"
    android:height="200dp"
    />
</layer-list>

如果要调整矢量可绘制图形的尺寸,请修改上面的
android:width
android:height
属性,而不必修改原始可绘制图形

此外,我的经验是不要将向量drawable放在位图标记中,这对我来说永远不起作用。位图用于.png、.jpg和.gif格式文件,不用于矢量可绘制

参考文献


经过编辑的解决方案,将使您的SplashScreen在所有API(包括API21到API23)上看起来都很棒

首先,阅读这篇文章并遵循制作初始屏幕的好方法

如果您的徽标扭曲或不合适,并且您的目标仅为APIs24+,您可以直接在其xml文件中缩小矢量绘图,如下所示:

<vector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:aapt="http://schemas.android.com/aapt"
android:viewportWidth="640"
android:viewportHeight="640"
android:width="240dp"
android:height="240dp">
<path
    android:pathData="M320.96 55.9L477.14 345L161.67 345L320.96 55.9Z"
    android:strokeColor="#292929"
    android:strokeWidth="24" />
</vector>

在上面的代码中,我正在将我在640x640画布上绘制的可绘制图形重新缩放为240x240。然后我把它放在我的闪屏上,像这样画出来,效果很好:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" android:opacity="opaque"
android:paddingBottom="20dp" android:paddingRight="20dp" android:paddingLeft="20dp" android:paddingTop="20dp">

<!-- The background color, preferably the same as your normal theme -->
<item>
    <shape>
        <size android:height="120dp" android:width="120dp"/>
        <solid android:color="@android:color/white"/>
    </shape>
</item>

<!-- Your product logo - 144dp color version of your app icon -->
<item
    android:drawable="@drawable/logo_vect"
    android:gravity="center">

</item>
</layer-list>

我的代码实际上只是在底部的图片中画了一个三角形,但是在这里你可以看到你可以用这个来实现什么。与我使用位图时得到的像素化边缘相比,分辨率最终非常好。因此,请使用一个可以通过各种方式绘制的矢量(有一个名为vectr的站点,我以前创建它的时候不需要下载专门的软件)

编辑以使其在API21-22-23上也能工作

虽然上述解决方案适用于运行API24+的设备,但在安装了运行API22的应用程序a设备后,我感到非常失望。我注意到splashscreen再次试图填满整个视图,看起来像狗屎。在撕了半天的眉毛后,我终于凭借纯粹的意志力强行提出了一个解决方案

您需要创建另一个名为splashscreen xml(比如splash_screen.xml)的文件,并将其放入名为drawable-v22和drawable-v21的两个文件夹中,您将在res/文件夹中创建这两个文件夹(为了查看它们,您必须将项目视图从Android更改为project)。当相关设备运行对应于drawable文件夹中-vXX后缀的API时,这会告诉您的手机重定向到这些文件夹中的文件。将以下代码放在您在这些文件夹中创建的splash_screen.xml文件的图层列表中:

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

<!-- The background color, preferably the same as your normal theme -->
<item
    android:gravity="center">
    <shape android:shape="rectangle">
        <solid android:color="@android:color/white"/>

    </shape>
</item>

<!-- Your product logo - 144dp color version of your app icon -->
<item
    android:gravity="center">
    <bitmap
        android:gravity="center"
        android:src="@drawable/logo_vect"/>

</item>
</layer-list>

出于某些原因,对于这些API,您必须在位图中包装您的drawable,以使其正常工作,并使最终结果看起来相同。问题是,您必须将aproach与传统的可绘制文件夹一起使用,因为splash_screen.xml文件的第二个版本将导致在运行API高于23的设备上根本不显示您的初始屏幕。您可能还需要将第一个版本的splash_screen.xml放入drawable-v24,因为android默认为它可以找到的最接近drawable vXX的资源文件夹


这似乎只是API 21/22中的一个缺陷。我刚刚在API23设备上进行了测试,vector drawable正确居中。您应该回答自己的问题并接受它。通过这种方式,它变得更加明显,而且问题不会显示为未回答。我还没有回答我的问题,因为我还不知道在API 21/22上该做什么。我的临时解决办法是使用PNG而不是矢量。希望仍然能找到一种方法使向量工作。我在这里打开了一个问题:这在API 23中已经修复,所以我猜您的错误报告将被标记为已修复。这听起来好像需要您知道可绘制的确切大小(以便设置形状大小),与其让它填充设置的整个空间,而将复选框置于其中心。可以不知道大小,但不能使用此方法更改填充,您可以在ImageView中将可绘制内容层叠在一起。如上所述,对于API 21和22中的
gravity=“center”
,没有完美的解决方案。与
windowBackground
一起使用时,它不起作用。在这种情况下,显式大小不起任何作用。如果我把图层列表放在另一个图层列表中,它也不起作用。这对API 21-22没有帮助,因为
width
属性在这些API级别上不可用。在API 23上,这些是不需要的,因为bug已经修复,并且
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:opacity="opaque">

<!-- The background color, preferably the same as your normal theme -->
<item
    android:gravity="center">
    <shape android:shape="rectangle">
        <solid android:color="@android:color/white"/>

    </shape>
</item>

<!-- Your product logo - 144dp color version of your app icon -->
<item
    android:gravity="center">
    <bitmap
        android:gravity="center"
        android:src="@drawable/logo_vect"/>

</item>
</layer-list>