マップ上に手動で矢印を描きたい。この手法を使用して描画するとアプリの速度が低下するオーバーレイが多数あるため、パフォーマンスの問題のためにドローアブルの回転を使用していません。
GPSポイントと回転角度を指定して、そのポイント上に矢印を描く必要があるので、手動で矢印を描きます。オーバーレイ クラスを拡張し、draw メソッドで描画作業を行います。
助言がありますか ?
マップ上に手動で矢印を描きたい。この手法を使用して描画するとアプリの速度が低下するオーバーレイが多数あるため、パフォーマンスの問題のためにドローアブルの回転を使用していません。
GPSポイントと回転角度を指定して、そのポイント上に矢印を描く必要があるので、手動で矢印を描きます。オーバーレイ クラスを拡張し、draw メソッドで描画作業を行います。
助言がありますか ?
アプリで同じ問題に対処しました。コードは github にあります
基本的に、矢印を描く前にキャンバスをオーバーライドdraw
して回転させます。
@Override
public void draw(Canvas canvas) {
//NOTE: 0, 0 is the bottom center point of the bus icon
//first draw the bus
vehicle.draw(canvas);
//then draw arrow
if (arrow != null && heading != BusLocation.NO_HEADING)
{
//put the arrow in the bus window
int arrowLeft = -(arrow.getIntrinsicWidth() / 4);
int arrowTop = -vehicle.getIntrinsicHeight() + arrowTopDiff;
//NOTE: use integer division when possible. This code is frequently executed
int arrowWidth = (arrow.getIntrinsicWidth() * 6) / 10;
int arrowHeight = (arrow.getIntrinsicHeight() * 6) / 10;
int arrowRight = arrowLeft + arrowWidth;
int arrowBottom = arrowTop + arrowHeight;
arrow.setBounds(arrowLeft, arrowTop, arrowRight, arrowBottom);
canvas.save();
//set rotation pivot at the center of the arrow image
canvas.rotate(heading, arrowLeft + arrowWidth/2, arrowTop + arrowHeight / 2);
Rect rect = arrow.getBounds();
arrow.draw(canvas);
arrow.setBounds(rect);
canvas.restore();
}
}