0

문제가 있습니다. 여기에서 TouchImageView 코드를 사용했습니다 - https://github.com/MikeOrtiz/TouchImageView. 필자는 이중 탭 기능을 구현했습니다. 그것은 잘 작동하지만 지금은 확대 할 때 내 이미지를 드래그 할 수 없습니다. 제스처 (핀치 확대/축소)로 확대/축소가 잘 작동, 그냥 확대 된 이미지를 탐색 할 수 없습니다. 나는 이유를 모른다. 실제 코드는 다음과 같습니다.TouchImageView로 두 번 누르기 구현 - 이제 그림을 드래그하면 작동하지 않습니다.

 package com.example.testy; 

    import android.content.Context; 
    import android.graphics.Bitmap; 
    import android.graphics.Matrix; 
    import android.graphics.PointF; 
    import android.util.AttributeSet; 
    import android.view.GestureDetector; 
    import android.view.GestureDetector.SimpleOnGestureListener; 
    import android.view.MotionEvent; 
    import android.view.ScaleGestureDetector; 
    import android.view.View; 
    import android.widget.ImageView; 

    public class TouchImageView extends ImageView { 

     Matrix matrix = new Matrix(); 

     // We can be in one of these 3 states 
     static final int NONE = 0; 
     static final int DRAG = 1; 
     static final int ZOOM = 2; 
     int mode = NONE; 

     // Remember some things for zooming 
     PointF last = new PointF(); 
     PointF start = new PointF(); 
     float minScale = 1f; 
     float maxScale = 3f; 
     float[] m; 

     float redundantXSpace, redundantYSpace; 

     float width, height; 
     static final int CLICK = 3; 
     float saveScale = 1f; 
     float right, bottom, origWidth, origHeight, bmWidth, bmHeight; 

     ScaleGestureDetector mScaleDetector; 
     GestureDetector gestureDetector; 
     Context context; 

     public TouchImageView(Context context) { 
      super(context); 
      sharedConstructing(context); 
     } 

     public TouchImageView(Context context, AttributeSet attrs) { 
      super(context, attrs); 
      sharedConstructing(context); 
     } 

     private void sharedConstructing(Context context) { 
      gestureDetector = new GestureDetector(new DoubleTapGestureListener()); 
      super.setClickable(true); 
      this.context = context; 
      mScaleDetector = new ScaleGestureDetector(context, new ScaleListener()); 
      matrix.setTranslate(1f, 1f); 
      m = new float[9]; 
      setImageMatrix(matrix); 
      setScaleType(ScaleType.MATRIX); 

      setOnTouchListener(new OnTouchListener() { 

       @Override 
       public boolean onTouch(View v, MotionEvent event) { 
        if (gestureDetector.onTouchEvent(event)) { 
         return true; // podwojne klikniecie i koniec imprezy 
        } 
        mScaleDetector.onTouchEvent(event); 

        matrix.getValues(m); 
        float x = m[Matrix.MTRANS_X]; 
        float y = m[Matrix.MTRANS_Y]; 
        PointF curr = new PointF(event.getX(), event.getY()); 

        switch (event.getAction()) { 
        case MotionEvent.ACTION_DOWN: 
         last.set(event.getX(), event.getY()); 
         start.set(last); 
         mode = DRAG; 
         break; 
        case MotionEvent.ACTION_MOVE: 
         if (mode == DRAG) { 
          float deltaX = curr.x - last.x; 
          float deltaY = curr.y - last.y; 
          float scaleWidth = Math.round(origWidth * saveScale); 
          float scaleHeight = Math.round(origHeight * saveScale); 
          if (scaleWidth < width) { 
           deltaX = 0; 
           if (y + deltaY > 0) 
            deltaY = -y; 
           else if (y + deltaY < -bottom) 
            deltaY = -(y + bottom); 

          } else if (scaleHeight < height) { 
           deltaY = 0; 
           if (x + deltaX > 0) 
            deltaX = -x; 
           else if (x + deltaX < -right) 
            deltaX = -(x + right); 

          } else { 
           if (x + deltaX > 0) 
            deltaX = -x; 
           else if (x + deltaX < -right) 
            deltaX = -(x + right); 

           if (y + deltaY > 0) 
            deltaY = -y; 
           else if (y + deltaY < -bottom) 
            deltaY = -(y + bottom); 

          } 
          matrix.postTranslate(deltaX, deltaY); 
          last.set(curr.x, curr.y); 
         } 
         break; 

        case MotionEvent.ACTION_UP: 
         mode = NONE; 
         int xDiff = (int) Math.abs(curr.x - start.x); 
         int yDiff = (int) Math.abs(curr.y - start.y); 
         if (xDiff < CLICK && yDiff < CLICK) 
          performClick(); 
         break; 

        case MotionEvent.ACTION_POINTER_UP: 
         mode = NONE; 
         break; 
        } 
        setImageMatrix(matrix); 
        invalidate(); 
        return true; // indicate event was handled 
       } 

      }); 
     } 

     @Override 
     public void setImageBitmap(Bitmap bm) { 
      super.setImageBitmap(bm); 
      if (bm != null) { 
       bmWidth = bm.getWidth(); 
       bmHeight = bm.getHeight(); 
      } 
     } 

     public void setMaxZoom(float x) { 
      maxScale = x; 
     } 

     public boolean canScrollHorizontally(int direction) { //used to cooparate with ViewPager 
      matrix.getValues(m); 
      float x = Math.abs(m[Matrix.MTRANS_X]); 
      float scaleWidth = Math.round(origWidth * saveScale); 

      if (scaleWidth < width) { 
       return false; 

      } else { 
       if (x - direction <= 0) 
        return false; // reach left edge 
       else if (x + width - direction >= scaleWidth) 
        return false; // reach right edge 

       return true; 
      } 
     } 

     @Override 
     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
      super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
      width = MeasureSpec.getSize(widthMeasureSpec); 
      height = MeasureSpec.getSize(heightMeasureSpec); 
      // Fit to screen. 
      float scale; 
      float scaleX = width/bmWidth; 
      float scaleY = height/bmHeight; 
      scale = Math.min(scaleX, scaleY); 
      matrix.setScale(scale, scale); 
      setImageMatrix(matrix); 
      saveScale = 1f; 

      // Center the image 
      redundantYSpace = height - (scale * bmHeight); 
      redundantXSpace = width - (scale * bmWidth); 
      redundantYSpace /= 2; 
      redundantXSpace /= 2; 

      matrix.postTranslate(redundantXSpace, redundantYSpace); 

      origWidth = width - 2 * redundantXSpace; 
      origHeight = height - 2 * redundantYSpace; 
      right = width * saveScale - width - (2 * redundantXSpace * saveScale); 
      bottom = height * saveScale - height 
        - (2 * redundantYSpace * saveScale); 
      setImageMatrix(matrix); 
     } 

     public boolean isZoomed() { 
      return saveScale > minScale; 
     } 

     public void zoomIn() { 

      System.out.println("Zoom in!"); 

      saveScale = maxScale; 
      matrix.setScale(saveScale, saveScale); 
      setImageMatrix(matrix); 
      invalidate(); 
     } 

     public void zoomOut() { 

      saveScale = minScale; 
      matrix.setScale(saveScale, saveScale); 
      setImageMatrix(matrix); 
      invalidate(); 

      System.out.println("Zoom out!"); 
     } 

     private class DoubleTapGestureListener extends SimpleOnGestureListener { 

      @Override 
      public boolean onDown(MotionEvent e) { 
       return true; 
      } 

      // event when double tap occurs 
      @Override 
      public boolean onDoubleTap(MotionEvent e) { 
       float x = e.getX(); 
       float y = e.getY(); 

       if (isZoomed()) { 
        zoomOut(); 
       } else { 
        zoomIn(); 
       } 
       return true; 
      } 

     } 

     private class ScaleListener extends 
       ScaleGestureDetector.SimpleOnScaleGestureListener { 
      @Override 
      public boolean onScaleBegin(ScaleGestureDetector detector) { 
       mode = ZOOM; 
       return true; 

      } 

      @Override 
      public boolean onScale(ScaleGestureDetector detector) { 
       float mScaleFactor = detector.getScaleFactor(); 
       float origScale = saveScale; 
       saveScale *= mScaleFactor; 
       if (saveScale > maxScale) { 
        saveScale = maxScale; 
        mScaleFactor = maxScale/origScale; 
       } else if (saveScale < minScale) { 
        saveScale = minScale; 
        mScaleFactor = minScale/origScale; 
       } 
       right = width * saveScale - width 
         - (2 * redundantXSpace * saveScale); 
       bottom = height * saveScale - height 
         - (2 * redundantYSpace * saveScale); 
       if (origWidth * saveScale <= width 
         || origHeight * saveScale <= height) { 
        matrix.postScale(mScaleFactor, mScaleFactor, width/2, 
          height/2); 
        if (mScaleFactor < 1) { 
         matrix.getValues(m); 
         float x = m[Matrix.MTRANS_X]; 
         float y = m[Matrix.MTRANS_Y]; 
         if (mScaleFactor < 1) { 
          if (Math.round(origWidth * saveScale) < width) { 
           if (y < -bottom) 
            matrix.postTranslate(0, -(y + bottom)); 
           else if (y > 0) 
            matrix.postTranslate(0, -y); 
          } else { 
           if (x < -right) 
            matrix.postTranslate(-(x + right), 0); 
           else if (x > 0) 
            matrix.postTranslate(-x, 0); 
          } 
         } 
        } 
       } else { 
        matrix.postScale(mScaleFactor, mScaleFactor, 
          detector.getFocusX(), detector.getFocusY()); 
        matrix.getValues(m); 
        float x = m[Matrix.MTRANS_X]; 
        float y = m[Matrix.MTRANS_Y]; 
        if (mScaleFactor < 1) { 
         if (x < -right) 
          matrix.postTranslate(-(x + right), 0); 
         else if (x > 0) 
          matrix.postTranslate(-x, 0); 
         if (y < -bottom) 
          matrix.postTranslate(0, -(y + bottom)); 
         else if (y > 0) 
          matrix.postTranslate(0, -y); 
        } 
       } 
       return true; 

      } 
    } 
} 

