より大きなものをデバッグするために非常に小さなテストを実行していますが、この問題の原因を突き止めるのに苦労しています。
ImageView、Canvas、および Bitmap があります。ImageView を初期化して Bitmap に設定し、次に Canvas をビットマップに設定します。
_image.setImageBitmap(bitmap);
Canvas canvas = new Canvas(bitmap);
次に、onTouchListener を _image にアタッチし、MotionEvent.ACTION_UP が検出されるのをリッスンします。その時点で、次のようにキャンバスに Rect を描画します。
Rect rect = new Rect((int)event.getX(),event.getY(),event.getX()+20,event.getY()+20);
Paint paint = new Paint();
paint.setColor(Color.RED);
canvas.drawRect(rect,paint);
さまざまなサイズのビットマップ画像でこれを試してみました.フルディスプレイよりも小さいものから、正確なサイズに非常に近いものまで. getX() でさまざまな変換を試みましたが、dp から dp に変換しようとして、代わりに getRawX/Y() を使用しました。基本的に、さまざまなソリューションがたくさんありますが、どれも機能していません。ビットマップのサイズと画面サイズの比率を取得し、それを乗算/除算してみました。この非常に単純な問題を解決できたものはありません。
おそらく、私はある時点で正しいアプローチを試み、それを単に間違って実装しただけです。Rect がどこに描画されるのか、タッチが発生した場所に描画するために必要な変換とその理由について、アドバイスをいただければ幸いです。「なぜ」は、これから学びたいからです。
編集:これは何が起こるかの概算です。赤い四角形は実際のタッチが発生する場所で、青はそれが描画される場所です。X=Y=0 から遠ざかるほどスケーリングします。また、使用している画像の幅と高さに応じてスケーリングされることにも気付きました。