Android:将矢量图像旋转 90 度

Posted

技术标签:

【中文标题】Android:将矢量图像旋转 90 度【英文标题】:Android : Rotate Vector Image to 90 degree 【发布时间】:2019-07-29 00:29:01 【问题描述】:

我的向量有以下代码:

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:
    android:

    android:viewportWidth="314.015"
    android:viewportHeight="314.015">
    <path
        android:fillColor="#FCD83500"
        android:pathData="M157.007,0C70.291,0 0,70.289 0,157.007c0,86.712 70.29,157.007 157.007,157.007c86.709,0 157.007,-70.295 157.007,-157.007C314.014,70.289 243.716,0 157.007,0zM31.403,157.015c0,-69.373 56.228,-125.613 125.604,-125.613V282.62C87.631,282.62 31.403,226.38 31.403,157.015z" />
</vector>

输出是:

但我希望这个图像在各个方向如下:

我尝试过的:

&lt;rotate&gt; 之间添加了&lt;vector&gt; 标签,但它给了我类似Element vector is not allowed here

的警告
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromDegrees="90"
    android:pivotX="50%"
    android:pivotY="50%"
    android:toDegrees="90">

    <vector 
        android:
        android:

        android:viewportWidth="314.015"
        android:viewportHeight="314.015">
        <path
            android:fillColor="#FCD83500"
            android:pathData="M157.007,0C70.291,0 0,70.289 0,157.007c0,86.712 70.29,157.007 157.007,157.007c86.709,0 157.007,-70.295 157.007,-157.007C314.014,70.289 243.716,0 157.007,0zM31.403,157.015c0,-69.373 56.228,-125.613 125.604,-125.613V282.62C87.631,282.62 31.403,226.38 31.403,157.015z" />
    </vector>
</rotate>

我还尝试将&lt;bitmap&gt; 标签放在&lt;rotate&gt; 之间,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:fromDegrees="90"
    android:pivotX="50%"
    android:pivotY="50%"
    android:toDegrees="90">

    <bitmap app:srcCompat="@drawable/ic_round" />

</rotate>

但它给了我 'src' 属性应该被定义,我不能将src 与矢量图像一起使用。

有什么解决方案可以全方位使用这个(一张图片)吗?

注意:我想在&lt;TextView&gt;drawable 中使用这张图片。

【问题讨论】:

【参考方案1】:

试试这种方式,我在矢量可绘制文件中的图像路径数据之外使用了组标签。

第一种类型:

<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:
android:

android:viewportWidth="314.015"
android:viewportHeight="314.015">
<group
    android:translateX="314.015"
    android:rotation="90">
<path
    android:fillColor="#FCD83500"
    android:pathData="M157.007,0C70.291,0 0,70.289 0,157.007c0,86.712 70.29,157.007 157.007,157.007c86.709,0 157.007,-70.295 157.007,-157.007C314.014,70.289 243.716,0 157.007,0zM31.403,157.015c0,-69.373 56.228,-125.613 125.604,-125.613V282.62C87.631,282.62 31.403,226.38 31.403,157.015z" />

</group>
</vector>

第二种类型:

<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:
android:
android:viewportWidth="314.015"
android:viewportHeight="314.015">
<group
    android:translateX="314"
    android:scaleX="-1"
android:rotation="0">
<path
    android:fillColor="#FCD83500"
    android:pathData="M157.007,0C70.291,0 0,70.289 0,157.007c0,86.712 70.29,157.007 157.007,157.007c86.709,0 157.007,-70.295 157.007,-157.007C314.014,70.289 243.716,0 157.007,0zM31.403,157.015c0,-69.373 56.228,-125.613 125.604,-125.613V282.62C87.631,282.62 31.403,226.38 31.403,157.015z" />
</group>
</vector>

第三种:

<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:
android:
android:viewportWidth="314.015"
android:viewportHeight="314.015">
<group
    android:translateY="314.015"
    android:rotation="270">
<path
    android:fillColor="#FCD83500"
    android:pathData="M157.007,0C70.291,0 0,70.289 0,157.007c0,86.712 70.29,157.007 157.007,157.007c86.709,0 157.007,-70.295 157.007,-157.007C314.014,70.289 243.716,0 157.007,0zM31.403,157.015c0,-69.373 56.228,-125.613 125.604,-125.613V282.62C87.631,282.62 31.403,226.38 31.403,157.015z" />
