2011-07-08 5 views
2

プリビューされたビットマップをImageViewのソースとして設定しました。それから私はImageViewの行列を読んで、matrix.postTranslate(shiftX, shiftY)経由でImageViewのビットマップをシフトしました。同じ場所に中心点を維持しながらImageViewの画像をスケーリングする

縮尺の前であったビットマップの同じポイントにImageViewの中心を維持しながら、ズームイン/ズームしてイメージしたいと考えています。

matrix.postScale(zoom, zoom)で画像を拡大しようとすると、維持したい(青色の点)が他の場所(紫色の点)に移動することを示す。

私はビットマップを戻すためにいくつかの異なる方法を試しましたが、正しく動作するようにはできません。私は最初のビットマップサイズ、ImageViewサイズ、点線でマークされた距離を知っています。後で必要なシフトを計算してmatrix.postTranslate(-zoomshiftX, -zoomshiftY)を使用しようとしましたが、正しくシフトしません。

Matrix.postScale()関数の後に、その基礎となるビットマップのピクセル数が変わっていて、matrix.postTranslate(-zoomshiftX/zoom、-zoomshiftY/zoom)を試してみました。

どのようにズームを達成できますか?

scalling issue

+0

1時間aveは4引数matrix.postScale()を使用し、最後の2つの引数に対してView_width/2とView_height/2のようなものを入力することで、中心のズーミングを実現しました。この最後の2つの引数は、ビットマップのものではなく、Viewのピクセルを参照する可能性があります。 – wilkas

答えて

1

ズーム可能なのViewGroupを作成についてここで私の質問を見てみましょう。私は私の最終的な解決策からコードスニペットを説明しました、そして、それは役に立つかもしれません。

Extending RelativeLayout, and overriding dispatchDraw() to create a zoomable ViewGroup

+0

質問と回答の両方が私のリーグの両方です:/私はキャンバスを使用したり、スケーリングメソッドをオーバーライドしません。 – wilkas

0

多分これは参考にすることができ:

あなたが画面上で2本の指を持っている場合は、二本の指のイベントを取得し、中間点を取得できます。次に

PointF mid; 
MotionEvent event; 
float x = event.getX(0) - event.getX(1); 
float y = event.getY(0) - event.getY(1); 
mid.set(x/2, y/2); 

画面中央に中間点を持つスケーリングを設定することができます。

matrix.postScale(scale, scale, mid.x, mid.y); 
関連する問題