想象一个数字 10 ,然后在用户点击按钮后,它会变为 100 。但是如何进行有效的过渡
10 - > 100,
将显示
之类的值12,15,18,...,97,100超过1秒。
我在“Cookie clicker”中看到类似的内容,但在源代码中找不到任何有关此类转换的内容。
我知道一个循环(对于number1< number2,do number1 ++),它适用于小数字,但如果10变为10亿,那么循环可能会冻结整个应用程序。
第二个想法是获得附加值( 100-10 = 90 )并除以30或60帧,并在每帧中添加此值。但是如果丢帧会怎么样? - 可能不会增加价值。如果用户双击或系统自动添加值会怎样?
希望它能说明我需要什么样的数字转换。 也许我忽略了,有一个简单的方法?任何帮助表示赞赏。
答案 0 :(得分:2)
希望这个使用ValueAnimator
的小演示能激发您找到合适的解决方案
您可以指定动画的持续时间(请参阅代码),甚至可以通过说mAnimator.setFrameDelay(frameDelay);
来调整帧速率
使用animator.isRunning()
或animator.isStarted()
可以防止在当前动画运行时出现双击故障或其他不需要的行为。
主要活动:
/** ValueAnimator demo */
public class MainActivity extends Activity {
ValueAnimator mAnimator;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final TextView tv = (TextView) findViewById(R.id.textview);
mAnimator = ValueAnimator.ofInt(1, 100).setDuration(1000);
mAnimator.setInterpolator(new AccelerateDecelerateInterpolator());
mAnimator.addUpdateListener(new AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(final ValueAnimator animator) {
final Integer value = (Integer) animator.getAnimatedValue();
tv.setText(String.format("%04d", value));
}
});
mAnimator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animator) {
super.onAnimationEnd(animator);
final int endValue = Integer.parseInt((String) tv.getText());
mAnimator.setIntValues(endValue, endValue + 100);
}
});
}
/** Button callback */
public void onClick(final View view) {
if (!mAnimator.isStarted() && !mAnimator.isRunning()) {
mAnimator.start();
}
}
}
简单的演示布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="25sp"
android:typeface="monospace"
android:text="0001" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Gimme +100"
android:onClick="onClick">
</Button>
答案 1 :(得分:1)
这是另一个演示(希望这回答你的2.问题),它实现了依赖于单击或双击按钮的不同行为。只是试验它,你现在有了构建自己行为的基本构建块......
/** ValueAnimator demo */
public class MainActivity extends Activity {
ValueAnimator mAnimator;
TextView mTv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTv = (TextView) findViewById(R.id.textview);
mAnimator = ValueAnimator.ofInt(1, 100).setDuration(1000);
mAnimator.setInterpolator(new AccelerateDecelerateInterpolator());
mAnimator.addUpdateListener(new AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(final ValueAnimator animator) {
final Integer value = (Integer) animator.getAnimatedValue();
mTv.setText(String.format("%04d", value));
}
});
final Button button = (Button) findViewById(R.id.button);
final GestureDetector gestureDetector = new GestureDetector(this,
new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onDoubleTap(MotionEvent e) {
performAnimation(100);
return true;
}
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
performAnimation(0);
return true;
}
});
button.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return gestureDetector.onTouchEvent(event);
}
});
}
/** starts animation */
private void performAnimation(final int offset) {
if (!mAnimator.isStarted() && !mAnimator.isRunning()) {
final int endValue = Integer.parseInt((String) mTv.getText());
mAnimator.setIntValues(endValue + offset, endValue + 100 + offset);
mAnimator.start();
}
}
}
不要忘记更换布局文件,因为该按钮的click属性已被删除:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="25sp"
android:typeface="monospace"
android:text="0001" />
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Gimme +100" >
</Button>
</LinearLayout>
答案 2 :(得分:0)
我猜你可以通过使用不同的线程来做到这一点。只有主线程与UI一起工作,因此您可以将间隔分成小间隔,并在不同的线程中进行转换。将它们发送到主线程并打印。希望它会有所帮助。