从特定步骤运行动画

时间:2017-12-17 17:10:37

标签: android android-layout animation

根据documentation setStartTime应该有助于从特定步骤开始动画。我的意思是,如果我有动画android:duration = "2000"我想让它从特定时间开始,例如从1500或其他任何时候开始。再一次,它不像setStartOffset那样延迟动画启动,而是从动画的特定步骤开始。

经过多挖掘后,我发现startAnimation不受startTime的影响,始终从第1帧开始。另一方面setAnimation应该用于setStartTime,但遗憾的是我无法将long值传递给currentAnimationTimeMillis,并且无法将其传递给in MainActivity ... Animation introani; TextView intro; in onCreate.. intro= (TextView) findViewById(R.id.intro); introani = AnimationUtils.loadAnimation(this, R.anim.introalpha); ViewTreeObserver vto = intro.getViewTreeObserver(); //@diegoveloper vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { introani.setStartTime(1500); intro.setAnimation(introani); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { intro.getViewTreeObserver().removeOnGlobalLayoutListener(this); } else { intro.getViewTreeObserver().removeGlobalOnLayoutListener(this); } } });

更新代码

    SELECT  DATE_FORMAT(temp1.d, '%y-%m'), COALESCE(d1count,0) AS date_1_count, COALESCE(d2count,0)AS date_2_count
    FROM (
        select date_1 as d  from dates  group by date_1 
        union all 
        select date_2 as d from dates group by date_2
        ) as temp1

    LEFT JOIN (
         select date_1, count(*) as d1count 
         from dates 
         group by DATE_FORMAT(date_1, '%y-%m')) as temp2 
    on DATE_FORMAT(temp2.date_1, '%y-%m') = DATE_FORMAT(temp1.d, '%y-%m')

    LEFT JOIN (
         select date_2, count(*) as d2count 
         from dates 
         group by DATE_FORMAT(date_2, '%y-%m')) as temp3
    on DATE_FORMAT(temp3.date_2, '%y-%m') = DATE_FORMAT(temp1.d, '%y-%m')

    GROUP BY  DATE_FORMAT(temp1.d, '%y-%m')

它的持续时间仍为2000,但在这种情况下,动画永远不会开始。

如何从特定步骤运行动画?

2 个答案:

答案 0 :(得分:0)

在视图完成渲染后调用setAnimation

     intro= (TextView) findViewById(R.id.intro);
introani = AnimationUtils.loadAnimation(this, R.anim.introalpha);
introani.setStartTime(1500);
ViewTreeObserver vto = intro.getViewTreeObserver(); //@diegoveloper
vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        intro.setAnimation(introani);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
            intro.getViewTreeObserver().removeOnGlobalLayoutListener(this);
        } else {
            intro.getViewTreeObserver().removeGlobalOnLayoutListener(this);
        }
    }
});

尝试使用setStartOffset代替setStartTime

setStartOffset

答案 1 :(得分:0)

使用valueAnimatorobjectAnimator documentation lnk代替animation。另外要提到的是在API级别 26 !!! 中添加(同时valueAnimator中的相同字符串要求v11 documentation,因此可以完成而且是程序性的。)

这是示例

private static ObjectAnimator showScaleXObj(View view, long duration, long curPlayTime, float start, float stop) {
    ObjectAnimator showScaleXObj = ObjectAnimator.ofFloat(view, View.SCALE_X, start, stop);
    showScaleXObj.setDuration(duration);
    showScaleXObj.setCurrentPlayTime(curPlayTime);
    showScaleXObj.start();
    return showScaleXObj;
}

即使添加多个动画看起来很大,但它仍然是一个很好的解决方案。

关于animation

OLD ANSWER

显然没有简单的方法来实现这一点。非常感谢@diegoveleper的帮助,这可能是不可能的。

首先是 动画 。 以下是setAnimationsetStartTime

的实施说明
    introani = AnimationUtils.loadAnimation(this, R.anim.introalpha);

    final long currAnimTime = AnimationUtils.currentAnimationTimeMillis();
    long startOffSet = 1500;
    introani.setStartTime(currAnimTime + startOffSet);
    intro.setAnimation(introani);

必须获取 .currentAnimationTimeMillis ,然后在setStartTime中使用您想要的long值。在这种情况下setAnimation工作(!)并从第1帧开始动画,但有一些延迟。

总结setAnimation部分。 setStartTime实际上是动画开始时的时间

    final long currAnimTime = AnimationUtils.currentAnimationTimeMillis();
    long startOffSet = 1500;
    introani.setStartTime(currAnimTime + startOffSet);
    intro.setAnimation(introani);

并且它与setStartOffset的作用相同,因为最后一个只是在开始之前的延迟。

    long startOffSet = 1500;
    introani.setStartOffset(startOffSet);
    intro.setAnimation(introani);

更多信息。通过AnimationDrawable solution和暂停/播放(just to read),可以从特定步骤开始。不幸的是,仅需要的 帧动画 可绘制文件因此它是̶̶̶p̶̶̶o̶̶̶s̶̶̶s̶̶̶b̶̶̶i̶̶̶b̶̶̶l̶̶̶e̶̶̶玩GIF我想,但不可能发挥̶a̶n̶i̶m̶a̶t̶i̶o̶n̶.̶x̶m̶l̶。