Path上的ObjectAnimator无法在棉花糖上工作?

时间:2016-09-21 09:16:45

标签: android android-animation android-6.0-marshmallow android-graphics

ObjectAnimator.ofFloat(Object target, String xPropertyName, String yPropertyName, Path path)似乎适用于API 21但不适用于23? 简单再现:这里是活动和布局。尝试长按文本视图,两个级别都可以。但是,只需点击视图:21个有效但不是23个。

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final View hello = findViewById(R.id.hello);
        final Path p = new Path();
        p.addCircle(-200, 0, 100, Path.Direction.CW);
        hello.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ObjectAnimator a = ObjectAnimator.ofFloat(hello, "translationX", "translationY", p);
                a.setDuration(1000);
                a.start();
            }
        });
        hello.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                ObjectAnimator a = ObjectAnimator.ofFloat(hello, "scaleX", 2);
                a.setDuration(1000);
                a.start();
                return true;
            }
        });
    }
}

-

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="letstwinkle.com.pathtest.MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        android:layout_alignParentTop="true"
        android:layout_alignParentEnd="true"
        android:layout_marginEnd="63dp"
        android:layout_marginTop="210dp"
        android:id="@+id/hello"
        android:background="#880033"/>
</RelativeLayout>

这可能与6月份报告的这个错误相同。 https://code.google.com/p/android/issues/detail?id=212776

1 个答案:

答案 0 :(得分:2)

作为解决方法,您可以将ValueAnimator与自定义AnimatorUpdateListener一起使用。

首先,PathMeasure需要Path。这将使您能够访问路径长度和特定距离的路径上的坐标(0 <=距离&lt; =路径长度)。

Path p = new Path();
p.addCircle(-200, 0, 100, Path.Direction.CW);
PathMeasure pathMeasure = new PathMeasure(p, true);

然后将ValueAnimator设置为从0到路径长度的动画。

final ValueAnimator a = ValueAnimator.ofFloat(0,pathMeasure.getLength());
a.setDuration(1000);

接下来,添加AnimatorUpdateListener来实际操作View。我将首先展示如何添加它:

MyAnimatorUpdateListener myListener = new MyAnimatorUpdateListener(hello, pathMeasure);
a.addUpdateListener(myListener);

继续使用OnClickListener:

hello.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        a.start();
    }
});

请注意,我更改了代码并在ValueAnimator之外声明/初始化了OnClickListener以获得更好的性能:这样,每次单击{{时都不会重新创建它1}}所以垃圾收集器会不那么忙:)。

最后,TextView代码:

AnimatorUpdateListener