2017-02-13 23 views
1

背景色をスムーズに変更する小さなアニメーションを作成しようとしています。私の問題は、それは最後の値(100、それは直接赤い背景に行くことを意味する)を示しているだけです。私はWhileループ:背景色を変更する

(それがスムーズに色のアニメーションを表示なるように)私の作成したwhileループは

新しいコードのすべての値を実現しない理由を知っている(ほとんど動作しますが、アニメーションを停止する方法IDK)はありません

imageButton_info.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v){ final Handler handler = new Handler(); Runnable ChangeBackgroundRunnable = new Runnable() { @Override public void run() { number++; float[] hsvColor = {0, 1, 1}; hsvColor[0] = 360f * number/100; color.setBackgroundColor(Color.HSVToColor(hsvColor)); handler.postDelayed(this, 80); if (number >=100) number = 1; } }; number = 0; handler.removeCallbacks(ChangeBackgroundRunnable); handler.postDelayed(ChangeBackgroundRunnable, 0); } }); 

コード:

public void onClick(View v){ 

      try { 
       while (number<=100) { 

         number=number+1; 

         float[] hsvColor = {0, 1, 1}; 
         hsvColor[0] = 360f * number/100; 
         color.setBackgroundColor(Color.HSVToColor(hsvColor)); 

         Thread.sleep(10); 
       } 
      }catch(Exception e){ 

       //New exception 
       Log.e("Camera Error!",e.getMessage()); 

      } 

答えて

0

から、このためのコードを盗みました。 SDKレベルの下では、@ gabe-sechanの提案を使用します。以下のコードを確認してください。

 
    private void executeBackgroundChange() { 
     // Handler and runnable to run the animation in devices sdk below honeycomb. 
     mHandler = new Handler(); 
     mChangeBackgroundRunnable = new Runnable() { 
      @Override 
      public void run() { 
       number++; 

       float[] hsvColor = {0, 1, 1}; 
       hsvColor[0] = 360f * number/100; 
       mContainer.setBackgroundColor(Color.HSVToColor(hsvColor)); 

       mHandler.postDelayed(this, 500); 
       if (number == 100) 
        number = 0; 
      } 
     }; 
     number = 0; 
     mHandler.removeCallbacks(mChangeBackgroundRunnable); 
     mHandler.postDelayed(mChangeBackgroundRunnable, 0); 
    } 

    @TargetApi(Build.VERSION_CODES.HONEYCOMB) 
    private void executeBackgroundChangeUsingValueAnimator() { 
     colorAnimation = ValueAnimator.ofObject(new ArgbEvaluator(), getResources().getColor(R.color.red), getResources().getColor(R.color.blue)); 
     colorAnimation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
      @Override 
      public void onAnimationUpdate(final ValueAnimator animator) { 
       mContainer.setBackgroundColor((Integer) animator.getAnimatedValue()); 
      } 
     }); 
     colorAnimation.setRepeatCount(ValueAnimator.INFINITE); 
     colorAnimation.setDuration(10 * 1000); 
     colorAnimation.start(); 
    } 

以下のメソッドを追加し、何かのクリックでアニメーションを停止するには、以下のメソッドを呼び出します。

 
    private void stopBackgroundChangeAnimation() { 
     if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) { 
      if (colorAnimation != null && colorAnimation.isRunning()) 
       colorAnimation.end(); 
     } else { 
      if (mHandler != null && mChangeBackgroundRunnable != null) 
       mHandler.removeCallbacks(mChangeBackgroundRunnable); 
     } 
    } 

github projectを参照してください。

+0

を使用してみてください、この答えのおかげで、私はゲイブのと、あなたの提案を試みたが、それはほぼ完璧に働きました。私が今得た唯一の問題は、アニメーションを停止する方法がわからないことです(私はイメージボタンを使用しています)。私はクリックでそれを止める方法を知っていますか(私はすでにwhileループを作成しようとしましたが、アニメーションはそれで動作しませんでした)? – Nick88

+0

私は残念なことにそれは動作しませんでしたが、あなたのサポートに感謝しました。 – Nick88

1

あなたがUIで何かを変え、それはdoesnの...事前にあなたの答えをありがとうすぐに起こることはありません。代わりに、UIスレッド上のルーパーにメッセージをポストします。制御がルーパに戻ると(フレームワークが呼び出す関数を実行し終えたら)、最終的に再描画要求を処理するまで、ルーパ上のすべてのメッセージを処理します。それからそれが描かれます。したがって、あなたがonClickをループしている場合は、画面を更新することはできません。何かが10ミリ秒で起こるようにするには、遅延メッセージをハンドラに投稿し、そのスレッドのUIを更新してください。

サイドノート:決してUIスレッドでスリープしません。その理由は、ルーパーに制御を戻していない場合、入力コマンドや描画コマンドを処理できないためです。したがって、あなたのアプリは応答しなくなります。あなたがそれを十分に長くすると、フレームワークが反応しないためにあなたのアプリを殺すことさえできます。

1

これを行うより良い方法は、Androidアニメーションを使用することです。私はhere

@のゲイブ・sechanによって掲示答えと@ジェシー・バス

ValueAnimatorHONEYCOMB上記デバイスのSDKからのサポートをラップ

int colorFrom = getResources().getColor(R.color.red); 
int colorTo = getResources().getColor(R.color.blue); 
ValueAnimator colorAnimation = ValueAnimator.ofObject(new ArgbEvaluator(), colorFrom, colorTo); 
colorAnimation.setDuration(250); // milliseconds 
colorAnimation.addUpdateListener(new AnimatorUpdateListener() { 

    @Override 
    public void onAnimationUpdate(ValueAnimator animator) { 
     textView.setBackgroundColor((int) animator.getAnimatedValue()); 
    } 

}); 
colorAnimation.start(); 
0

はrunOnUiThread

public void onCreate(Bundle savedInstanceState) { 
     res = getResources(); 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.xyz);//**Works**/ 
     handler.postDelayed(runnable, 10);  
    } 

    private Runnable runnable = new Runnable() { 
     public void run() { 
      runOnUiThread(new Runnable() { 
       public void run() 
       { 
        try { 
        while (number<=100) { 
          number=number+1; 
          float[] hsvColor = {0, 1, 1}; 
          hsvColor[0] = 360f * number/100; 
          color.setBackgroundColor(Color.HSVToColor(hsvColor)); 
        } 
       }catch(Exception e){ 
        //New exception 
       } 
       } 
      }); 
     } 
    }