Android2D Matrixで移動, 回転

画像の描画のコードを使って, 移動や回転などを追加します。

drawBitmapには, Matrixといういわゆる行列を引数にとることができます。この行列はBitmapの描画位置や, 画像に対する演算などを定義するための行列です。

この行列を変更し, 再描画(invalidate())することで, 移動などをすることができます。

Matrix に関するところはAndroid Developers を参考にするとよいです。3×3の行列だそうです。

public class DrawBitmapView extends View
{
	private Paint paint;
	
	private Bitmap img;
	
	private Matrix matrix;
	
	public DrawBitmapView ( Context context )
	{
		super(context);
		paint = new Paint(Paint.ANTI_ALIAS_FLAG);
		img = BitmapFactory.decodeResource(context.getResources(), R.drawable.mikasa);
		matrix = new Matrix();
	}

	@Override
	protected void onDraw ( Canvas canvas )
	{
		canvas.drawColor(Color.BLACK);
		canvas.drawBitmap(img, matrix, paint);
	}
	
	public void translateB( float dx, float dy )
	{
		matrix.postTranslate(dx, dy);
		invalidate();
	}
	
	public void scaleB ( float sx, float sy )
	{
		matrix.postScale(sx, sy);
		invalidate();
	}
	
	public void rotateB ( float degrees )
	{
		matrix.postRotate(degrees);
		invalidate();
	}
	
	public void skewB ( float kx, float ky )
	{
		matrix.postSkew(kx, ky);
		invalidate();
	}
}

これをActivityから利用します。

public class MainActivity extends Activity
{
	DrawBitmapView bView;
	
	@Override
	protected void onCreate ( Bundle savedInstanceState )
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		
		bView = new DrawBitmapView(this);
		bView.setClickable(true);
		bView.setOnClickListener(new OnClickListener()
		{
			
			@Override
			public void onClick ( View v )
			{
				bView.translateB(30, 30);
			}
		});
		
		addContentView(bView, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
	}
}

Viewを定義して, クリックイベントを追加してみました。クリックすると移動します。