6

アプリケーションのインターフェースは、次の項目で構成されています。

  1. 画面いっぱいに広がるイメージスイッチャー。
  2. nextボタン。
  3. previousボタン。

pinch zoomingで を使用するにはどうすればよいimage Switcherですか?

4

1 に答える 1

0

ピンチ ズーム ジェスチャーの実装

ピンチ ズーム ジェスチャはドラッグ ジェスチャと似ていますが、2 本目の指を画面に押し付けたときに開始されます ( ACTION_POINTER_DOWN)。

ケース MotionEvent.ACTION_POINTER_DOWN:
oldDist = 間隔 (イベント);
Log.d(TAG, "oldDist=" + oldDist);
if (oldDist > 10f) {
savedMatrix.set(マトリックス);
midPoint(ミッド、イベント);
モード = ズーム;
Log.d(TAG, "mode=ZOOM" );
}
壊す;


ケース MotionEvent.ACTION_MOVE:
if (モード == ドラッグ) {
// ...
}
それ以外の場合 (モード == ZOOM) {
float newDist = 間隔(イベント);
Log.d(TAG, "newDist=" + newDist);
if (newDist > 10f) {
matrix.set(savedMatrix);
float スケール = newDist / oldDist;
matrix.postScale(スケール、スケール、mid.x、mid.y);
}
}
壊す;

2 本目の指のダウン イベントを取得すると、2 本の指の間の距離を計算して記憶します。私のテストでは、Android は 2 本の指がほぼ同じ位置で押されていると (誤って) 教えてくれることがありました。そのため、距離が任意のピクセル数よりも小さい場合にイベントを無視するチェックを追加しました。それより大きい場合は、現在の変換行列を記憶し、2 本の指の中点を計算して、ズームを開始します。

ズーム モード中に移動イベントが到着すると、指の間の距離が再度計算されます。小さすぎる場合、イベントは無視されます。それ以外の場合は、変換マトリックスを復元し、画像を中間点でスケーリングします。

スケールは単に、新しい距離を古い距離で割った比率です。新しい距離が大きい場合 (つまり、指がさらに離れている場合)、スケールは 1 よりも大きくなり、イメージが大きくなります。小さい (指を近づける) 場合は、縮尺が 1 未満になり、画像が小さくなります。もちろん、すべてが同じであれば、スケールは 1 に等しく、イメージは変更されません。

次に、spacing() および midPoint() メソッドを定義しましょう。

2 点間の距離

2 本の指がどのくらい離れているかを調べるには、まず 2 つの点の差であるベクトル (x, y) を作成します。

次に、ユークリッド距離の式を使用して間隔を計算します。

プライベート フロート間隔(MotionEvent イベント) {
float x = event.getX(0) - event.getX(1);
float y = event.getY(0) - event.getY(1);
return FloatMath.sqrt(x * x + y * y);
}

ポイントの順序は重要ではありません。なぜなら、それらを 2 乗すると負の符号が失われるからです。すべての計算は Java の float 型を使用して行われることに注意してください。一部の Android デバイスには浮動小数点ハードウェアが搭載されていない場合がありますが、そのパフォーマンスを心配するほど頻繁にこれを行っているわけではありません。

2 点の中点

2 つの点の中間にある点を計算するのはさらに簡単です。

private void midPoint(PointF ポイント、MotionEvent イベント) {
float x = event.getX(0) + event.getX(1);
float y = event.getY(0) + event.getY(1);
point.set(x / 2, y / 2);
}

X 座標と Y 座標の平均を取るだけです。アプリケーションで顕著な一時停止を引き起こす可能性のあるガベージ コレクションを回避するために、毎回新しいオブジェクトを割り当てて返すのではなく、既存のオブジェクトを再利用して結果を格納します。お使いの携帯電話で今すぐプログラムを実行してみてください。画像を 1 本指でドラッグし、2 本指でピンチインまたはピンアウトしてズームします。最良の結果を得るには、指を 1 インチ以上離さないようにしてください。そうしないと、前述の API のバグのいくつかに遭遇し始めるでしょう。

これは、Pragmatic Bookshelf が発行する Android 第 3 版 Hello からの抜粋です。詳細について、またはペーパーバックまたは PDF コピーを購入するには、 http://www.pragprog.com/titles/eband3にアクセスしてください。

于 2012-12-19T10:31:55.947 に答える