19

我想讓用戶觸摸圖像,然後基本上一個圓形放大鏡會顯示,這將允許用戶更好地選擇圖像上的某個區域。當用戶釋放觸摸時,放大的部分將消失。這用於幾個照片編輯應用程序,我試圖實現我自己的版本。下面的代碼確實放大了圖像視圖的圓形部分,但是一旦鬆開手指就不會刪除或清除縮放。我目前使用canvas = new Canvas(bitMap);將位圖設置爲畫布,然後使用takenPhoto.setImageBitmap(bitMap);設置圖像視圖。我不確定我是否以正確的方式進行操作。 onTouch代碼如下:Android - 如何循環縮放/放大圖像的一部分?

zoomPos = new PointF(0,0); 
     takenPhoto.setOnTouchListener(new OnTouchListener() { 

      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       int action = event.getAction(); 
        switch (action) { 
         case MotionEvent.ACTION_DOWN: 
          zoomPos.x = event.getX(); 
          zoomPos.y = event.getY(); 
          matrix.reset(); 
          matrix.postScale(2f, 2f, zoomPos.x, zoomPos.y); 
          shader.setLocalMatrix(matrix); 
          canvas.drawCircle(zoomPos.x, zoomPos.y, 20, shaderPaint); 
          takenPhoto.invalidate(); 
          break; 
         case MotionEvent.ACTION_MOVE: 
          zoomPos.x = event.getX(); 
          zoomPos.y = event.getY(); 
          matrix.reset(); 
          matrix.postScale(2f, 2f, zoomPos.x, zoomPos.y); 
          canvas.drawCircle(zoomPos.x, zoomPos.y, 20, shaderPaint); 
          takenPhoto.invalidate(); 
          break; 
         case MotionEvent.ACTION_UP: 
          //clear zoom here? 

          break; 
         case MotionEvent.ACTION_CANCEL: 
          break; 
         default: 
          break; 
      } 
        return true; 
      } 
      }); 
+0

我不知道我的理解對不對,但你問如何清除變焦效果在圖像上?爲什麼不將原始圖像保存在單獨的位圖中。當用戶使用縮放並且是時候擺脫放大鏡效果時,請使用原始位圖並在畫布上重新繪製它,從而使用縮放來擦除圖像。 –

+0

不,我沒有得到imageview的放大圓。你會在代碼工作的地方分享更多或上課的內容嗎? –

+0

我也有需要放大圖像在畫廊中心的透明覆蓋幀,以便哪些圖像經過,得到放大,請建議 – Ravi

回答

16

調整您的代碼,我能夠得到以下方法工作。

在onTouch功能,設置一個全球性的點確定在用戶觸摸,並設置一個布爾值,表明變焦當前是否激活與否:

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

    int action = event.getAction(); 

    zoomPos.x = event.getX(); 
    zoomPos.y = event.getY(); 

    switch (action) { 
    case MotionEvent.ACTION_DOWN: 
    case MotionEvent.ACTION_MOVE: 
     zooming = true; 
     this.invalidate(); 
     break; 
    case MotionEvent.ACTION_UP: 
    case MotionEvent.ACTION_CANCEL: 
     zooming = false; 
     this.invalidate(); 
     break; 

    default: 
     break; 
    } 

    return true; 
} 

然後,在的onDraw方法,你使用您的代碼用於繪製部在縮放:

@Override 
protected void onDraw(Canvas canvas) { 

    super.onDraw(canvas); 

    if (zooming) { 
     matrix.reset(); 
     matrix.postScale(2f, 2f, zoomPos.x, zoomPos.y); 
     mPaint.getShader().setLocalMatrix(matrix); 

     canvas.drawCircle(zoomPos.x, zoomPos.y, 100, mPaint); 
    } 
} 

注意,對於着色器中,我使用如所描述的here位圖着色器,將其用創建:

mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.image); 
mShader = new BitmapShader(mBitmap, TileMode.CLAMP, TileMode.CLAMP); 

mPaint = new Paint(); 
mPaint.setShader(mShader); 
+0

嘿謝謝人,這絕對有幫助 –

+0

@qzikl,請你能詳細說明一些?或者如果你可以寫在哪裏聲明onDraw方法和什麼是矩陣在這裏? –

+0

嘿感謝上述code.Is有什麼辦法來顯示放大的縮放視圖在一些固定位置? –

6

恢復對圖像所做的任何更改的最佳方法是從源文件重新加載圖像。或者,在MotionEvent.ACTION_UP加載原始矩陣期間,在變換開始之前保留副本原始矩陣變量。

0

您可以使用自定義的imageview實現它,在您的包中創建一個類CodesforMagnifierImageView.java。您可以在​​看到各個類的代碼,只需使用下面的代碼在你的佈局文件,而不是爲ImageView的

<com.yourpackage.CodesforMagnifierImageView 
    android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:src="@drawable/your image" />