2011-03-21 81 views

回答

43

請查看以下鏈接可以幫助您

最好的例子是在下面的鏈接,你可以重構,以滿足您的要求提供。

  1. implementing-the-pinch-zoom-gestur

  2. Android-pinch

  3. GestureDetector.SimpleOnGestureListener

+11

這個答案將是毫無價值的,一旦鏈接下去。至少引用相關部分。 – 2015-12-10 08:29:37

+2

僅供參考,此答案已過時。 [ScaleGestureDetector](https://developer.android.com/reference/android/view/ScaleGestureDetector.html)是API的縮放API的縮寫。見[伊曼紐爾的回答](http://stackoverflow.com/a/11722858/199364)。 – ToolmakerSteve 2016-10-20 17:08:27

14

我實現了一個捏放大爲我TextView,使用this教程。將得到的代碼是這樣的:

private GestureDetector gestureDetector; 
private View.OnTouchListener gestureListener; 

和的onCreate():

// Zoom handlers 
    gestureDetector = new GestureDetector(new MyGestureDetector()); 
    gestureListener = new View.OnTouchListener() { 

     // We can be in one of these 2 states 
     static final int NONE = 0; 
     static final int ZOOM = 1; 
     int mode = NONE; 

     static final int MIN_FONT_SIZE = 10; 
     static final int MAX_FONT_SIZE = 50; 

     float oldDist = 1f; 

     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      TextView textView = (TextView) findViewById(R.id.text); 

      switch (event.getAction() & MotionEvent.ACTION_MASK) { 
       case MotionEvent.ACTION_POINTER_DOWN: 
        oldDist = spacing(event); 
        Log.d(TAG, "oldDist=" + oldDist); 
        if (oldDist > 10f) { 
         mode = ZOOM; 
         Log.d(TAG, "mode=ZOOM"); 
        } 
        break; 
       case MotionEvent.ACTION_POINTER_UP: 
        mode = NONE; 
        break; 
       case MotionEvent.ACTION_MOVE: 
        if (mode == ZOOM) { 
         float newDist = spacing(event); 
         // If you want to tweak font scaling, this is the place to go. 
         if (newDist > 10f) { 
          float scale = newDist/oldDist; 

          if (scale > 1) { 
           scale = 1.1f; 
          } else if (scale < 1) { 
           scale = 0.95f; 
          } 

          float currentSize = textView.getTextSize() * scale; 
          if ((currentSize < MAX_FONT_SIZE && currentSize > MIN_FONT_SIZE) 
            ||(currentSize >= MAX_FONT_SIZE && scale < 1) 
            || (currentSize <= MIN_FONT_SIZE && scale > 1)) { 
           textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, currentSize); 
          } 
         } 
        } 
        break; 
       } 
      return false; 
     } 

魔術常量1.1和0.95中憑經驗選擇(使用scale變量爲此目的而我TextView的行爲種怪異)。

+5

我可以知道你的'MyGestureDetector()'類 – Praveenkumar 2012-01-28 11:12:27

+0

MyGestureDetector()請! – renanlf 2012-08-28 13:04:54

+1

@Renanlf這是一年多以前。對不起,我甚至不再爲Android編碼。我在任何地方也不會有這些資源。 – folone 2012-08-28 14:09:17

1

我已經創建了一個基本的擠夾項目即支持Android 2.1+

可用here

35

爲Android 2.2+(API level8)變焦,CA n使用ScaleGestureDetector。

你需要一個成員:

private ScaleGestureDetector mScaleDetector; 

在構造函數(或的onCreate())添加:

mScaleDetector = new ScaleGestureDetector(context, new OnScaleGestureListener() { 
    @Override 
    public void onScaleEnd(ScaleGestureDetector detector) { 
    } 
    @Override 
    public boolean onScaleBegin(ScaleGestureDetector detector) { 
     return true; 
    } 
    @Override 
    public boolean onScale(ScaleGestureDetector detector) { 
     Log.d(LOG_KEY, "zoom ongoing, scale: " + detector.getScaleFactor()); 
     return false; 
    } 
}); 

您覆蓋的onTouchEvent:

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    mScaleDetector.onTouchEvent(event); 
    return true; 
} 

如果您繪製在onScale()中手動查看,您可能將比例因子存儲在成員中,然後調用invalidate()並使用比例在你的onDraw()中繪製時的因素。 否則,您可以直接修改onScale()中的字體大小或類似的東西。

+1

[Android文檔 - 拖動和縮放](https://developer.android)中的其他信息。 com/training/gestures/scale.html)特別注意示例代碼,演示如何將平移(滾動)和縮放(縮放)結合起來。 – ToolmakerSteve 2016-10-20 17:12:55