在低于19的api级别上使用setUpdateListener。

5
为了制作动画,我需要监听每个步骤的ViewPropertyAnimator。我使用AnimatorUpdateListener与setUpdateListener结合使用。
来源:http://developer.android.com/reference/android/view/ViewPropertyAnimator.html
image.animate().translationY(transY).setDuration(duration).setUpdateListener(new AnimatorUpdateListener() {

       @Override
       public void onAnimationUpdate(ValueAnimator animation) {
           // do my things
       }
});

现在我正在将一个物体从A移动到B,并且在移动过程中需要检测一些事情。使用setUpdateListener非常有帮助,而且这段代码可以正常工作。但是它要求API级别为19。我真的想在这个项目中使用API级别14。有没有替代setUpdateListener的方法?

ViewPropertyAnimator.setUpdateListener

Call requires api level 19 (current min is 14)

1
你能使用ValueAnimator吗?它似乎只需要api 11的addUpdateListener。 - Whitney
3个回答

7
以下是Zsolt的回答改进版本,将监听器代码放在一个位置,并对API版本进行代码级别的检查:
ValueAnimator.AnimatorUpdateListener updateListener = new ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator animation) {
        // do my things
    }     
};

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    image.animate()
          .translationY(transY)
          .setDuration(duration)
          .setUpdateListener(updateListener);
} else {

    ObjectAnimator oa = ObjectAnimator.ofFloat(image, View.TRANSLATION_Y, transY)
                                  .setDuration(duration);
    oa.addUpdateListener(updateListener);
    oa.start();
}

6

在API级别19或更高版本中,您可以使用以下语法:

image.animate()
     .translationY(transY)
     .setDuration(duration)
     .setUpdateListener(new AnimatorUpdateListener() {

         @Override
         public void onAnimationUpdate(ValueAnimator animation) {
             // do my things
         }

     });

如果您的API级别在11或以上,您可以采用以下方法:

ObjectAnimator oa = ObjectAnimator.ofFloat(image, View.TRANSLATION_Y, transY)
                                  .setDuration(duration);
oa.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator animation) {
        // do my things
    }
});
oa.start();

注意:虽然 ViewPropertyAnimator 在操作动画视图时会在幕后调用 View.setHasTransientState() 方法,但 ObjectAnimator 不会这样做。这可能导致使用自定义(即不是与 ItemAnimator 一起使用的)RecyclerView 条目动画时出现不同的行为。


0

1
问题在于API 19包含一个方法(setUpdateListener),而低于19的API没有这个方法。因此,在API级别19上缺少弃用/旧方法并不是问题,而是相反。我在库中搜索,但找不到setUpdateListener的替代方法。 - Dion Segijn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接