自定义视图的捏合缩放

51

我已经创建了自定义视图,现在想要为它应用“双指捏合缩放”功能。如何实现?

4个回答

93

这篇关于Android开发者博客的文章非常好地涵盖了这个主题(向下滚动到GestureDetectors部分):

理解多点触控

如果您只想实现捏合缩放,那么您只需要几行代码:

private ScaleGestureDetector mScaleDetector;
private float mScaleFactor = 1.f;

public MyCustomView(Context mContext){
    //...
    //Your view code
    //...
    mScaleDetector = new ScaleGestureDetector(context, new ScaleListener());
}

@Override
public boolean onTouchEvent(MotionEvent ev) {
    // Let the ScaleGestureDetector inspect all events.
    mScaleDetector.onTouchEvent(ev);
    return true;
}

@Override
public void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    canvas.save();
    canvas.scale(mScaleFactor, mScaleFactor);
    //...
    //Your onDraw() code
    //...
    canvas.restore();
}

private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
    @Override
    public boolean onScale(ScaleGestureDetector detector) {
        mScaleFactor *= detector.getScaleFactor();

        // Don't let the object get too small or too large.
        mScaleFactor = Math.max(0.1f, Math.min(mScaleFactor, 5.0f));

        invalidate();
        return true;
    }
}

本文剩余部分介绍如何处理其他手势,但与其使用它们的实现,您可以像上面的代码中使用ScaleGestureDetector一样使用GestureDetector


5
我已经完成了这个操作,但我该如何拖动或滚动放大的视图? - sillyMistaker
@sillyMistaker 关于平底锅的问题,在帖子链接中已经有很好的解释。这篇文章内容太多,不适合在评论中讨论,但它遵循相当简单的逻辑。 - Niki Romagnoli
如何在 ListView 上实现这个功能? - Mayank Kumar Chaudhari
从来没有想过实现起来会这么容易。谢谢! - bikram

8

4
有相应的文件可以提供吗? - Peter
不错的例子,但它会导致很多无效调用。 - DearDhruv
1
很不幸,该项目似乎在过去的6个月内没有活动。我在15天前提交了一个拉取请求来修复一个明显的错误,但是我没有得到任何回应。 - Dan J
1
你明白如何使用它了吗? - mushahid
2
这个 GitHub 仓库已不再维护。 - Stevey
显示剩余2条评论

2

太棒了,它帮了我很多忙;我一直在苦苦挣扎如何缩放我的自定义imageView,因为它上面有绘图。这个库真的为我解决了问题。感谢你提到它! - Zhangali Bidaibekov

-2

Photoview只能在ImageView上正常工作,但无法处理被另一个类扩展的View。请问如何处理CustomView? - Zia Ur Rahman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接