Поворот на Android

Как может Drawable загружаться из ресурса вращаться при его рисовании? Например, я хотел бы нарисовать стрелку и повернуть ее в разные стороны, когда она нарисована?

Ответ 1

Вам нужно использовать функции Bitmap и Canvas Class для подготовки drawable:

Bitmap bmpOriginal = BitmapFactory.decodeResource(this.getResources(), R.drawable.image2);
Bitmap bmResult = Bitmap.createBitmap(bmpOriginal.getWidth(), bmpOriginal.getHeight(), Bitmap.Config.ARGB_8888);
Canvas tempCanvas = new Canvas(bmResult); 
tempCanvas.rotate(90, bmpOriginal.getWidth()/2, bmpOriginal.getHeight()/2);
tempCanvas.drawBitmap(bmpOriginal, 0, 0, null);

mImageView.setImageBitmap(bmResult);

В этом коде происходит поворот образца на 90 градусов по центру изображения.

Ответ 2

по существу он может быть сведен к нулю: сделать (n обратное) преобразование холста вместо преобразования drawable

private BitmapDrawable drawable; // or Drawable

protected void onDraw(Canvas canvas) { // inherited from View 
  //...
  canvas.save();
  canvas.rotate(degrees, pivotX, pivotY);
  drawable.draw(canvas);
  canvas.restore();
  //...
}

если у вас есть BitmapDrawable, может быть желательно повысить качество вывода, установив сглаживание

drawable.setAntialias(true);

Ответ 3

Принятый ответ не работает для меня. У меня нет квадратного изображения, поэтому я немного изменил его код.

private Bitmap rotateDrawable(@DrawableRes int resId) {
    Bitmap bmpOriginal = BitmapFactory.decodeResource(getResources(), resId);
    Bitmap bmpResult = Bitmap.createBitmap(bmpOriginal.getHeight(), bmpOriginal.getWidth(), Bitmap.Config.ARGB_8888);
    Canvas tempCanvas = new Canvas(bmpResult);
    int pivot = bmpOriginal.getHeight() / 2;
    tempCanvas.rotate(90, pivot, pivot);
    tempCanvas.drawBitmap(bmpOriginal, 0, 0, null);
    return bmpResult;
}

mImageView.setImageBitmap(rotateDrawable(R.drawable.some_image));