2011-08-05 47 views
5

私は画像ビューコントロールで画像を持っています。画像のx座標とy座標が連続的に変化するため、ユーザーはこの画像でパンとズームを実行できます。イメージコントロール内のイメージの現在のx座標とy座標を調べる方法はありますか?それに関するすべてのコードはより有益です。イメージコントロールでビットマップイメージのx座標とy座標を取得する方法は?

+1

このリンクは役立つかもしれない..... http://stackoverflow.com/questions/2447564/detect-touch-on-bitmap – Uttam

答えて

11

ImageViewは、拡大縮小(拡大)と平行移動(パン)を行うためにMatrixクラスを使用します。行列を保持できる場合は、ズーム/パンビューの(左上の)座標を取得できます。ズーム可能な&パン可能、拡張ImageViewのため

コードを使用すると、拡張ImageViewのクラスは/翻訳をスケーリングするために使用メンバ変数として行列を持って表示されますその記事の中でのstackoverflowの1 posts

で利用可能です。

次のコードを使用して、ズーム/パンされたImagevIew(実際のビットマップ)の境界をマトリックスから取得できます。

RectF r = new RectF(); 
matrix.mapRect(r); 
Log.i(TAG, "Rect " + r.left + " " + r.top + " " + r.right + " " + r.bottom + " " + mOverAllScale + " "); 

新しく追加された答えが

次のコードを理解するには、このlinkスルー行くと理解する必要があります。

翻訳

ユーザが画像をドラッグすると、画面座標(絶対値)とビットマップ座標が同期して行きます。 [ビットマップに書き込むものは、キャンバス(onDraw()で)に表示されます。]カラーリングを適用すると、ビットマップイメージの別の領域に適用されます。これを修正するには、翻訳を行う必要があります。翻訳は、ユーザーの入力座標(画面座標)をビットマップ座標(ユーザーが意図した通り)に変更します。 次のコードスニペットは翻訳作業を支援します。 [ユーザー入力座標があること

レッツ(x、y)は、

RectF r = new RectF(); 
matrix.mapRect(r); 
Log.i(TAG, "Rect " + r.left + " " + r.top + " " + r.right + " " + r.bottom + " " + mOverAllScale + " "); 
float newX = x - r.left; 
float newY = y - r.top; 

あなたは(x、y)の場所に新しい座標を使用します。

ズーム(拡大縮小)

ユーザピンチイン/アウト。ビットマップがズームアウト/ズームインされます。元のビットマップは変更されず、ズームは表示の観点からのみ行われます。 この場合も、画面とビットマップの同期が失われます。画面に適用された色付けが表示された画像に反映されるはずです。 次のコードスニペットはスケーリングに役立ちます。

// mScalingFactor shall contain the scale/zoom factor 
float scaledX = (event.getX() - r.left); 
float scaledY = (event.getY() - r.top); 

scaledX /= mScalingFactor; 
scaledY /= mScalingFactor; 

Shash

+0

おかげShashを、それをチェックアウト。あなたの調査結果を教えてください。 –

+0

回答を編集 – Shash316

+0

ありがとうShash。 –

関連する問題