使用ScaleGestureDetector进行无限缩放

时间:2013-01-25 15:04:17

标签: android view scale

我尝试使用ScaleGestureDetector使用setScaleXsetScaleY方法缩放视图。如果您只想将视图缩放5到7次,它可以正常工作。但是有一个很大的问题,你需要比原版更大的视图20-30。 ScaleGestureDetector没有考虑视图的当前比例,因此无法无限扩展 - onScaleBegin不会被触发。

我确定这是因为ScaleGestureDetector源代码中的这些行:

if (!mInProgress && span >= mMinSpan &&
       (wasInProgress || Math.abs(span - mInitialSpan) > mSpanSlop)) {
        ...
        mInProgress = mListener.onScaleBegin(this);
}

使用ScaleGestureDetector有一种简单的方法可以将视图缩放20-30倍,还是有适用于Android的自定义缩放检测器?

2 个答案:

答案 0 :(得分:1)

我不确定我明白你想要什么。 ScaleGestureDetector只是将用户的触摸事件转换为比例因子。

由您决定如何使用比例因子。如果您遇到限制,则限制在于您使用比例值的方式。即您的代码正在缩放视图,而不是ScaleGestureDetector

您上面复制的代码只是在触摸事件中应用触摸slop,因此它不会检测不适合缩放的触摸。

答案 1 :(得分:1)

这是一个非常好用的扩展实现。我只用一个缩放手势就可以将视图缩放20倍。

private final Matrix mMatrix = new Matrix();

@Override
public boolean onTouchEvent(MotionEvent event) {
    if (event.getPointerCount() == 2) {
        float scale = (float) Math.sqrt(getScaleX());
        float focalX = (event.getX(0) + event.getX(1)) / 2;
        float focalY = (event.getY(0) + event.getY(1)) / 2;
        mMatrix.setScale(scale, scale, focalX, focalY);
        event.transform(mMatrix);
        return mScaleGestureDetector.onTouchEvent(event);
    } 
    return false;
}

在这种情况下,尺度x和y都相等。为了使用不同的比例,只需将setScale方法的第二个参数更改为y轴上的比例。