2017-02-16 20 views
0

Я создал анимацию цветного фона, которая начинается при нажатии кнопки (она плавно меняет цвет фона снова и снова). Моя проблема в том, что я не могу остановить анимацию (если я снова нажму кнопку, она увеличит скорость анимации). Я уже пытался создать цикл while, но потом анимация больше не работала. Моя цель состоит в том, что анимация начинается, если я нажимаю изображение Btn, и если я его снова нажму, он должен остановиться.Как я могу остановить эту анимацию?

Код:

imageButton_info.setOnClickListener(new View.OnClickListener(){ 
     @Override 
     public void onClick(View v){ 

       // Handler and runnable to run the animation in devices sdk below honeycomb. 
       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); 

     } 
    }); 
+0

использование ValueAnimator вместо –

+0

Но созданная программа работает почти идеально, там должен быть способ, чтобы остановить его ? – Nick88

+0

Проверьте этот старый stackoverflow [ответ] (http://stackoverflow.com/a/9458785/5156016). –

ответ

0

Глядя на ваш код (снова) ваш метод removeCallbacks проходит в Instance вашего Runnable, который еще должен быть запущен.

Вам нужно будет сохранить экземпляр Runnable за пределами вашего прослушивателя кликов. У меня этого нужно просто залетела быстрый пример, который показывает мое мышление:

public class MainActivity extends AppCompatActivity { 

    TextView textView; 
    Button startBtn; 
    int counter = 0; 
    boolean running = false; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 


     textView = (TextView) findViewById(R.id.tvCounter); 
     startBtn = (Button) findViewById(R.id.startBtn); 

     final Handler counterHandler = new Handler(Looper.getMainLooper()); //Just to be specific 
     final Runnable myRunnable = new Runnable() { 
      @Override 
      public void run() { 
       textView.setText(String.format("Count is %s", counter ++)); 
       counterHandler.postDelayed(this, 100); 
      } 
     }; 


     startBtn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       if(running) { 
        counterHandler.removeCallbacks(myRunnable); 
        running = false; 
       } else { 
        counterHandler.post(myRunnable); 
        running = true; 
       } 


      } 
     }); 

    } 

} 

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 
    android:id="@+id/activity_main" 
    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:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context="example.com.test.MainActivity"> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
    android:id="@+id/tvCounter"/> 

    <Button android:layout_width="wrap_content" android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
      android:id="@+id/startBtn" android:text="Start Stop Button"/> 
</RelativeLayout> 
+0

Большое спасибо за ваш ответ, ваше предложение работает отлично! – Nick88