2013-10-31 17 views
5

Tôi đã cố gắng mã hóa một phương thức hoạt động để xoay hình ảnh đến một góc cụ thể. Xoay vòng hoạt động nhưng vấn đề là phương pháp được gọi mỗi giây hoặc lâu hơn, nhưng chỉ quay trong vài lần đầu tiên. Tại một thời điểm nhất định, hình ảnh đang hoạt ảnh chỉ đứng yên, mặc dù hoạt ảnh đang được thiết lập và bắt đầu với các giá trị khác nhau! mà giả sử để di chuyển hình ảnh, như nó đã làm trong vài lần đầu tiên.Xoay chế độ xem Android không xảy ra sau một vài lầnĐưa gọi số

private void animateNeedle(final float sfAngle) 
{ 
    final View viewNeedle = findViewById(R.id.needle); 
    final RotateAnimation needleAnimation; 

    RotateAnimation anim; 

    anim = new RotateAnimation(0, 
     sfAngle, 
     m_nNeedleWidth/2, 
     m_nNeedleHeight); 
    anim.setDuration(200); 
    anim.setFillAfter(true); 
    viewNeedle.setAnimation(anim); 
    anim.setAnimationListener(new AnimationListener() 
    { 

     @Override 
     public void onAnimationEnd(final Animation animation) 
     { 
      viewNeedle.clearAnimation(); 
     } 

     @Override 
     public void onAnimationRepeat(final Animation animation) 
     { 
      // TODO Auto-generated method stub 
     } 

     @Override 
     public void onAnimationStart(final Animation animation) 
     { 
      // TODO Auto-generated method stub 
     } 
    }); 

    anim.start(); 
    findViewById(android.R.id.content).postInvalidate(); 
} 

Tôi đang làm gì sai? Tôi đảm bảo rằng chức năng sẽ không được gọi hai lần trong quá trình hoạt ảnh nhưng nó không giúp ích gì.

+0

đâu bạn gọi hàm từ đâu? – LeeNeverGup

+0

Từ một sự kiện, để được chính xác một mẫu âm thanh nhận được nhưng điều này đang xảy ra chỉ một lần một giây để kiểm tra xem đó là một vấn đề liên quan đến thread. –

+0

Bạn có chắc chắn rằng 'sfAngle' được truyền luôn luôn khác không? –

Trả lời

2

Vấn đề là nó không được chạy trên các chủ đề chính, để sửa chữa nó, chúng ta sử dụng:

anim = new RotateAnimation(m_lastAngle, 
           sfAngle, 
           viewNeedle.getWidth()/2, 
           viewNeedle.getHeight()); 
    anim.setDuration(1000); 
    anim.setFillAfter(true); 
    viewNeedle.setAnimation(anim); 
    anim.setAnimationListener(new AnimationListener() 
    { 
     @Override 
     public void onAnimationEnd(final Animation animation) 
     { 
      // viewNeedle.clearAnimation(); 
     } 

     @Override 
     public void onAnimationRepeat(final Animation animation) 
     { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void onAnimationStart(final Animation animation) 
     { 
      m_lastAngle = sfAngle; 
     } 
    }); 

    runOnUiThread(new Runnable() 
    { 

     @Override 
     public void run() 
     { 
      viewNeedle.startAnimation(anim); 
      findViewById(android.R.id.content).invalidate(); 
     } 
    }); 

Ngoài ra chúng tôi đã sử dụng:

final View viewNeedle = findViewById(R.id.needle); 
    viewNeedle.getViewTreeObserver().addOnGlobalLayoutListener(
      new OnGlobalLayoutListener() 
      { 
       @Override 
       public void onGlobalLayout() 
       { 
        scaleView(viewNeedle); 
       } 

       /** 
       * Scale a view. 
       * 
       * @param viewToScale - View to scale. 
       */ 
       private void scaleView(final View viewToScale) 
       { 
        int height = (int) (viewToScale.getHeight()/GraphicsPoint 
          .getScalePoint().y); 
        int width = (int) (viewToScale.getWidth()/GraphicsPoint 
          .getScalePoint().x); 
        final LayoutParams layoutParams = viewToScale 
          .getLayoutParams(); 
        layoutParams.height = height; 
        layoutParams.width = width; 
        viewToScale.setLayoutParams(layoutParams); 
        viewToScale.getViewTreeObserver() 
          .removeOnGlobalLayoutListener(this); 
       } 
      }); 
2

Tôi cố gắng để sử dụng mã của bạn và nó hoạt động để gọi hoạt hình nhiều lần sau .. tôi thêm mã này để được gọi khi luân chuyển đến kết thúc:

.. 
       viewNeedle.startAnimation(anim); 
       anim.start(); 
.. 

như vậy để tạo ra một hình ảnh động lặp đi lặp lại nó sẽ thể chỉ là như thế này:

@Override 
      public void onAnimationEnd(final Animation animation) 
      { 
       viewNeedle.clearAnimation(); 
       viewNeedle.startAnimation(anim); 
       anim.start(); 
      } 

vì vậy tôi có thể gọi hoạt hình mà hơn một lần ..

hy vọng rằng sẽ giúp bạn ..

+0

Cảm ơn nhưng đó không phải là vấn đề, giải pháp đang chạy hình động trên chủ đề chính, tôi sẽ đăng giải pháp ngay bây giờ. – TomF

+0

Cảm ơn người đàn ông, công trình này! Đây sẽ là câu trả lời được chấp nhận. Tôi biết vấn đề nằm với UI Thread, nhưng gọi 'start()' trên đối tượng Animation là một giải pháp ngắn hơn nhiều. –

Các vấn đề liên quan