根据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,但在这种情况下,动画永远不会开始。
如何从特定步骤运行动画?
答案 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
:
答案 1 :(得分:0)
使用valueAnimator
或objectAnimator
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
的显然没有简单的方法来实现这一点。非常感谢@diegoveleper的帮助,这可能是不可能的。
首先是 动画 。
以下是setAnimation
和setStartTime
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̶。