[英]Bitmap rotating about the wrong pivot
我在我的地圖應用程序中添加了指南針疊加層。 我決定創建一個相當復雜的羅盤玫瑰,並在覆蓋的構造函數中將其繪制到位圖上一次,而不是在每次繪制時。 在疊加層的繪圖中,我只是根據磁傳感器的值使用Matrix旋轉位圖。
簡而言之,當旋轉角度不是90度,180度或270度時,它是不正確的-它似乎不圍繞中心旋轉。
我創建了一個最小的示例,該示例再現了下面顯示的問題以及我看到的0、45和90度旋轉的屏幕截圖。 覆蓋形狀比真實版本要簡單得多,並且一些值已經過硬編碼以減小帖子大小,但這使用了與真實應用相同的原理。
public class BasicMapOverlayActivity extends MapActivity {
private MapController mMapCtrlr;
private MapView mMapVw;
private int mStartLat = 53500000;
private int mStartLon = -3000000;
private float mBearing = 0.0f;
private static final int COMPASS_OVL_SIZE = 100;
private Bitmap mCompassRoseBmap;
private Canvas mCompassRoseCanvas;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mMapVw = (MapView) findViewById(R.id.map);
mMapCtrlr = mMapVw.getController();
mMapCtrlr.setZoom(14);
mMapVw.setSatellite(true);
mMapVw.setBuiltInZoomControls(true);
GeoPoint startGpt = new GeoPoint(mStartLat, mStartLon);
mMapCtrlr.setCenter(startGpt);
mCompassRoseCanvas = new Canvas();
mCompassRoseBmap = Bitmap.createBitmap(COMPASS_OVL_SIZE, COMPASS_OVL_SIZE, Bitmap.Config.ARGB_8888);
mCompassRoseCanvas.setBitmap(mCompassRoseBmap);
List<Overlay> listOfOverlays = mMapVw.getOverlays();
CompassOverlay compassOverlay = new CompassOverlay(mCompassRoseCanvas);
listOfOverlays.add(compassOverlay);
}
public void myClickHandler(View target) {
switch (target.getId()) {
case R.id.TurnZeroButton:
mBearing = 0;
break;
case R.id.TurnThirtyButton:
mBearing = 30;
break;
case R.id.Turn45Button:
mBearing = 45;
break;
case R.id.TurnNinetyButton:
mBearing = 90;
break;
case R.id.Turn180Button:
mBearing = 180;
break;
}
EditText et = (EditText) findViewById(R.id.editText1);
NumberFormat formatter = new DecimalFormat("##0");
et.setText(formatter.format(mBearing));
mMapVw.invalidate();
}
@Override
protected boolean isRouteDisplayed() {return false;}
public class CompassOverlay extends com.google.android.maps.Overlay {
private Paint overlayPaint;
private RectF oRec;
public CompassOverlay(Canvas canvas) {
super();
createRose(canvas, COMPASS_OVL_SIZE);
}
public void createRose(Canvas canvas, int overlaySize) {
float scale = (float) overlaySize;
canvas.scale(scale, scale);
overlayPaint = new Paint();
overlayPaint.setStyle(Paint.Style.FILL_AND_STROKE);
overlayPaint.setColor(Color.YELLOW);
overlayPaint.setAntiAlias(true);
oRec = new RectF();
oRec.set(0.0f, 0.0f, 1.0f, 1.0f);
// draw rectangle edges and diagonals
canvas.drawLine(oRec.left, oRec.top, oRec.right, oRec.bottom, overlayPaint);
canvas.drawLine(oRec.left, oRec.bottom, oRec.right, oRec.top, overlayPaint);
canvas.drawLine(oRec.left, oRec.top, oRec.right, oRec.top, overlayPaint);
canvas.drawLine(oRec.right, oRec.top, oRec.right, oRec.bottom, overlayPaint);
canvas.drawLine(oRec.right, oRec.bottom, oRec.left, oRec.bottom, overlayPaint);
canvas.drawLine(oRec.left, oRec.bottom, oRec.left, oRec.top, overlayPaint);
// draw red vertical line as a direction indicator
overlayPaint.setColor(Color.RED);
canvas.drawLine(0.5f, oRec.top, 0.5f, oRec.bottom/2, overlayPaint);// vertical line
overlayPaint.setColor(Color.YELLOW);
}
@Override
public boolean draw(Canvas canvas, MapView mapView, boolean shadow, long when) {
Bitmap rBitmap = rotateCompassBitmap(mBearing);
canvas.drawBitmap(rBitmap, 160, 70, null);
rBitmap.recycle();
return false;
}
private Bitmap rotateCompassBitmap(float rotationDegrees) {
Matrix matrix = new Matrix();
matrix.postRotate(rotationDegrees);
Bitmap rotatedBitmap = Bitmap.createBitmap(mCompassRoseBmap, 0, 0,
mCompassRoseBmap.getWidth(), mCompassRoseBmap.getHeight(), matrix, true);
return rotatedBitmap;
}
}
}
布局只是一個簡單的地圖,其中包含一些按鈕,這些按鈕通過clickListener進行旋轉。 所應用的旋轉顯示在EditText中。
零旋轉
45度
90度
我們將不勝感激,因為我是第一個承認圖形方面我不是世界上最好的人。
使用postRotate旋轉一個點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.