Android RotateDrawable:不适用于 Vector Drawable
Android RotateDrawable: Doesn't correctly work for Vector Drawables
在 RotateDrawble
中使用 Vector Drawable 时观察到一个奇妙的问题,每个 完整周期两次(0° 到 360° /level: 0 → 10000
)!首先是 90° (level: 2500
),另一个是 270° (level: 7500
)。看下面的测试:
我的RotateDrawable
(文件名:rotatable_info.xml
):
<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromDegrees="0"
android:pivotX="50%"
android:pivotY="50%"
android:toDegrees="360"
android:drawable="@drawable/ic_info_black_24dp" >
</rotate>
我的版面设计:
<LinearLayout android:orientation="vertical"
android:layout_height="wrap_content"
android:layout_width="match_parent">
<ImageView style="@style/style" android:id="@+id/ImageView00" />
<ImageView style="@style/style" android:id="@+id/ImageView01" />
<ImageView style="@style/style" android:id="@+id/ImageView02" />
...
<ImageView style="@style/style" android:id="@+id/ImageView19" />
</LinearLayout>
引用样式:
<style name="style">
<item name="android:layout_width">32dp</item>
<item name="android:layout_height">32dp</item>
<item name="android:src">@drawable/rotatable_info</item>
</style>
我的代码:
int n = -550;
((RotateDrawable) this.<ImageView>findViewById(R.id.ImageView00).getDrawable()).mutate().setLevel(n+=550);
((RotateDrawable) this.<ImageView>findViewById(R.id.ImageView01).getDrawable()).mutate().setLevel(n+=550);
...
((RotateDrawable) this.<ImageView>findViewById(R.id.ImageView18).getDrawable()).mutate().setLevel(n+=550);
((RotateDrawable) this.<ImageView>findViewById(R.id.ImageView19).getDrawable()).mutate().setLevel(n+=550);
(.mutate()
需要为每个 ImageView
独立执行旋转。它对主要问题没有影响。)
我的结果 (!?!?):
ic_info_black_24dp.xml
:(由Vector Asset Studio在Android Studio中生成...我还测试了一些其他SVG。光栅可绘制对象没有问题.)
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FF000000"
android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM13,17h-2v-6h2v6zM13,9h-2L11,7h2v2z"/>
</vector>
似乎是一个错误。 vectorDrawables.useSupportLibrary = true
解决了问题。
有关详细信息,请参阅下面页面的 "Vector drawables backward compatibility solution" 部分 :
https://developer.android.com/guide/topics/graphics/vector-drawable-resources
在 RotateDrawble
中使用 Vector Drawable 时观察到一个奇妙的问题,每个 完整周期两次(0° 到 360° /level: 0 → 10000
)!首先是 90° (level: 2500
),另一个是 270° (level: 7500
)。看下面的测试:
我的RotateDrawable
(文件名:rotatable_info.xml
):
<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromDegrees="0"
android:pivotX="50%"
android:pivotY="50%"
android:toDegrees="360"
android:drawable="@drawable/ic_info_black_24dp" >
</rotate>
我的版面设计:
<LinearLayout android:orientation="vertical"
android:layout_height="wrap_content"
android:layout_width="match_parent">
<ImageView style="@style/style" android:id="@+id/ImageView00" />
<ImageView style="@style/style" android:id="@+id/ImageView01" />
<ImageView style="@style/style" android:id="@+id/ImageView02" />
...
<ImageView style="@style/style" android:id="@+id/ImageView19" />
</LinearLayout>
引用样式:
<style name="style">
<item name="android:layout_width">32dp</item>
<item name="android:layout_height">32dp</item>
<item name="android:src">@drawable/rotatable_info</item>
</style>
我的代码:
int n = -550;
((RotateDrawable) this.<ImageView>findViewById(R.id.ImageView00).getDrawable()).mutate().setLevel(n+=550);
((RotateDrawable) this.<ImageView>findViewById(R.id.ImageView01).getDrawable()).mutate().setLevel(n+=550);
...
((RotateDrawable) this.<ImageView>findViewById(R.id.ImageView18).getDrawable()).mutate().setLevel(n+=550);
((RotateDrawable) this.<ImageView>findViewById(R.id.ImageView19).getDrawable()).mutate().setLevel(n+=550);
(.mutate()
需要为每个 ImageView
独立执行旋转。它对主要问题没有影响。)
我的结果 (!?!?):
ic_info_black_24dp.xml
:(由Vector Asset Studio在Android Studio中生成...我还测试了一些其他SVG。光栅可绘制对象没有问题.)
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FF000000"
android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM13,17h-2v-6h2v6zM13,9h-2L11,7h2v2z"/>
</vector>
似乎是一个错误。 vectorDrawables.useSupportLibrary = true
解决了问题。
有关详细信息,请参阅下面页面的 "Vector drawables backward compatibility solution" 部分 :
https://developer.android.com/guide/topics/graphics/vector-drawable-resources