SDカードからjpgを含むイメージビューをロードし、クリッピングせずに最大限に拡大されるようにスケーリングしています。次に、タッチ イベントの座標を中心にビットマップを円でオーバーレイします。
イメージビューから現在のビットマップを保存し、新しいオーバーレイ ビットマップを作成し、キャンバスを追加し、元のビットマップを描画し、円を描画し、スケーリング コードを新しいオーバーレイ ビットマップに再適用してから、新しいオーバーレイ ビットマップでイメージビューを再読み込みします。画像に初めて触れて円を描くと、円は正確に描画されますが、画像のスケーリングが正しくありません。2 回目のタッチで、画像のスケーリングは修正されますが、円は「間違った」場所に描画されます。画面上のタッチした場所に円が描画されますが、画像は正しくスケーリングされているため、ターゲットが移動しました。3 回目以降のすべてのタッチでは、最初から期待していたとおりに機能します。
これが私のコードです:
private static Matrix curMatrix = new Matrix();
public boolean onTouch(View v, MotionEvent event) {
int eventType = event.getAction() & MotionEvent.ACTION_MASK;
switch (eventType) {
case MotionEvent.ACTION_UP:
ImageView i = (ImageView) v;
//Save the current bitmap
i.buildDrawingCache();
Bitmap bm = i.getDrawingCache();
//Create new overlay bitmap
Bitmap bmOverlay = Bitmap.createBitmap(i.getWidth(), i.getHeight(), Bitmap.Config.ARGB_8888);
//Create new drawing canvas and paint
Canvas c = new Canvas(bmOverlay);
Paint p = new Paint();
p.setColor(Color.RED);
p.setAlpha(50);
//Draw the saved bitmap onto the canvas
c.drawBitmap(bm, new Matrix(), null);
//Draw a circle on the current canvas, centered on event coordinates
c.drawCircle(event.getX(), event.getY(), 100F, p);
//Autosize canvas to previous imageview settings
RectF drawableRect = new RectF(0, 0, (float) c.getWidth(), (float) c.getHeight());
RectF viewRect = new RectF(0, 0, (float) i.getWidth(), (float) i.getHeight());
curMatrix.setRectToRect(drawableRect, viewRect, Matrix.ScaleToFit.CENTER);
//Apply the autosize transformation
i.setImageMatrix(curMatrix);
//Reload the imageview with the new bitmap
i.setImageBitmap(bmOverlay);
}
return true;
}
そして、何が起こっているのかをよりよく説明するためのいくつかの画像があります:
開始 - 魚をクリックしたい:
最初のクリック - クリックは正確ですが、スケーリングは失われます:
2 回目のクリック - スケーリングが再び表示されますが、クリックすると元のスケーリングに適用されるため、オフになっています。
3回目以降のすべてのクリック-最初から期待していたとおりに機能します。
助けてくれてありがとう!