2015-06-06 68 views
2

想象一下數字,然後用戶單擊按鈕後,它將更改爲。但如何使一個有效過渡小數或雙數之間的過渡

10 - > 100,

,將顯示像

12,15,18,...,97,100在1值第二。

我在「Cookie clicker」中看到過類似的東西,但在源代碼中找不到任何有關這種轉換的東西。

我有一個循環的想法(用於數字1 <數字2,不要數字1 ++),它會正常工作的小數目,但如果10個變爲1十億,則循環可能會凍結整個應用程序。

第二個想法是獲得附加值(100-10 = 90)併除以30或60幀,並將該值與每個幀相加。但是如果幀被丟棄會發生什麼? - 價值可能不會被添加。如果用戶進行雙擊或系統自動添加值會怎麼樣?

希望它給出了我需要什麼樣的數字轉換的想法。 也許我忽略了,有一個簡單的方法?任何幫助表示讚賞。

+1

一個可能的解決方案是使用'ValueAnimator'。也許這就是你要找的。我將很快向您展示示例代碼... – Andy

回答

1

希望這個小演示使用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> 

+0

非常感謝您的單擊。我會試驗一下,但是也許你可以回答我一個問題:它是否可以進行調整,以便能夠在多個按鈕按下時做出正確反應?像停止動畫一樣,獲取剩餘數字,添加100,並在動畫中設置新的開始和結束值? – Vlives

+1

我不確定你的意思?我理解是否正確,如果動畫運行另一次點擊將停止它,如果用戶再次點擊,繼續動畫與新的相應的開始和結束值? – Andy

+0

如果動畫正在運行,則另一次單擊應立即使用新的相應開始和結束值重新開始動畫。如果用戶點擊2次,那麼它會看起來像單一的動畫,但最終值將是200(每次100個點擊2次) – Vlives

0

我想你可以通過使用不同的線程來做到這一點。只有主線程才能與UI一起工作,因此您可以將間隔分成很小的間隔,並在不同的線程中進行轉換。將它們發送到主線程並打印之後。希望它會有所幫助。

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(); 
     } 

    } 
} 

不要忘了替換您的佈局文件,因爲按鈕的點擊屬性已被刪除:

<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> 
+0

非常感謝!當我獲得足夠的聲望時,我會鼓掌, – Vlives

+1

ok,thx,我想你很快就會有足夠的聲望:-) – Andy