2010-04-14 4 views
1

Я пытаюсь создать два вращающихся колеса, как в шкивах, поэтому каждый раз, когда прикрепленная веревка перемещается, два шкива будут вращаться. я попробовал два подхода:android spinning image

1) использовать Matrix.postRotate в OnDraw() метод Вид класса, который вызывает следующее:

private void drawSpinningWheel(Canvas canvas) 
{ 
    try 
    { 
     canvas.save(); 

      Bitmap bitmapOrg = null; 

     int iDrawable = R.drawable.spinning_button; 

     bitmapOrg = BitmapFactory.decodeResource(getResources(), iDrawable); 

     if(bitmapOrg != null) 
     { 
      int width = bitmapOrg.getWidth(); 
      int height = bitmapOrg.getHeight(); 
      int newWidth = 24; 
      int newHeight = 24; 

      // calculate the scale - in this case = 0.4f 
      float scaleWidth = ((float) newWidth)/width; 
      float scaleHeight = ((float) newHeight)/height; 

      // createa matrix for the manipulation 
      Matrix matrix = new Matrix(); 
      // resize the bit map 
      matrix.postScale(scaleWidth, scaleHeight); 
      matrix.postRotate((float) mDegrees++); 

      Bitmap resizedBitmap = Bitmap.createBitmap(bitmapOrg, 0, 0, 
        width, height, matrix, true); 

      canvas.drawBitmap(resizedBitmap, matrix, null); 

     } 

     canvas.restore(); 
    } 
    catch(Exception e) 
    { 
     Log.e(TAG + "drawSpinningWheel", e.getMessage()); 
    } 

} 

, но кажется, что изображение не только вращается, но вращается вокруг другой оси

2) использовать SurfaceView и отдельный поток, в перспективе() называют это:

private void doDraw(Canvas canvas) { 
     // Draw the background image. Operations on the Canvas accumulate 
     // so this is like clearing the screen. 
     canvas.drawBitmap(mBackgroundImage, 0, 0, null); 

     int yTop = mCanvasHeight - ((int) mY + mSpinningWheelImageHeight/2); 
     int xLeft = (int) mX - mSpinningWheelImageWidth/2; 

...

 // Draw the ship with its current rotation 
     canvas.save(); 
     canvas.rotate((float) mHeading++, (float) mX, mCanvasHeight 
       - (float) mY); 

      mSpinningWheelImage.setBounds(xLeft, yTop, xLeft + mSpinningWheelImageWidth, yTop 
        + mSpinningWheelImageHeight); 
      mSpinningWheelImage.draw(canvas); 


     canvas.restore(); 
    } 

Я получаю вращающийся, чтобы работать, но я не могу добавить еще одно вращающееся колесо. я даже попытался создать еще одну нить для второго вращающегося колеса, появляется только один. может ли кто-нибудь указать мне в правильном направлении? Благодарю.

3) Хорошо, теперь я также попытался RotateAnimation:

общественного класс GraphicsView расширяющего View { частных статический окончательный Струнный QUOTE = "Никто больше не использует Java Это такой большой тяжеловес мяч и цепь..";

private Animation anim; 
private Animation anim2; 

private Bitmap jobs; 
private Bitmap wheel; 

private int jobsXOffset;   
private int jobsYOffset; 

private int wheelXOffset;   
private int wheelYOffset; 

public GraphicsView(Context context) 
{ 
    super(context); 
    jobs = BitmapFactory 
    .decodeResource(getResources(), R.drawable.spinning_button); 

    jobsXOffset = jobs.getWidth()/2; 
    jobsYOffset = jobs.getHeight()/2; 

    wheel = BitmapFactory 
    .decodeResource(getResources(), R.drawable.wheel); 

    wheelXOffset = jobs.getWidth()/2; 
    wheelYOffset = jobs.getHeight()/2; 


} 

private void createAnim(Canvas canvas) 
{ 
    anim = new RotateAnimation(0, 360, canvas.getWidth()/2, canvas 
      .getHeight()/2); 
    anim.setRepeatMode(Animation.INFINITE); 
    anim.setRepeatCount(Animation.INFINITE); 
    anim.setDuration(10000L); 
    anim.setInterpolator(new AccelerateDecelerateInterpolator()); 

    startAnimation(anim); 
} 

private void createAnim2(Canvas canvas) 
{ 
    anim2 = new RotateAnimation(0, 360, canvas.getWidth()/2+30, canvas 
      .getHeight()/2); 
    anim2.setRepeatMode(Animation.INFINITE); 
    anim2.setRepeatCount(Animation.INFINITE); 
    anim2.setDuration(10000L); 
    anim2.setInterpolator(new AccelerateDecelerateInterpolator()); 

    startAnimation(anim); 
} 

@Override 
protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 

    // creates the animation the first time 
    if (anim == null) { 
     createAnim(canvas); 
    } 

    int centerX = canvas.getWidth()/2; 
    int centerY = canvas.getHeight()/2; 

    canvas.drawBitmap(jobs, centerX - jobsXOffset, 
      centerY - jobsYOffset, null); 

    canvas.drawBitmap(wheel, centerX - wheelXOffset + 30, 
      centerY - wheelYOffset, null); 

} 

}

но результат похож на Canvas.Rotate, я был в состоянии получить первое изображение, чтобы повернуть хорошо, но второе изображение будет просто вращаться вокруг первого изображения, хотя я замечаю второе изображение также вращается. похоже, мне понадобится отдельный вид для второго изображения, я надеялся избежать этого, потому что я не уверен, как заставить колесо вращаться, но прикрепленная веревка не вращается.

ответ

1

Вы пробовали RotateAnimation?

+0

Я сделал, и он вращается только в верхнем/левом углу. Я не могу найти настройки, чтобы заставить его вращаться (вращаться) по центру моего рисунка. Можете ли вы предоставить некоторые детали? – mobibob

0

Проверьте мой вопрос и ответ на него, я думаю, это то, что вы (и я) ищет ... How to spin an android icon on its center point?

Я положил три анимации, текст моего логотипа и мой значок с логотипом. Затем я помещаю отрицательное вращение на текст и положительно на значок. Это просто, но круто. Ответ на мой вопрос содержит список кодов.