2011-03-21 79 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