Android中的缩放动画会降低图像质量

时间:2019-11-19 07:13:42

标签: android android-animation android-vectordrawable

  

在Android 5.0(API级别21)及更高版本中,您可以定义矢量   可绘制对象,可缩放而不会丢失定义。

我在Android Studio(API 28)中使用Vector Assets。示例:ic_mybutton.xml。 矢量可绘制对象以原始质量显示在视图上:imageimageimage

ImageButton button = new ImageButton(context);
button.setImageResource(R.drawable.ic_mybutton);

在Buttons和ImageButtons(或其他视图)上使用此动画:

Animation animation = new ScaleAnimation(
        1.0f, 0.9f,
        1.0f, 0.9f,
        Animation.RELATIVE_TO_SELF, 0f,
        Animation.RELATIVE_TO_SELF, 1f);
animation.setFillAfter(true);
animation.setDuration(1000);
button.startAnimation(animation);

产生可怕的图像失真:imageimageimage。 我在做什么错了?

1 个答案:

答案 0 :(得分:2)

可以使用动画师解决问题。

所有其他已知的库,例如BoomRxAnimation等,在缩放时会降低图像质量。

anim_scale.xml:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <objectAnimator
        android:duration="@android:integer/config_shortAnimTime"
        android:propertyName="scaleX"
        android:repeatCount="1"
        android:valueFrom="1.0"
        android:valueTo="0.9"
        android:valueType="floatType" />
    <objectAnimator
        android:duration="@android:integer/config_shortAnimTime"
        android:propertyName="scaleY"
        android:repeatCount="1"
        android:valueFrom="1.0"
        android:valueTo="0.9"
        android:valueType="floatType" />
</set>

animated_vector.xml:

<?xml version="1.0" encoding="utf-8"?>
<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/ic_mybutton">
    <target
        android:animation="@animator/anim_scale"
        android:name="anim_scale" />
</animated-vector>

将您的路径放入<group>标签中并设置枢轴。

ic_mybutton.xml:

<group
  android:name="anim_scale"
  android:pivotX="177.5"
  android:pivotY="37.5">
  ...
</group>

因此(稍有变化),您可以使单击按钮的动画不丢失矢量图像的质量:

ImageButton button = findViewById(R.id.button_apply);
button.setImageResource(R.drawable.animated_vector);
button.setOnClickListener(v -> ((Animatable) button.getDrawable()).start());

P.S。 以下方法无效(质量下降):

ObjectAnimator animator = ObjectAnimator.ofFloat(button, "scale", 0.9f);
animator.setDuration(200);
animator.start();

StateListAnimator类也会降低图像质量。