</group>
</vector>

【讨论】:

@jeevashankar 这三个步骤都有效。但是你能告诉我这个的主要概念吗?因为我需要旋转很多边但不知道如何旋转。 @BhavenShah 它基于不同角度的旋转逻辑,如 [90,0,270,180] @jeevashankar 兄弟,我在哪里可以更详细地了解组和路径?【参考方案2】:

对我来说,使用视图中心的pivot 时效果最好。 请注意,我已将其用作 viewport 的中心部分 - 而不是宽度/高度

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:
    android:
    android:viewportWidth="24"
    android:viewportHeight="24"
    >

    <group
        android:rotation="45"
        android:pivotY="12"
        android:pivotX="12"
        >
        <path
            android:fillColor="@android:color/white"
            android:pathData="M19,13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"
            />
    </group>

</vector>

【讨论】:

这个答案对我有用,而不是被接受的答案。非常感谢人 非常感谢..它成功了! 比公认的答案更简洁。谢谢!【参考方案3】:

对于那些寻找第四个变体的人来说,把东西倒过来, 代码如下所示:

<vector xmlns:android="http://schemas.android.com/apk/res/android"
  android:
  android:
  android:viewportWidth="24.0"
  android:viewportHeight="24.0">
  <group
    android:translateY="24.0"
    android:scaleY="-1"
    android:rotation="0">
    <path
      android:fillColor="#FF000000"
      android:pathData="M1,21h4L5,9L1,9v12zM23,10c0,-1.1 -0.9,-2 -2,-2h-6.31l0.95,-4.57 0.03,-0.32c0,-0.41 -0.17,-0.79 -0.44,-1.06L14.17,1 7.59,7.59C7.22,7.95 7,8.45 7,9v10c0,1.1 0.9,2 2,2h9c0.83,0 1.54,-0.5 1.84,-1.22l3.02,-7.05c0.09,-0.23 0.14,-0.47 0.14,-0.73v-1.91l-0.01,-0.01L23,10z"/>
  </group>
</vector>

【讨论】:

【参考方案4】:

实际上你不能旋转vector.xml,因为它是由pathData绘制的, 除非你用另一种组合来做。

你可以分开 TextView 和 ImageView 并像这样使用它:

  <LinearLayout
        android:layout_
        android:layout_
        android:orientation="horizontal">

        <TextView
            android:layout_
            android:layout_
            android:layout_marginLeft="16dp"
            android:layout_marginRight="16dp"
            android:layout_weight="1"
            android:gravity="center_vertical"
            android:text="Set time"
            android:textAppearance="@style/Base.TextAppearance.AppCompat.Medium" />

        <ImageButton
            android:id="@+id/close_dialog"
            android:layout_
            android:layout_
            android:background="?attr/selectableItemBackgroundBorderless"
            android:rotation="45"
            android:src="@drawable/ic_close_black_24dp" />

    </LinearLayout>

【讨论】:

不幸的是,这不是一个解决方案。这是唯一的技巧,它会增加我的代码行数。【参考方案5】:

如果想像镜像一样旋转,添加android:scaleY="-1",android:translateY

<?xml version="1.0" encoding="utf-8"?>
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
 android:
 android:
 android:viewportWidth="24"
 android:viewportHeight="24">
  <group
    android:scaleY="-1"
    android:translateY="24.0">
    <path
        android:fillColor="@android:color/transparent"
        android:pathData="M12 2L2 12L12 22"
        android:strokeWidth="2.5"
        android:strokeColor="#ffffff"
        android:strokeLineCap="round" />
 </group>
</vector>

【讨论】:

以上是关于Android:将矢量图像旋转 90 度的主要内容,如果未能解决你的问题,请参考以下文章

Leecode-48:旋转图像(矩阵顺时针旋转90度)

将图像旋转 90 度 php

使用 GD 将图像旋转 90 度 [关闭]

如何将包含图像的画布旋转 90、180、270 度?

Leetcode——旋转图像(90度)

Java - 将缓冲图像保存到文件旋转 90 度时出现问题