Если вы хотите повернуть растровое изображение с помощью рисования на основе Canvas, у вас нет особого выбора, кроме как использовать матрицы преобразования, либо через Matrix , который вы передаете Canvas.drawBitmap (), либо через операции преобразованиявызывается прямо на холсте.И если вы включите фильтрацию растрового изображения с помощью Paint.setFilterBitmap (логическое значение) , качество будет хорошим, по крайней мере, по моим стандартам.
Вот полный пример (на основе матрицы), в который вы можете игратьвокруг, в частности, глядя на то, какую разницу имеет включение и выключение растровой фильтрации (или просто посмотрите на мои скриншоты ниже).Хотя он не использует SurfaceView, просто обычный пользовательский вид, но его легко перенести на SurfaceView:
CustomView.java :
package com.example.android;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.util.TypedValue;
import android.view.View;
public class CustomView extends View {
private static final float DP_PER_SECONDS = 10;
private final float mBallCirfumference;
private final float mBallRadius;
private final Bitmap mBallBitmap;
private final Paint mBallBitmapPaint;
private final Matrix mBallTransformMatrix = new Matrix();
private final float mPxPerSecond;
private long mStartTime = -1;
public CustomView(Context context) {
super(context);
final Resources res = getResources();
// Load the ball bitmap. You probably want to use a better bitmap ;)
mBallBitmap = BitmapFactory.decodeResource(res, R.drawable.icon);
// We need the radius and circumference of the ball for our calculations
// later
mBallRadius = mBallBitmap.getHeight() / 2;
mBallCirfumference = mBallRadius * 2 * (float)Math.PI;
// Create ourself a paint object so we can adjust the quality of the
// bitmap drawing
mBallBitmapPaint = new Paint();
// Significantly improves quality when drawing transformed bitmaps. Compare
// with when you disable this, which is the default
mBallBitmapPaint.setFilterBitmap(true);
// Calculate speed of ball in pixels
mPxPerSecond = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, DP_PER_SECONDS,
res.getDisplayMetrics());
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// Calculate how far into the animation we are
if (mStartTime == -1) {
mStartTime = getDrawingTime();
}
long currentTime = getDrawingTime();
float secondsPassed = (currentTime - mStartTime) / 1000.0f;
// Calculate how far the ball has moved and how many degrees it has been
// rotated as a consequence of the movement
float movedDistance = secondsPassed * mPxPerSecond;
float fullRotationsMade = movedDistance / mBallCirfumference;
float rotationInDegrees = fullRotationsMade * 360;
// Setup the transformation matrix to simulate a rolling ball
mBallTransformMatrix.reset();
mBallTransformMatrix.postRotate(rotationInDegrees, mBallRadius, mBallRadius);
mBallTransformMatrix.postTranslate(movedDistance, 0);
canvas.drawBitmap(mBallBitmap, mBallTransformMatrix, mBallBitmapPaint);
// Force redraw so we get an animation
invalidate();
}
}
ExampleActivity.java :
package com.example.android;
import android.app.Activity;
import android.os.Bundle;
public class ExampleActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new CustomView(this));
}
}
Пример снимка экрана с фильтрацией растровых изображений включена .Если вы запустите пример, растровое изображение будет катиться, как шарик (извините, что я плохо выбрал графику шариков):
Пример снимка экрана с фильтрацией растровых изображений отключен .