2014-01-28 137 views
4

我是新手在Android.I有跟隨這個問題,我成功地縮放圖像此代碼工作正常可以有人請幫我如何編寫縮放按鈕click.I我沒有得到如何實現這個任務按鈕上的「放大/縮小」圖像點擊Android?

這裏是我遵循Tutorial Zoom Image,也遵循「Salman's Ayub Answer

它的做工精細的教程,但我沒能在變焦適用比例因子和縮小圖像的

+0

您有興趣使用xml來完成這項工作嗎? – 2014-01-28 19:13:19

+0

沒有id nt想用xml我已經提到了我想通過定義比例尺來做的教程 – user3233280

+0

請檢查答案,謝謝。 –

回答

5

你需要這2種方法添加到您的TouchImageView類:

public void zoomIn() { 
    oldScale = saveScale; 

    if(saveScale<=maxScale) 
    { 
     saveScale += .5; 
     matrix.setScale(saveScale, saveScale); 
     setImageMatrix(matrix); 
     invalidate(); 

     // Center the image 
     // Center the image 
     if(bmHeight>bmWidth) 
     { 
     redundantXSpace = width - (saveScale * bmWidth); 
     redundantXSpace /= 2; 
     } 
     else 
     { 
      redundantYSpace = height - (saveScale * bmHeight) ; 
      redundantYSpace /= 2; 
     } 

     matrix.postTranslate(redundantXSpace , redundantYSpace); 
     setImageMatrix(matrix); 
     invalidate(); 
    } 
} 

public void zoomOut() { 

    if(saveScale>=minScale) 
    { 
     saveScale -= .5; 
     matrix.setScale(saveScale, saveScale); 
     setImageMatrix(matrix); 
     invalidate(); 

     // Center the image 
     if(bmHeight>bmWidth) 
     { 
     redundantXSpace = width - (saveScale * bmWidth); 
     redundantXSpace /= 2; 
     } 
     else 
     { 
      redundantYSpace = height - (saveScale * bmHeight) ; 
      redundantYSpace /= 2; 
     } 
     matrix.postTranslate(redundantXSpace , redundantYSpace); 
     setImageMatrix(matrix); 
     invalidate(); 
    } 
} 

下面是完整的TouchImageView類代碼,隨着這2種方法:

public class TouchImageView extends ImageView { 

public 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; 
static final int CLICK = 3; 
int mode = NONE; 
float oldScale = 1.0f; 

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

float redundantXSpace, redundantYSpace; 
float width, height; 
float saveScale = 1f; 
float right, bottom, origWidth, origHeight, bmWidth, bmHeight; 

ScaleGestureDetector mScaleDetector; 
Context context; 


public TouchImageView(Context context) { 

    super(context); 

    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) { 
      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_POINTER_DOWN: 
       last.set(event.getX(), event.getY()); 
       start.set(last); 
       mode = ZOOM; 
       break; 
      case MotionEvent.ACTION_MOVE: 
       if (mode == ZOOM || (mode == DRAG && saveScale > minScale)) { 
        Log.d("******", "ZOOM OR 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); 
       }else if(mode == DRAG && saveScale == minScale) { 
        Log.d("******", "DRAG"); 
       } 
       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); 
    bmWidth = bm.getWidth(); 
    bmHeight = bm.getHeight(); 
} 

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

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)Math.min(Math.max(.95f, detector.getScaleFactor()), 1.05); 
     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; 

    } 
} 

@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 TouchImageView(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
    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) { 
      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_POINTER_DOWN: 
       last.set(event.getX(), event.getY()); 
       start.set(last); 
       mode = ZOOM; 
       break; 
      case MotionEvent.ACTION_MOVE: 
       if (mode == ZOOM || (mode == DRAG && saveScale > minScale)) { 
        Log.d("******", "ZOOM OR 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); 
       }else if(mode == DRAG && saveScale == minScale) { 
        Log.d("******", "DRAG"); 
       } 
       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 
     } 

    }); 
} 

public TouchImageView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    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) { 
      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_POINTER_DOWN: 
       last.set(event.getX(), event.getY()); 
       start.set(last); 
       mode = ZOOM; 
       break; 
      case MotionEvent.ACTION_MOVE: 
       if (mode == ZOOM || (mode == DRAG && saveScale > minScale)) { 
        Log.d("******", "ZOOM OR 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); 
       }else if(mode == DRAG && saveScale == minScale) { 
        Log.d("******", "DRAG"); 
       } 
       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 
     } 

    }); 
} 