무엇이 잘못 될 수 있습니까?

감사합니다.

+0

아이디어가 있으십니까? – michalsol

답변

1

동일한 문제가있었습니다. 여기 내가 한 일이있다.

  1. 선언 (당신이했던 것처럼) 상단에있는 감지기 모두 (당신이했던 것처럼) sharedConstructing (...) 변수

    mScaleDetector = new ScaleGestureDetector(context, new ScaleListener());  
    mDoubleTapDetector = new GestureDetector(context, new DoubleTapListener()); 
    

    ScaleGestureDetector mScaleDetector;  
    GestureDetector mDoubleTapDetector; 
    
  2. 인스턴스화 참고 : GestureDetector에 대한 컨텍스트도 제공하십시오.

  3. onTouch (...)에서는 다음 코드를 먼저 작성하십시오.

    boolean result = mScaleDetector.onTouchEvent(event);     
    // result is always true here, so we need another way to check scalling gesture progress.   
    boolean isScaling = result = mScaleDetector.isInProgress(); 
    if (!isScaling) { 
        // if no scaling is performed check for other gestures (fling, long tab, etc.) 
        mDoubleTapDetector.onTouchEvent(event); 
    } 
    
  4. 다른 개인 클래스 DoubleTapListener (...)

    private class DoubleTapListener extends GestureDetector.SimpleOnGestureListener{ 
        @Override 
        public boolean onDoubleTap(MotionEvent e) { 
        Log.e(TAG,"onDoubleTap"); 
        return super.onDoubleTap(e); 
        }    
    } 
    
    그것 뿐이다

를 추가합니다. 나는 이것이 당신을 돕기를 바랍니다.