2011-10-20 3 views
-1

번역 애니메이션을 사용하여 이미지 뷰를 추적합니다. 처음에는 특정 세트의 점을 변환하는 데 이미지 뷰를 사용하고 있지만 그럴 수는 없습니다. 코드가 ondraw 메서드에 있습니다.이미지 뷰가 경로를 추적하지 않습니다.

@Override 
    public void onDraw(Canvas canvas) { 
     Log.w(this.getClass().getName(),"onDraw of Balls called"); 
     super.onDraw(canvas); 
     mCanvas = canvas; 



     canvas.drawLine(0, 240, 160, 0, mPaint); 
     canvas.drawLine(160, 0, 320, 240, mPaint); 

     mBal = (ImageView)findViewById(R.id.strike); 
     TranslateAnimation mTrans = new TranslateAnimation(0, 240, 160, 0); 
     mTrans.setDuration(6000); 
     mTrans.setFillEnabled(true); 
     mTrans.setFillAfter(true); 
     mTrans.start(); 

    } 

PLZ 도움이됩니다.

============================================== ===============

편집 1 : -

이 내 수정 된 코드는하지만 번역이 도움이 working.PLz하지 여전히

@Override 
    public void onDraw(Canvas canvas) { 

     Log.w(this.getClass().getName(),"onDraw of Balls called"); 

     BallsOnDraw(canvas); 

    } 

    void BallsOnDraw(Canvas canvas) 
    { 

      canvas.drawLine(0, 240, 160, 0, mPaint); 
      canvas.drawLine(160, 0, 320, 240, mPaint); 

      TranslateAnimation mTrans = new TranslateAnimation(0, 320, 0,240); 

      mTrans.setDuration(6000); 
      SitoliaActivity.mBal.startAnimation(mTrans); 


    } 

답변

1

당신 ImageViews와 애니메이션으로 맞춤 클래스를 혼합하고 있습니다. IMHO 방법 중 하나만 사용해야합니다. 또한 TranslationAnimation과 ImageView 자체를 실제로 연결하는 것을 보지 못했습니다.

그래서 한 가지 해결책은 TranslateAnimation을 사용하는 것이지만 mTrans.start() 대신 mBal.startAnimation (mTrans)을 호출해야합니다.

  • 를 사용하여 캔버스에 직접 비트 맵을 그릴 현재 시간 (System.curentTimeMillis)를 저장

    • 을 :

      다른 솔루션은 사용자 정의보기를 사용 된 onDraw을 무시하고, 애니메이션을 직접 처리하는 것 canvas.drawBitmap (비트 맵, x, y, 페인트);

    • 애니메이션을 계속 실행해야하는 경우 경과 시간을 기준으로 좌표를 업데이트하려면
    • postInvalidateDelayed (40); 여기

  • 는 예를 들어 사용자 정의이다 :

    public class C extends View { 
    
        private static final float FROM_X = 400; 
        private static final float FROM_Y = 100; 
        private static final float TO_X = 10; 
        private static final float TO_Y = 400; 
        private static final int DURATION = 2*1000; // 2 seconds 
    
        private Bitmap mImage; 
        private long mStart = -1; 
        private Paint mPaint = new Paint(); 
    
        public C(Context context) { 
         super(context); 
         mImage = ((BitmapDrawable)context.getResources().getDrawable(R.drawable.icon)).getBitmap(); 
        } 
    
        @Override 
        public void onDraw(Canvas canvas) { 
         boolean finished = false; 
         if (mStart == -1) { 
          // Time to start the animation 
          mStart = SystemClock.uptimeMillis(); 
         } 
         int elapsed = (int)(SystemClock.uptimeMillis() - mStart); 
         if (elapsed >= DURATION) { 
          elapsed = DURATION; 
          finished = true; 
         } 
         float x = FROM_X + (TO_X - FROM_X) * elapsed/DURATION; 
         float y = FROM_Y + (TO_Y - FROM_Y) * elapsed/DURATION; 
         canvas.drawBitmap(mImage, x, y, mPaint); 
         if (!finished) { 
          postInvalidateDelayed(10); 
         } 
        } 
    
    } 
    
    +0

    감사합니다! 사용자 정의보기를 그릴 것을 제안한 다른 접근 방법은 해당보기를 현재 사용자 정의보기의 하위로 만들어야한다는 의미입니다. – Ruchira

    +0

    you.i.e에서 제안한 첫 번째 접근 방식을 사용하여 수정 된 코드를 추가했습니다. TranslateAnimation을 사용하십시오. 그러나 여전히 작동하지 않습니다 .plz help – Ruchira

    +0

    두 번째 접근법의 경우 두 번째 사용자 정의보기를 만들지 말고 기존의보기를 편집하십시오. 두 번째 접근법에서는 문제를 일으키는 많은 것들이있을 수 있습니다. 예를 들어 모든 onDraw 호출에서 애니메이션을 시작하면 항상 다시 시작합니다. 하지만이 솔루션에 대한 충분한 경험이 없습니다. 다른 솔루션에 대한 예제를 추가했습니다. –

    관련 문제