1

Я пытаюсь создать небольшую анимацию, которая плавно меняет цвет фона. Моя проблема в том, что она отображает только последнее значение (100, это означает, что он напрямую переходит на красный фон). Я не знаю, почему моя создан в то время как петля не актуализировать каждое значение (так что это шоу будет плавно анимация цвета)While loop: Change Background color

Нового кода (который почти работает, но ИКА, как остановить анимацию)

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

обернутый ответы разместил @ Гейб-sechan и @ Jesse-Buss поддержки

ValueAnimator из устройств SDK выше HONEYCOMB. Итак, ниже этого уровня 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

Когда вы что-то изменить в интерфейсе, это Безразлично «Не сразу. Вместо этого он отправляет сообщение Looper в поток пользовательского интерфейса. Когда управление возвращается в петлеукладчик (когда вы закончите с любой функцией, называемой фреймворком), он обработает все сообщения в Looper до тех пор, пока не обработает запрос перерисовывания. Затем он будет рисовать. Поэтому, если вы зацикливаетесь в onClick, вы не получите никаких обновлений на экране. Если вы хотите, чтобы что-то произошло через 10 мс, отправьте сообщение с задержкой на обработчик и обновите интерфейс в этом потоке.

Сторона примечания: НИКОГДА не спите на нитке пользовательского интерфейса. Причина в том, что никакие команды ввода или рисования не могут быть обработаны, если вы не возвращаете управление Looper. Таким образом, ваше приложение перестает отвечать на запросы. Если вы сделаете это достаточно долго, это даже может привести к тому, что среда будет убивать ваше приложение за то, что он не отвечает.

1

Лучший способ сделать это - использовать анимацию для Android. Я украл для этого код из here

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