如何在Android Java中编程可滚动的SurfaceView?
我试图画一个比屏幕大的图像,让用户在上面滚动。图像是一些由我的代码根据一些数据计算的图形。(这是在使用Java的Android中) 我想要的是一个用户可以滚动的视图(实际上是一个SurfaceView)。我曾尝试将SurfaceView放入ScrollView中,但SurfaceView绘制的整个图像非常大,因此(a)当我的应用程序绘制整个SurfaceView时存在性能问题,而它本应只需要绘制视口中的部分,(b)我的应用程序因“尺寸太大…内存不足”错误而崩溃 如果视图可以实现滚动(仅垂直),然后将y值传递给代码,这样就可以在视口中绘制图像的可见部分,这对我来说是最好的 或者,我可以捕获“鼠标”事件并自己计算y值 有没有人有代码让我可以这样做 更新:我应该澄清一下,图像是由我的程序代码使用Canvas.drawLine()等绘制的。我可以计算图像的哪些部分适合我的视口,前提是我将滚动状态作为y值,并且我可以通过减去滚动y值来计算每个点的绝对y坐标。我需要的是当用户滚动图像时能够找到结果y值的东西。滚动条也不错如何在Android Java中编程可滚动的SurfaceView?,java,android,scroll,surfaceview,Java,Android,Scroll,Surfaceview,我试图画一个比屏幕大的图像,让用户在上面滚动。图像是一些由我的代码根据一些数据计算的图形。(这是在使用Java的Android中) 我想要的是一个用户可以滚动的视图(实际上是一个SurfaceView)。我曾尝试将SurfaceView放入ScrollView中,但SurfaceView绘制的整个图像非常大,因此(a)当我的应用程序绘制整个SurfaceView时存在性能问题,而它本应只需要绘制视口中的部分,(b)我的应用程序因“尺寸太大…内存不足”错误而崩溃 如果视图可以实现滚动(仅垂直),然
更新:我正在使用SurfaceView,以便从另一个线程更新图像,从而提高用户界面性能。您只需使用WebView即可显示图像
- 提供pan
- 提供缩放功能
- 不需要图书馆
- 有一个滚动条
我不确定我是否真的击中了你的问题…如果你真的只有一个画图内容。。。你不需要一个可滚动的客户端
- 有一个模型(x、y、线条等)
- 进行平移和缩放
- 绘制模型的缩放实例
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;
}
}