AnimatedVectorDrawable 圆到线
AnimatedVectorDrawable circle to line
我想在Android中实现一个圆变成线的动画。
我看到 AnimatedVectorDrawable 可以做到这一点,我应该使用像这样的对象动画器来进行路径转换:
<objectAnimator
android:duration="3000"
android:propertyName="pathData"
android:valueFrom="M300,70 l 0,-70 70,70 0,0 -70,70z"
android:valueTo="M300,70 l 0,-70 70,0 0,140 -70,0 z"
android:valueType="pathType"/>
如果要将一条路径变形为另一条路径,根据文档,路径必须与变形兼容。更详细地说,路径应具有完全相同的命令长度,并且每个命令的参数长度应完全相同。
我开始读这个:SVG elliptical arc commands,我认为诀窍是用一些 arc/circle 命令实现一行。
有没有办法做到这一点,使直线路径数据可以与圆具有相同的长度和相同的命令?
我从未尝试过,但我想一个可能有效的简单 "hack" 方法是将圆变成半径非常大、中心很远的圆。在剪辑区域可见的大圆圈的一小部分看起来是一条直线。
即。您可以将圆从中心 (300,70) 以半径 70 转换为中心 (300,10070) 以半径 10000.
如果失败,您可以尝试从样条曲线构建一个圆,然后将样条曲线更改为直线。 This 网站显示由样条曲线构成的四分之一圆。
另一个可行的选项 - 将形状的 scaleY 设置为从 1 到 0 的动画,这会将形状展平成一条水平线。它不像矢量动画那样流畅,但实现起来非常简单。动画完成后,您可以用水平线替换形状。
Iftah 的回答让我走上了正轨,这就是我的做法,它基本上是用两条三次贝塞尔曲线(一个用于上半圆,另一个用于下半圆)来近似一个圆。可以找到一个小的解释 here.
代码端,如下所示:
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="500dp"
android:height="500dp"
android:viewportWidth="500"
android:viewportHeight="500">
<group>
<path
android:name="circle_line"
android:fillColor="@android:color/black"
android:strokeColor="@android:color/black"
android:strokeWidth="5"
android:pathData="@string/circle_data"/>
</group>
路径数据:
<!-- paths -->
<string name="circle_data">M 125 250 C 137.5 83.34 362.5 83.34 375 250 M 125 250 C 137.5 416.66 362.5 416.66 375 250</string>
<string name="line_data">M 50 250 C 125 250 125 250 250 250 M 250 250 C 375 250 375 250 450 250</string>
动画效果很好,我只需要细化一些点以自定义动画外观。
我想在Android中实现一个圆变成线的动画。
我看到 AnimatedVectorDrawable 可以做到这一点,我应该使用像这样的对象动画器来进行路径转换:
<objectAnimator
android:duration="3000"
android:propertyName="pathData"
android:valueFrom="M300,70 l 0,-70 70,70 0,0 -70,70z"
android:valueTo="M300,70 l 0,-70 70,0 0,140 -70,0 z"
android:valueType="pathType"/>
如果要将一条路径变形为另一条路径,根据文档,路径必须与变形兼容。更详细地说,路径应具有完全相同的命令长度,并且每个命令的参数长度应完全相同。
我开始读这个:SVG elliptical arc commands,我认为诀窍是用一些 arc/circle 命令实现一行。
有没有办法做到这一点,使直线路径数据可以与圆具有相同的长度和相同的命令?
我从未尝试过,但我想一个可能有效的简单 "hack" 方法是将圆变成半径非常大、中心很远的圆。在剪辑区域可见的大圆圈的一小部分看起来是一条直线。
即。您可以将圆从中心 (300,70) 以半径 70 转换为中心 (300,10070) 以半径 10000.
如果失败,您可以尝试从样条曲线构建一个圆,然后将样条曲线更改为直线。 This 网站显示由样条曲线构成的四分之一圆。
另一个可行的选项 - 将形状的 scaleY 设置为从 1 到 0 的动画,这会将形状展平成一条水平线。它不像矢量动画那样流畅,但实现起来非常简单。动画完成后,您可以用水平线替换形状。
Iftah 的回答让我走上了正轨,这就是我的做法,它基本上是用两条三次贝塞尔曲线(一个用于上半圆,另一个用于下半圆)来近似一个圆。可以找到一个小的解释 here.
代码端,如下所示:
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="500dp"
android:height="500dp"
android:viewportWidth="500"
android:viewportHeight="500">
<group>
<path
android:name="circle_line"
android:fillColor="@android:color/black"
android:strokeColor="@android:color/black"
android:strokeWidth="5"
android:pathData="@string/circle_data"/>
</group>
路径数据:
<!-- paths -->
<string name="circle_data">M 125 250 C 137.5 83.34 362.5 83.34 375 250 M 125 250 C 137.5 416.66 362.5 416.66 375 250</string>
<string name="line_data">M 50 250 C 125 250 125 250 250 250 M 250 250 C 375 250 375 250 450 250</string>
动画效果很好,我只需要细化一些点以自定义动画外观。