Android imageview未跟踪路径

Android imageview未跟踪路径,android,animation,imageview,Android,Animation,Imageview,我正在使用translate动画使imageview跟踪路径。最初,我只是使imageview通过一组特定的点进行平移,但事实并非如此。以下是我在ondraw方法中的代码: @Override public void onDraw(Canvas canvas) { Log.w(this.getClass().getName(),"onDraw of Balls called"); super.onDraw(canvas); mCanvas = c

我正在使用translate动画使imageview跟踪路径。最初,我只是使imageview通过一组特定的点进行平移,但事实并非如此。以下是我在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();

    }
请帮忙

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

编辑1:-

这是我修改过的代码,但翻译仍然不起作用。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);


     }

您正在将自定义类与ImageView和动画混合使用。我想你应该只使用其中一种方法。另外,我看不到您实际上将TranslationAnimation与ImageView本身连接起来

因此,一种解决方案是使用TranslateAnimation,但是您需要调用mBal.startAnimation(mTrans),而不是mTrans.start()

另一种解决方案是使用自定义视图、覆盖onDraw并自行处理动画:

  • 保存当前时间(System.curentTimeMillis)
  • 使用Canvas.drawBitmap(位图、x、y、paint)将位图直接绘制到画布
  • 根据经过的时间更新坐标
  • 如果动画仍应运行,则调用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);
        }
    }

}

谢谢您建议绘制自定义视图的另一种方法意味着我必须使该视图成为当前自定义视图的子视图?我已使用您建议的第一种方法添加了修改后的代码。使用TranslateAnimation,但它仍然不起作用。plz帮助对于第二种方法,您不应该创建第二个自定义视图,只需编辑现有视图即可。对于第二种方法,可能有许多原因导致问题,例如,如果在每次onDraw调用中启动动画,则可能总是重新启动它。但是我没有足够的经验来解决这个问题。我为另一个解决方案添加了一个示例。