public void zoomIn() { 
    oldScale = saveScale; 

    if(saveScale<=maxScale) 
    { 
     saveScale += .5; 
     matrix.setScale(saveScale, saveScale); 
     setImageMatrix(matrix); 
     invalidate(); 

     // Center the image 
     // Center the image 
     if(bmHeight>bmWidth) 
     { 
     redundantXSpace = width - (saveScale * bmWidth); 
     redundantXSpace /= 2; 
     } 
     else 
     { 
      redundantYSpace = height - (saveScale * bmHeight) ; 
      redundantYSpace /= 2; 
     } 

     matrix.postTranslate(redundantXSpace , redundantYSpace); 
     setImageMatrix(matrix); 
     invalidate(); 
    } 
} 

public void zoomOut() { 

    if(saveScale>=minScale) 
    { 
     saveScale -= .5; 
     matrix.setScale(saveScale, saveScale); 
     setImageMatrix(matrix); 
     invalidate(); 

     // Center the image 
     if(bmHeight>bmWidth) 
     { 
     redundantXSpace = width - (saveScale * bmWidth); 
     redundantXSpace /= 2; 
     } 
     else 
     { 
      redundantYSpace = height - (saveScale * bmHeight) ; 
      redundantYSpace /= 2; 
     } 
     matrix.postTranslate(redundantXSpace , redundantYSpace); 
     setImageMatrix(matrix); 
     invalidate(); 
    } 
} 
} 

這裏如何可以在zoomIn/zoomOut按鈕中使用它們:

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.LAYOUT_NAME); 

    Button zoonIn = (Button)findViewById(R.id.ZOOM_IN_BUTTON_ID); 
    Button zoonOut = (Button)findViewById(R.id.ZOOM_OUT_BUTTON_ID); 

    final TouchImageView touch = (TouchImageView)findViewById(R.id.YOUR_TOUCH_IMAGE_VIEW_)ID); 

    Bitmap bImage = BitmapFactory.decodeResource(this.getResources(), R.drawable.DRAWABLE_ID); 

    touch.setImageBitmap(bImage); 

    touch.setMaxZoom(4f); //change the max level of zoom, default is 3f 


    zoonIn.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      touch.zoomIn(); 
     } 
    }); 


    zoonOut.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      touch.zoomOut(); 
     } 
    }); 

} 

我希望這會有所幫助。

+0

可以請你幫我我想修復頁眉和頁腳,而我需要在滾動視圖中放置「ImageView」我已經完成了這項工作,但有時候我的imageview太短,頁腳消失 – user3233280

+0

這是我的XML可以ü請按順序編輯以更清楚地顯示圖像,但頁眉和頁腳應該固定 – user3233280

+0

https://dl.dropboxusercontent.com/u/86719018/frame.xml – user3233280

2

最簡單的方式來放大/按鈕上的圖像,將顯示在webView中,然後您可以使用webView提供的所有功能。

複製你的形象資產的文件夾,然後加載它的onCreate:

WebView mWebView = (WebView) findViewById(R.id.webView1); 
mWebView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY); 
mWebView.setBackgroundColor(Color.parseColor("#ffffff")); 
mWebView.loadUrl("file:///android_asset/image.png"); 
mWebView.getSettings().setBuiltInZoomControls(true); 
mWebView.setInitialScale(50); 
+0

如何最大和最小縮放級別> – user3233280

+0

通過使用webView支持的內置( -/+)縮放控制器。這裏是一個例子: [link](http://xjaphx.files.wordpress.com/2011/09/webview2image_01.png)。 或者如果您要設置初始縮放級別,請使用以下方法: mWebView.setInitialScale(50);輸入值在0 - 100(%)之間的 。 – Mohammed

+0

它絕對有效,所以我投了票,但注意與在ImageView中顯示圖像的一些區別:1)ImageView中的圖像自動調整大小以適合視圖的大小,以及2)有簡單的選項可將圖像居中一個ImageView。 –

1

嘗試使用PhotoView。我認爲它可以滿足您的需求。

+0

這是一個不錯的圖書館,感謝分享。 –