相关文章推荐
有腹肌的生菜  ·  WPFMVVM ...·  2 月前    · 
玩篮球的火龙果  ·  Environments and ...·  1 年前    · 

如何在一个用XML定义的ObjectAnimator上设置pivotX或pivotY?

5 人关注

我在res/animator/grow.xml中对一个动画有如下定义。

<set xmlns:android="http://schemas.android.com/apk/res/android"
     android:ordering="sequentially">
       <objectAnimator
           android:propertyName="scaleX"
           android:duration="150"
           android:valueFrom="1.0"
           android:valueTo="1.5"
           android:valueType="floatType" />
       <objectAnimator
           android:propertyName="scaleY"
           android:duration="150"
           android:valueFrom="1.0"
           android:valueTo="1.5"
           android:valueType="floatType" />

我想要的是让pivotX和pivotY位于对象的中心,而不是左上角。我知道我可以通过代码来实现这一点,但我不想这样做。相反,我想在XML文件中指定它。我想过这样做。

<objectAnimator
  android:propertyName="pivotX"
  android:valueTo="50%" />
<objectAnimator
  android:propertyName="pivotY"
  android:valueTo="50%" />

但是,这似乎是要把这个属性也做成动画,这不是我想要的。相反,我想让它设置支点,然后执行动画。我可以在XML中这样做吗,如果可以,怎么做?

1 个评论
嗯......也许,鉴于这个问题已经徘徊了这么久,这是不可能的?
android
xml
animation
jwir3
jwir3
发布于 2013-12-21
4 个回答
prom85
prom85
发布于 2015-01-28
已采纳
0 人赞同

这是一个没有答案的老问题,我在其他地方没有找到答案,所以我在这里发表我的解决方案。

Logic:

  • in the start animation use a animation to set the pivot(s) to your desired values with a duration=0
  • add durations to all other animations
  • in the end animation reset the pivot(s) by using startOffset and duration=0
  • 最好不要使用持续时间,也不要重设支点......。在这种情况下,枢轴将保持原样,这在大多数情况下是不相关的。

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:state_pressed="true">
                <objectAnimator
                    android:duration="0"
                    android:propertyName="pivotX"
                    android:valueTo="0" />
                <objectAnimator
                    android:duration="@android:integer/config_shortAnimTime"
                    android:propertyName="scaleX"
                    android:valueTo="0.85" />
                <objectAnimator
                    android:duration="@android:integer/config_shortAnimTime"
                    android:propertyName="scaleY"
                    android:valueTo="0.85" />
        </item>
        <item android:state_pressed="false">
                <objectAnimator
                    android:duration="@android:integer/config_shortAnimTime"
                    android:propertyName="scaleX"
                    android:valueTo="1.0" />
                <objectAnimator
                    android:duration="@android:integer/config_shortAnimTime"
                    android:propertyName="scaleY"
                    android:valueTo="1.0" />
                <objectAnimator
                    android:duration="0"
                    android:propertyName="pivotX"
                    android:startOffset="@android:integer/config_shortAnimTime"
                    android:valueTo="0" />
        </item>
    </selector>
        
    Mathias Seguy Android2ee
    Mathias Seguy Android2ee
    发布于 2015-01-28
    0 人赞同

    你必须在你的视图上定义它(android:transformPivotX和android:transformPivotY)(它现在是视图的属性,不是ObjectAnimator的属性)。
    两者都不是%,而是sp、dp或px...

    如果你使用VectorDrawable,它是一个取决于viewPort坐标的组的属性。

    <?xml version="1.0" encoding="utf-8"?>
    <vector xmlns:android="http://schemas.android.com/apk/res/android"
            android:width="24dp"
            android:height="24dp"
            android:viewportHeight="24.0"
            android:viewportWidth="24.0"
        <group
            android:name="core"
            android:pivotX="12.0"
            android:pivotY="12.0">
                android:name="corepath"
                android:fillColor="#FF000000"
                android:pathData="@string/init_path_coreic_check_box_outline_blank_black_24dp"
        </group>
    </vector>
    

    或者你可以继续使用TweenAnimation

    Jan Rabe
    Jan Rabe
    发布于 2015-01-28
    0 人赞同

    基本上你改变了一个视图属性,因此使用transformPivotX和transformPivotY来代替。

    this should do the trick:

    <objectAnimator
        android:propertyName="transformPivotX"
        android:valueTo="0.5"
        android:valueType="floatType" />
    <objectAnimator
        android:propertyName="transformPivotY"
        android:valueTo="0.5"
        android:valueType="floatType" />
        
    jjung
    jjung
    发布于 2015-01-28
    0 人赞同

    我对一个片段交易也有类似的问题。 在布局文件的 android:transformPivotX 中设置的恼人之处在于,它需要像素,而我想要的是百分比。

    虽然不漂亮,但你可以在ObjectAnimator中添加值,例如。

    <?xml version="1.0" encoding="utf-8"?>
        <set xmlns:android="http://schemas.android.com/apk/res/android">
        <objectAnimator
            android:duration="500"
            android:propertyName="scaleY"
            android:valueFrom="0.0"
            android:valueTo="1.0"
            android:valueType="floatType"/>
        <objectAnimator
            android:duration="500"
            android:propertyName="pivotY"
            android:valueFrom="1.0"