0

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回目以降のすべてのクリック-最初から期待していたとおりに機能します。
3 回目のクリック

助けてくれてありがとう!

4

1 に答える 1

1

いつものように、私は物事を複雑にしすぎていました。興味のある方のために、次のより単純なコードが機能します。これを ImageView の TouchListener として設定するだけで、画像に触れると、タッチ ポイントを中心とした半径 100 (ピクセル?) の半透明の赤い円が描画されます。

public class GetCoordinatesTouchListener implements OnTouchListener {
    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 from the imageview
                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);
                //Reload the imageview with the new bitmap with FIT_XY scaling
                i.setScaleType(ImageView.ScaleType.FIT_XY);
                i.setImageBitmap(bmOverlay);
            }
        return true;
    }
}
于 2012-04-23T23:23:16.347 に答える