1

배경색을 부드럽게 변경하는 작은 애니메이션을 만들려고합니다. 내 문제는 마지막 값만 표시한다는 것입니다 (100, 즉 빨간색 배경으로 직접 이동한다는 의미입니다). 나는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에서 뭔가를 변경, 그것은 아무튼 ... 미리 답변에 감사드립니다 즉시 일어나지 않습니다. 대신 UI 스레드에서 Looper에게 메시지를 게시합니다. 컨트롤이 루퍼로 돌아 왔을 때 (프레임 워크가 호출 한 함수로 끝나면), 결국 루퍼에있는 모든 메시지를 처리 ​​할 것이고, 결국 다시 그리기 요청을 처리 할 것입니다. 그럼 그릴거야. 따라서 onClick을 루핑하는 경우 화면을 업데이트하지 않습니다. 10ms 내에 어떤 일이 일어나길 원한다면 지연된 메시지를 Handler에 게시하고 해당 스레드의 UI를 업데이트하십시오.

사이드 노트 : 결코 UI 스레드에서 잠을 자지 마십시오. 그 이유는 루퍼에 제어권을 반환하지 않으면 입력 또는 그리기 명령을 처리 할 수 ​​없기 때문입니다. 따라서 앱이 응답하지 않게됩니다. 충분히 길게하면 프레임 워크가 응답하지 않는 앱을 ​​종료시킬 수도 있습니다.

1

더 좋은 방법은 Android 애니메이션을 사용하는 것입니다. 나는 HONEYCOMB 위의 장치 SDK에서 @의 별점-sechan와 @ 제시-버스로

ValueAnimator 지원을 게시 답변을 포장 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 
       } 
       } 
      }); 
     } 
    }