2011-05-12 96 views
3

我想实现多点触摸放大和缩小功能,我的申请。我的应用程序是查看图像的幻灯片。我试图执行从链路多点触控缩放功能如下http://www.zdnet.com/blog/burnette/how-to-use-multi-touch-in-android-2-part-6-implementing-the-pinch-zoom-gesture/1847,它实际上是一个很好的人,但我需要控制在放大和缩小。即我想实现变焦的最大和最小限制。任何人都可以帮助我解决这个问题。同时也要提前感谢解决这个问题。Android的多点触摸缩放

回答

9

在我的搜索和编码变焦ImageView的我遇到了一个小工具,精确地图库应用程序缩放功能,其易于使用的复制。虽然我设计我自己的缩放Iamgeview但后来我发现它不是。一个好的东西重新发明下面的轮子是链接

礼貌:亚历山德罗Crugnola

http://blog.sephiroth.it/2011/04/04/imageview-zoom-and-scroll/

+0

感谢您的支持和卓越的工作。再次感谢TOXIC .. – Basil 2011-05-13 14:04:36

5

当然,你需要改变这一部分:

else if (mode == ZOOM) { 
     float newDist = spacing(event); 
     Log.d(TAG, "newDist=" + newDist); 
     if (newDist > 10f) { 
     matrix.set(savedMatrix); 
     float scale = newDist/oldDist; 
     matrix.postScale(scale, scale, mid.x, mid.y); 
     } 
} 

else if (mode == ZOOM) { 
     float newDist = spacing(event); 
     Log.d(TAG, "newDist=" + newDist); 
     if (newDist > 10f) { 
     matrix.set(savedMatrix); 
     float scale = newDist/oldDist; 

     // check scale is not too big or two small 
     float newScale = scale*mCurrentScale; 
     if (newScale > 10) { 
      return false; 
     } else if (newScale < 0.1) { 
      return false; 
     } 
     mCurrentScale = newScale; 

     matrix.postScale(scale, scale, mid.x, mid.y); 
     } 
} 

,并添加变量mCurrentScale你的活动要记住目前的规模,像这样:

public class Touch extends Activity implements OnTouchListener { 
    // These matrices will be used to move and zoom image 
    Matrix matrix = new Matrix(); 
    Matrix savedMatrix = new Matrix(); 

    // this is the new variable added 
    float mCurrentScale = 1.0f; 

...

+0

另外,我建议你卢克和记黄埔的MultiTouchController,它可以在2.1,并支持复杂的手势像拖动缩放。 – 2011-05-12 12:01:30

+0

谢谢你的回复。这只适用于第一次,当我们执行一些大规模的变化时,我们失去了对图像的控制,它变得太小,然后变得太难以放大。感谢您查看和回复这篇文章。 – Basil 2011-05-13 13:59:16

+0

你是什么意思,它只是第一次工作? – 2011-05-13 14:01:18

1

这解决了问题的我。在图像放大/缩小到极限之后,它会停止进一步。它也很流畅,没有滞后。 0.7和2.0是最小和最大缩放级别。

.... 
} else if (mode == ZOOM) { 
    float[] f = new float[9]; 

    float newDist = spacing(event); 
    if (newDist > 10f) { 
      matrix.set(savedMatrix); 
      float tScale = newDist/dist; 
      matrix.postScale(tScale, tScale, mid.x, mid.y); 
    } 

    matrix.getValues(f); 
    float scaleX = f[Matrix.MSCALE_X]; 
    float scaleY = f[Matrix.MSCALE_Y]; 

    if(scaleX <= 0.7f) 
      matrix.postScale((0.7f)/scaleX, (0.7f)/scaleY, mid.x, mid.y); 
    else if(scaleX >= 2.5f) 
      matrix.postScale((2.5f)/scaleX, (2.5f)/scaleY, mid.x, mid.y); 

    } 
....