Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/195.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Android Java中编程可滚动的SurfaceView?_Java_Android_Scroll_Surfaceview - Fatal编程技术网

如何在Android Java中编程可滚动的SurfaceView?

如何在Android Java中编程可滚动的SurfaceView?,java,android,scroll,surfaceview,Java,Android,Scroll,Surfaceview,我试图画一个比屏幕大的图像,让用户在上面滚动。图像是一些由我的代码根据一些数据计算的图形。(这是在使用Java的Android中) 我想要的是一个用户可以滚动的视图(实际上是一个SurfaceView)。我曾尝试将SurfaceView放入ScrollView中,但SurfaceView绘制的整个图像非常大,因此(a)当我的应用程序绘制整个SurfaceView时存在性能问题,而它本应只需要绘制视口中的部分,(b)我的应用程序因“尺寸太大…内存不足”错误而崩溃 如果视图可以实现滚动(仅垂直),然

我试图画一个比屏幕大的图像,让用户在上面滚动。图像是一些由我的代码根据一些数据计算的图形。(这是在使用Java的Android中)

我想要的是一个用户可以滚动的视图(实际上是一个SurfaceView)。我曾尝试将SurfaceView放入ScrollView中,但SurfaceView绘制的整个图像非常大,因此(a)当我的应用程序绘制整个SurfaceView时存在性能问题,而它本应只需要绘制视口中的部分,(b)我的应用程序因“尺寸太大…内存不足”错误而崩溃

如果视图可以实现滚动(仅垂直),然后将y值传递给代码,这样就可以在视口中绘制图像的可见部分,这对我来说是最好的

或者,我可以捕获“鼠标”事件并自己计算y值

有没有人有代码让我可以这样做

更新:我应该澄清一下,图像是由我的程序代码使用Canvas.drawLine()等绘制的。我可以计算图像的哪些部分适合我的视口,前提是我将滚动状态作为y值,并且我可以通过减去滚动y值来计算每个点的绝对y坐标。我需要的是当用户滚动图像时能够找到结果y值的东西。滚动条也不错


更新:我正在使用SurfaceView,以便从另一个线程更新图像,从而提高用户界面性能。

您只需使用WebView即可显示图像

  • 提供pan
  • 提供缩放功能
  • 不需要图书馆
  • 有一个滚动条


我不确定我是否真的击中了你的问题…

如果你真的只有一个画图内容。。。你不需要一个可滚动的客户端

  • 有一个模型(x、y、线条等)
  • 进行平移和缩放
  • 绘制模型的缩放实例
只需绘制内容(抱歉-此解决方案中没有滚动条)

最后,使用scaleListener

private class ScaleListener extends
        ScaleGestureDetector.SimpleOnScaleGestureListener {

    @Override
    public boolean onScale(ScaleGestureDetector detector) {

        float value = detector.getScaleFactor();
        currentScaleFactor = currentScaleFactor * value;

        // don't let the object get too small or too large.
        boolean doesntMatch = false;
        if (currentScaleFactor < 1f || currentScaleFactor > 20f){
            currentScaleFactor = Math.max(1f, Math.min(currentScaleFactor, 20f));
            doesntMatch = true;
        }

        if(!doesntMatch){
            //scale the viewport as well
            currentPan.x = currentPan.x*value;
            currentPan.y = currentPan.y*value;

        }
        return true;
    }
}
私有类ScaleListener扩展
ScaleGetStureDetector.SimpleOnScaleGetStureListener{
@凌驾
公共布尔标度(scalegestruedetector检测器){
浮点值=检测器.getScaleFactor();
currentScaleFactor=currentScaleFactor*值;
//不要让对象变得太小或太大。
布尔值doesntMatch=false;
如果(currentScaleFactor<1f | | currentScaleFactor>20f){
currentScaleFactor=Math.max(1f,Math.min(currentScaleFactor,20f));
doesntMatch=true;
}
如果(!doesntMatch){
//同时缩放视口
currentPan.x=currentPan.x*值;
currentPan.y=currentPan.y*值;
}
返回true;
}
}

为什么必须有SurfaceView?为什么不创建一个带有overrode onDraw的自定义视图呢?我已经编辑了这个问题来解释原因。好的,我没有在SurfaceView中尝试过,但这应该与SurfaceView扩展视图的工作原理相同:只需使用
View.scrollBy()
/
View.scrollTo()
为了显示视图的某些特定部分,现在我更聪明了,因为我测试了SurfaceView和scrollTo/scrollBy:很遗憾,它不起作用,对不起,你需要自己翻译画布。我没有显示网页。虽然理论上我可以将我的图像显示为标签,但这将非常低效,因为我一直在更新图像。我将此作为我的代码的基础(我只需要垂直平移,所以我简化了一点代码)。老实说,这是我程序的一部分,但我真的必须承认,我还复制了从别人那里剪下来的代码(而且我也做了一些调整)^^祝你的应用程序好运!
private class ScaleListener extends
        ScaleGestureDetector.SimpleOnScaleGestureListener {

    @Override
    public boolean onScale(ScaleGestureDetector detector) {

        float value = detector.getScaleFactor();
        currentScaleFactor = currentScaleFactor * value;

        // don't let the object get too small or too large.
        boolean doesntMatch = false;
        if (currentScaleFactor < 1f || currentScaleFactor > 20f){
            currentScaleFactor = Math.max(1f, Math.min(currentScaleFactor, 20f));
            doesntMatch = true;
        }

        if(!doesntMatch){
            //scale the viewport as well
            currentPan.x = currentPan.x*value;
            currentPan.y = currentPan.y*value;

        }
        return true;
    }
}