在Surfaceview中在Canvas上显示位图

时间:2013-03-25 13:54:41

标签: android canvas bitmap surfaceview

我正在尝试开发一个Android应用程序来显示可缩放的,可平移的地图(这只是一个位图图像),它还允许用户点击地图上的某些点。

我正在努力寻找实施此类应用的最有效方法。在尝试了许多其他方法(包括Webviews,OpenLayers)之后,最好的方法(至少根据这个网站),似乎是在使用带有Canvas的SurfaceView。我到目前为止的代码是从我在互联网上找到的片段拼凑而成的,所以它只是崩溃了。无论如何我都把它包含在这里,希望它能让我知道我想要实现的目标:

public class Main extends Activity {

private Bitmap bmp; 
    private SurfaceView surfaceView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        surfaceView = (SurfaceView)findViewById(R.id.surface);
        bmp = BitmapFactory.decodeResource(getResources(),
             R.drawable.testmapbmp);
        //decode the bitmap file

        Canvas canvas = new Canvas(bmp);
        //create a canvas from the bitmap, then display it in surfaceview
        surfaceView.draw(canvas);
    }
}

这是实现我想要的应用程序功能的最佳方法吗?或者有更好的方法,特别是如果我以后遇到问题,例如实现地图的可点击部分。

我真的需要那些曾经创造过这样的东西的人的帮助,所以我可以对问题进行思考,但我非常感谢任何帮助/指针/提示!

由于

1 个答案:

答案 0 :(得分:2)

你的代码不是很正确。

如果您想要创建自己的自定义视图(通过继承View或SurfaceView),则需要执行此操作。在View子类中,您需要覆盖方法onDraw(Canvas)并使用canvas方法之一在画布上绘制位图。

要使其可以平移和捏缩放,您需要使用ScrollerScaleGestureDetector类。通常通过使用它的方法(旋转,缩放,平移)将仿射变换应用于画布来完成平移或缩放。

SurfaceView和View之间的区别在于,您可以在SurfaceView中直接从单独的线程绘制,这意味着您可以在那里组织渲染循环并从中进行绘制。它适用于简单的游戏和动画效果。我相信,为了绘制位图,这对于查看子类来说是过度的和简单的。

如果我是你,我会从thisthis开始。