2

SurfaceViewを拡張するカスタムビューがあります。キャンバスに画像を描いています。ユーザーがキャンバス上のポイントに触れたときに、触れた座標の周囲の領域を拡大して表示したいと思います。そして、できれば、指が動き回るときに、それに応じて拡大ビューのコンテンツを更新したいと思います。

Androidプラットフォームがそのような機能をネイティブにサポートしているかどうか疑問に思いました。そうでない場合は、私を始めたり、それを実装する方法についてのアイデアを共有したりできる良い例を教えてもらえますか。私はこの種の2Dまたは3Dグラフィックスをあまり使用していませんが、CanvasクラスとMatrixクラスを理解して、何を使用できるかを確認しようとしています。

フォーラムで同様の質問を検索しましたが、見つかりませんでした。したがって、plsは、すでに存在する質問をするために私にフラグを立てません。

いいえ、私はOpenGL-ESやそのようなサードパーティのライブラリを(まだ)使用していません。

皆さんありがとう。

4

1 に答える 1

9

キャンバスに描画している画像をズームするには:

BitmapShader(描画している画像のビットマップを使用)、マトリックス、およびペイントを作成します。

shader = new BitmapShader(bmp, TileMode.CLAMP, TileMode.CLAMP);
matrix = new Matrix();
shaderPaint = new Paint();
shaderPaint.setShader(shader);

タッチイベントで、タッチ位置を記録します(たとえば、PointFで)。

zoomPos.x = event.getX();
zoomPos.y = event.getY();

...そしてシェーダーのマトリックスを設定します(これはタッチごとに行います。おそらくより良い方法があります):

matrix.reset();
matrix.postScale(2f, 2f);
matrix.postTranslate(-zoomPos.x, -zoomPos.y);
shader.setLocalMatrix(matrix);

次に、描画コードで、シェーダーペイントを使用して円を描画します。

canvas.drawCircle(zoomPos.x, zoomPos.y, size_of_the_circle, shaderPaint);

編集

2行:

matrix.postScale(2f, 2f);
matrix.postTranslate(-zoomPos.x, -zoomPos.y);

1つと置き換えることができます:

matrix.postScale(2f, 2f, zoomPos.x, zoomPos.y);

これにより、オフセットを壊すことなく倍率を変更できます。

于 2012-07-12T11:25:21.477 に答える