1

ズーム、パンを実装してから、ImageView を元のスケール/位置にリセットする必要があります。View.setImageMatrix(matrix) を使用して、FrameLayout でズームと移動を実行します。これまでのところ完全に機能します。元のレイアウトに復元するために、元のマトリックスを保存してリセットしようとしましたが、機能せず、ちょっと立ち往生しています。提案やヒントをいただければ幸いです。

以下は私の現在のコードです:

  • ViewPager には Image ごとにフラグメントが含まれます

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <android.support.v4.view.ViewPager
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/pager"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</FrameLayout>
  • フラグメントには ImageView が含まれています

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ImageView
        android:id="@+id/ivPage"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_gravity="center"
        android:scaleType="matrix"
        android:src="@drawable/catalogue_test" />
</FrameLayout>
  • Java コードは、実際にはチュートリアル ページのオリジナルである、ズームとパンの動作を正常に行います。

@Override
public boolean onTouch(View v, MotionEvent event) {

      ImageView view = (ImageView) v;

      switch (event.getAction() & MotionEvent.ACTION_MASK) {
      case MotionEvent.ACTION_DOWN:
         Log.d(tag, "ACTION_DOWN");
         isDoubleTap = false;

         savedMatrix.set(matrix);
         start.set(event.getX(), event.getY());
         Log.d(tag, "mode=DRAG");
         mode = DRAG;
         break;
      case MotionEvent.ACTION_UP:
      case MotionEvent.ACTION_POINTER_UP:
         Log.d(tag, "ACTION_POINTER_UP");
         mode = NONE;
         Log.d(tag, "mode=NONE");
         break;
      case MotionEvent.ACTION_MOVE:
         Log.d(tag, "ACTION_MOVE");
         if (mode == DRAG) {
            matrix.set(savedMatrix);
            matrix.postTranslate(event.getX() - start.x, event.getY() - start.y);
         } else if (mode == ZOOM) {
            double newDist = spacing(event);
            Log.d(tag, "newDist=" + newDist);
            if (newDist > 10f) {
               matrix.set(savedMatrix);
               float scale = (float) (newDist / oldDist);
               matrix.postScale(scale, scale, mid.x, mid.y);
            }
         }

         if(isDoubleTap == false) {
            view.setImageMatrix(matrix);
            Log.d(tag, String.format("(%d, %d) - scale(%f, %f) xy(%f, %f)", view.getTop(), view.getLeft(),  view.getScaleX(), view.getScaleY(), view.getX(), view.getY()));
         }

         break;

      case MotionEvent.ACTION_POINTER_DOWN:
         oldDist = spacing(event);
         Log.d(tag, "oldDist=" + oldDist);
         if (oldDist > 10f) {
            savedMatrix.set(matrix);
            midPoint(mid, event);
            mode = ZOOM;
            Log.d(tag, "mode=ZOOM");
         }
         break;
      }

      gestureDetector.onTouchEvent(event);
      return true; // indicate event was handled
   }
4

4 に答える 4

0

setImageMatrix(new Matrix()) メソッドには運がありませんでしたが、スケールタイプを設定してからリセットするとうまくいきました。

setScaleType(ScaleType.CENTER_CROP); 
setScaleType(ScaleType.MATRIX);
于 2013-10-03T21:45:10.450 に答える
-1

私の調査に基づいて... ImageViewを元のスケール/位置にリセットするには、この非常に単純なコードを試してください...これを入れるだけです

setCotentView(R.layout.activity_image);

これにより、ImageViewが最初からリセットされます:)、動作します。

于 2014-08-14T08:54:55.757 に答える
-1

元の imageView マトリックスは単なる恒等マトリックスではありませんか?

imageView.setImageMatrix(new Matrix());-- これは、変換/スケール/その他のないマトリックス、つまりデフォルト/元のマトリックスになります。

于 2013-09-23T19:26:55.003 に答える