android - 使用 ScaleGestureDetector 的缩放和 Canvas 问题

标签 android zooming android-canvas

我正在尝试在我的应用中实现缩放。但是我遇到了困难。

到目前为止我做了什么:

(注意:这个应用程序是一个游戏,所以它不使用invalidate而是一个线程)

渲染和缩放:

public void render(Canvas c) {
    super.draw(c);

    if (c != null) {
        int ss = c.getSaveCount();
        c.scale(scaleFactor, scaleFactor);
        //Rendering stuff
        c.restoreToCount(ss);
    }
}

当前缩放:

(当有两个指针时,这是从主类中的 onTouchEvent 调用的。这些类是嵌套的。)

class scaler extends ScaleGestureDetector {
    public scaler(Context context, OnScaleGestureListener listener) {
        super(context, listener);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        listener.onScale(this);
        return super.onTouchEvent(event);
    }

    @Override
    public float getScaleFactor() {
        return super.getScaleFactor();
    }
}
float startScale;
float endScale;
class ScaleListener implements ScaleGestureDetector.OnScaleGestureListener{


        @Override
        public boolean onScale(ScaleGestureDetector detector) {
            startScale = detector.getScaleFactor();
            scaleFactor *= detector.getScaleFactor();
            scaleFactor = (scaleFactor < 1 ? 1 : scaleFactor); // prevent our view from becoming too small //
            scaleFactor = ((float)((int)(scaleFactor * 100))) / 100; // Change precision to help with jitter when user just rests their fingers //
            return true;
        }

        @Override
        public boolean onScaleBegin(ScaleGestureDetector detector) {
            return true;
        }

        @Override
        public void onScaleEnd(ScaleGestureDetector detector) {

        }


}

我一直在寻找关于 SO 的几个问题,但我发现的所有问题都无法正常工作。解决方案有多种原因。

我目前使用的:

Zoom in before zooming out(比例因子在缩小前下降)
它不会放大手指所在的区域。

那么我怎样才能添加放大手指所在区域的缩放,并使其在不重置缩放的情况下缩放,从而真正放大?

最佳答案

感谢@pskink,这是我为解决问题所做的工作:

  1. 不要在扩展 ScaleGestureDetector 的类中覆盖 onTouchEvent,也不要调用 OnScaleGestureListener.onScale,因为它是由检测器自动完成的。

这解决了我在缩放方面遇到的问题。

至于放大特定区域,我不得不放弃使用 .setScale,而是使用矩阵:

public void render(Canvas c) {
    super.draw(c);

    if (c != null) {

        c.setMatrix(scaleMatrix);//scale

        //Null the matrix = set to default. 
        c.setMatrix(null);//Past this line, anything rendered is not scaled. 

    }
}

(GestureDetector 不应覆盖 onTouchEvent 并调用监听器)

在监听器中:

    public boolean onScale(ScaleGestureDetector detector) {
        startScale = detector.getScaleFactor();
        scaleFactor *= detector.getScaleFactor();

        if(scaleFactor > 2) scaleFactor = 2;//Limit max
        else if(scaleFactor < 0.3f) scaleFactor = 0.3f;//limit min
        scaleFactor = ((float)((int)(scaleFactor * 100))) / 100;//jitter-protection
        scaleMatrix.setScale(scaleFactor, scaleFactor, detector.getFocusX(), detector.getFocusY());//setScale, as I don't need to scale several things. 

        return true;
    }

关于android - 使用 ScaleGestureDetector 的缩放和 Canvas 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42675769/

相关文章:

android - 带指纹认证的考勤应用程序

android - 在Android应用程序中强制关闭时如何在运行时获取日志

Android AsyncTask 线程限制?

android - 缩放安卓键盘

android - 随机放置对象时避免 Canvas 中的特定范围

android - 在中心的椭圆路径上绘制文本

android - 如何在 Android Emulator Camera 中模拟图片?

jquery - CSS 缩放 - 只能让这个 (jQuery) 脚本在 Chrome 中工作

android - 如何根据设备宽度和字体大小测量 TextView 高度?

android - 如何正确设置TouchImageView的fixTransX & fixTransY来实现doubleTap to ZoomOut?