11

我使用 ObjectAnimator 来缩小 RelativeLayout :

            ObjectAnimator scaleDownX = ObjectAnimator.ofFloat(view, "scaleX", 0.5f);
            ObjectAnimator scaleDownY = ObjectAnimator.ofFloat(view, "scaleY", 0.5f);
            scaleDownY.setDuration(1000);
            AnimatorSet scaleDown = new AnimatorSet();
            scaleDown.play(scaleDownX).with(scaleDownY);
            scaleDown.start();

它按预期很好地缩小了,但问题是现在较小的视图周围的区域在另一个用户操作之前是黑色的,这是不希望的。我希望它与缩放视图父级的背景相匹配。知道如何使红色方块周围的区域立即具有正确的颜色吗?

在此处输入图像描述

我的 xml:

   <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:gui="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/bg"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity$DummySectionFragment">
      <RelativeLayout
        android:id="@+id/res1"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:tag="res1"
        android:background="@android:color/holo_red_dark"
        android:layout_alignTop="@+id/res2"
        android:layout_alignRight="@+id/include3"
        android:layout_marginRight="11dp">
            <TextView
                android:layout_marginLeft="15dp"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="res1"
                android:id="@+id/res1T"
                android:layout_centerVertical="true"
                android:layout_centerHorizontal="true"/>
        </RelativeLayout>
    </RelativeLayout>
4

3 回答 3

41

上一个答案需要使父级无效的原因是因为您的 AnimatorSet scaleDown 没有 Target。您应该将 ObjectAnimator 的 Target 设置为 null 并在 AnimatorSet 上设置 Target。或者更好的方法是使用下面的代码:

ObjectAnimator scaleDown = ObjectAnimator.ofPropertyValuesHolder(view, 
    PropertyValuesHolder.ofFloat("scaleX", 0.5f),
    PropertyValuesHolder.ofFloat("scaleY", 0.5f));
scaleDown.setDuration(1000);
scaleDown.start();
于 2014-08-09T05:54:12.740 回答
29

它可能不是最干净的解决方案,但添加动画更新侦听器并使父级无效可能会完成这项工作。

ObjectAnimator scaleDownX = ObjectAnimator.ofFloat(view, "scaleX", 0.5f);
ObjectAnimator scaleDownY = ObjectAnimator.ofFloat(view, "scaleY", 0.5f);
scaleDownX.setDuration(1000);
scaleDownY.setDuration(1000);

AnimatorSet scaleDown = new AnimatorSet();
scaleDown.play(scaleDownX).with(scaleDownY);

scaleDownX.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
     @Override
     public void onAnimationUpdate(ValueAnimator valueAnimator) {
         View p= (View) v.getParent();
         p.invalidate();
     });
scaleDown.start();
于 2013-07-29T14:11:33.090 回答
1

如评论中所述,创建ObjectAnimator的方法是使用 View 的静态Property对象而不是传递字符串,因为使用字符串值涉及对 setter 和可选的 getter 的反射,以便派生属性的起始值. 这可从API 14获得

ObjectAnimator scaleDownX = ObjectAnimator.ofFloat(view, View.SCALE_X, 0.5f);
ObjectAnimator scaleDownY = ObjectAnimator.ofFloat(view, View.SCALE_Y, 0.5f);

完整的解释可以在Google 工程师 Chet Haase 的DevBytes:Property Animations视频中找到

于 2017-11-21T14:07:19.263 回答