5

ピンチズームを実際に実装することについてはたくさんのスレッドがあることを私は知っています-しかし、私はすでにこれまでに到達しました。

SimpleScaleGestureListenerを使用してピンチを処理しています。画像の高さを画面サイズと同じに保つよりも遠くにズームアウトできないようにすることができました(したがって、画像の高さは常に少なくとも使用可能な画面サイズの高さになります)。

ただし、画像がこれらの境界の外側にパンされているかどうかを自動的に検出する方法を探しています。画像を表示する標準のAndroidの方法と同じように。したがって、ズームインして画像を上にパンしてからズームアウトすると、画像の下部が画面の下部に到達したことを検出し、それに応じてズームの「ピボット」が調整されるため、「画像自体の上または下の「空白」。誰か助けてもらえますか?

参考までに、これが私のonScaleメソッドとonDrawメソッドです。

public boolean onScale(ScaleGestureDetector detector){
    float minScale = (float) ((float) SCREEN_SIZE.y / (float) DRAWABLE_SIZE.y);
    mScaleFactor *= detector.getScaleFactor();
    mScaleFactor = Math.max(minScale, Math.min(mScaleFactor, 5.0f));
    invalidate();
    return true;
}

protected void onDraw(Canvas canvas) {
    canvas.save();
    canvas.drawColor(Color.DKGRAY);
    canvas.translate(mPosX, mPosY);
    canvas.scale(mScaleFactor, mScaleFactor, getDrawable().getIntrinsicWidth() / 2,
    getDrawable().getIntrinsicHeight() / 2);

    this.getDrawable().draw(canvas);
    canvas.restore();
}
4

2 に答える 2

3

android.graphics.Matrixを使用して、描画されたビットマップを変換できます。マトリックスには、スケールと平行移動の両方が含まれています。

マトリックスをcanvasに適用するだけです:canvas.setMatrix

目的の長方形の画面への適合度を簡単に計算できます。

Matrix.setRectToRect

ここで、sourceは、画像(ビットマップ)の実際の解像度の長方形で、左/上が0,0、右下が幅/高さです。dstは、ビットマップが描画されるターゲットビューの長方形です。

次に、タスクを解決することもできます。つまり、画像の境界線が描画される場所を知ることができます。Matrix.mapRectは、ビットマップの長方形(前述のとおり)が画面の座標で画面のどこに表示されるかを計算します。次に、画像の左側が画面の左側に対して描画される場所を単純に指定できます。これは、上/右/下でも同じです。

私はあなたにコードを与えるつもりはありません、ただどちらに行くべきかについてのヒントです。最近、ピンチズーム、画面に合わせる、アニメーション化されたトランジションなどを使用して画像ビューアをコーディングしました。すべて、Matrixとその操作を使用して行われました。

于 2011-09-27T11:58:11.730 に答える
2

簡単な解決策は、このウィジェットを使用することです

http://blog.sephiroth.it/2011/04/04/imageview-zoom-and-scroll/

于 2011-09-27T11:29:08.397 に答える