1

我需要实现缩放、平移,然后将 ImageView 重置为原始比例/位置。我使用 view.setImageMatrix(matrix) 在 FrameLayout 中执行缩放和移动。到目前为止完美运行。为了恢复到原始布局,我尝试保存原始矩阵并重置它,它不起作用,我有点卡住了。感谢任何建议或提示!

以下是我当前的代码:

  • ViewPager 包含每个图像的片段

<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 回答
0

我知道这很旧,但这是我的答案。

1-)开始imageView的矩阵onCreate方法

2-) 并将 ACTION_POINTER 和 ACTION_POINTER_UP 方法更改为这些

       --- case MotionEvent.ACTION_UP: // first finger lifted
               mode = NONE;
               break;
           case MotionEvent.ACTION_POINTER_UP:// second finger lifted
               fingerLifted();
               matrix.set(startedMatrix);
               view.setScaleType(ImageView.ScaleType.MATRIX);
               mode = NONE;
               Log.d(TAG, "mode=NONE");
               break;

我希望这将有所帮助。

于 2019-05-28T08:49:35.130 回答
-1

根据我的研究......将 ImageView 重置为原始比例/位置尝试这个非常简单的代码......只要把这个

setCotentView(R.layout.activity_image);

这将从一开始就重置您的 ImageView :) 并且它将起作用。

于 2014-08-14T08:54:55.757 回答
-1

原来的 imageView Matrix 不就是一个单位矩阵吗?

imageView.setImageMatrix(new Matrix());-- 这将是一个没有平移/缩放/等的矩阵,也就是默认/原始矩阵

于 2013-09-23T19:26:55.003 回答