十进制或双数之间的转换

时间:2015-06-06 17:03:44

标签: java android numbers transition

想象一个数字 10 ,然后在用户点击按钮后,它会变为 100 。但是如何进行有效的过渡

  

10 - > 100,

将显示

之类的值
  

12,15,18,...,97,100超过1秒。

我在“Cookie clicker”中看到类似的内容,但在源代码中找不到任何有关此类转换的内容。

我知道一个循环(对于number1< number2,do number1 ++),它适用于小数字,但如果10变为10亿,那么循环可能会冻结整个应用程序。

第二个想法是获得附加值( 100-10 = 90 )并除以30或60帧,并在每帧中添加此值。但是如果丢帧会怎么样? - 可能不会增加价值。如果用户双击或系统自动添加值会怎样?

希望它能说明我需要什么样的数字转换。  也许我忽略了,有一个简单的方法?任何帮助表示赞赏。

3 个答案:

答案 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一起工作,因此您可以将间隔分成小间隔,并在不同的线程中进行转换。将它们发送到主线程并打印。希望它会有所帮助。