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" />