-1

ズームオプションを備えた単一のレイアウトで2つのイメージビューが必要なプロジェクトを行っています。AFAIK androidを使用すると、1つのビューで簡単にズームできます。しかし、私の問題はそのようなものではありません。2つの画像ビューが重なり合っています。フレームレイアウトでやってみました。しかし、結果はそれほど良くありません。レイアウトの範囲外になると画像が縮小し、ズームがそれほどスムーズになりません。非推奨のAbsoluteレイアウトでそれを実行しようとしましたが、機能しません。すべての提案を歓迎します。

私のコードはここにあります

  int x = (int)event.getRawX();
     int y = (int)event.getRawY();
         ImageView view = (ImageView) v;

         switch (event.getAction() & MotionEvent.ACTION_MASK) {
          case MotionEvent.ACTION_DOWN:
             savedMatrix.set(matrix);
             start.set(event.getX(), event.getY());

             mode = DRAG;
           hoffset = x - v.getLeft();
       voffset = y - v.getTop();
             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;
          case MotionEvent.ACTION_UP:
            // moveView(v, x - hoffset, y - voffset);
          case MotionEvent.ACTION_POINTER_UP:
             mode = NONE;

             Log.d(TAG, "mode=NONE");
             break;
          case MotionEvent.ACTION_MOVE:
             if (mode == DRAG) {
                 moveView(v, x - hoffset, y - voffset);
                hrecent = x;
                vrecent = y;
             }
             else if (mode == ZOOM) {


                newDist = spacing(event);
                if (newDist > 10f) {

                   matrix.set(savedMatrix);

                   float scale = newDist / oldDist;
         matrix.postScale(ScaleFactorForZoom, ScaleFactorForZoom, mid.x, mid.y);



               float delta =10.0f+ (newDist -oldDist)/oldDist;
           // view.setImageMatrix(matrix);    
                 float newHeight;
                 float newWidth;


        newHeight=(float) ((delta)+view.getHeight());
        newWidth=(float) ((delta)+view.getWidth());

                    oldDist = newDist; 



                 zoomView(view, newWidth, newHeight);

                }
             }
             break;
          }



          return true; 
    }

MoveView関数は

     public void moveView(View v, int x, int y)
       {
         ViewGroup.LayoutParams params = v.getLayoutParams();
         if (params instanceof FrameLayout.LayoutParams)
         {
           FrameLayout.LayoutParams par = (FrameLayout.LayoutParams)params;
          View parent = (View)(v.getParent());
           x = Math.min(x, parent.getWidth());
           x = Math.max(x, 0);
           y = Math.min(y, parent.getHeight());
           y = Math.max(y, 0);


          par.leftMargin=x;
          par.topMargin=y;
           v.setLayoutParams(par);
       }
   }

ズーム機能はこちら

public void zoomView(View v, float width, float height)
   {
       ViewGroup.LayoutParams params = v.getLayoutParams();
       if (params instanceof FrameLayout.LayoutParams)
       {
           FrameLayout.LayoutParams par = (FrameLayout.LayoutParams)params;
           par.width = (int)width;
           par.height = (int)height;

           v.setLayoutParams(par);


       }
   }
4

2 に答える 2

0

フレームレイアウトの上に2つの画像ビューを配置し、フレームレイアウトのタッチイベントを記述し、ズームするビューを選択してその画像のマトリックスを設定するための2つのボタンを配置しました。

于 2011-12-15T04:47:23.133 に答える
0

par.width = (int) width は、デフォルトでは常にフォールトによって小数部分が切り捨てられるため使用しないでください。代わりに par.width = Math.round (Width) を使用し、場合によってはデフォルト値に戻すメカニズムを考えてください。 .

于 2014-05-05T13:36:00.053 に答える