2011-05-12 94 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); 

    } 
....