【问题标题】:2D drawing with Android使用 Android 进行 2D 绘图
【发布时间】:2010-07-27 00:49:08
【问题描述】:

我试图了解 Android 绘图的工作原理。

希望有人能解释一下绘图组件是如何相互关联的(View、Drawable、Canvas、Bitmap)

这一切似乎都很混乱,文档并没有很好地解释它。

您通过 onDraw() 注入视图的 Canvas 对象内的位图代表整个显示,还是仅代表视图绘制的块?

drawable 有什么作用,它们只是将一组命令封装到 Canvas 对象的对象吗?

我希望有人可以帮助我对它的工作原理有一个基本的了解,我没有任何 Java 背景,只有 Action 脚本和 C# (silverlight)。

【问题讨论】:

    标签: android


    【解决方案1】:

    这是一个非常模糊的问题,但我会试一试。这是我在这个网站上的第一个答案,我绝不是专家,但我发现自己在 Android 中做了很多修改。

    根据我的阅读和体验,每个视图都有一个位图,用于在屏幕上绘制视图。每个视图也有一个画布。画布允许程序员控制在该位图上绘制的内容。

    每个 View 对象都有一个 onDraw(Canvas c) 方法用于绘制它。如果你想自己画一些东西,你可以通过扩展 View 创建一个 View 类的子类,你可以重写 onDraw(Canvas c) 方法来绘制你想要的任何东西。您可以使用作为onDraw() 方法的参数提供的Canvas 对象在视图上绘制。

    drawable 只是一个可以绘制的对象。这可以是静止图像(bmp、png、jpg 等)、图标、动画 gif 等。drawable 通常是从您想要绘制到屏幕上的现有图像创建的。这分两步完成:将图像包含到您的项目中,然后绘制图像。

    要将图像包含到您的项目中,您只需将其拖到 Eclipse 中项目目录中的 res/drawable 文件夹之一即可。

    一旦图像文件包含在您的项目中,R.java 文件将自动更新为该图像文件的唯一 ID。要将图像文件加载为代码中的可绘制对象,您可以执行Drawable d = getResources().getDrawable(R.id.imagefile); 之类的操作。要在画布上绘制它,您可以使用d.setBounds() 方法设置大小和位置,您可以在onDraw() 方法中使用d.draw(canvas) 在视图中绘制它。

    onDraw() 方法提供的画布对象有许多有用的函数用于在视图上绘图。玩弄它,这是您了解如何使用它的最佳方式。另外,不要忘记查看 Android 开发者网站以查看所有方法的完整列表。

    您究竟希望绘画做什么?如果您正在尝试制作类似游戏的东西,您可能应该考虑使用 SurfaceView 类。

    这是一个自定义视图类的示例:

    public class CustomView extends View{
       public void onDraw(Canvas c){
          c.drawColor(Color.RED);
       }
    }
    

    这个视图在创建时应该只是将自己绘制成红色。

    【讨论】:

    • 感谢您提供的非常好的和简单的解释,我开始了解这一切是如何构成的。但它仍然有点模糊组件之间的区别。但正如你所说,玩弄它有助于建立更好的理解。我并不想画任何特别的东西,我刚开始学习 Android,我喜欢深入了解不同的组件。
    • 哇。很棒的答案。谢谢!
    • 很好的答案,但我会放弃 R.java 和资源的东西。这是我们想更好地了解的 onDraw() 和 setBounds(),至少在我的情况下。
    【解决方案2】:

    视图是用户与之交互的 GUI 对象。它与画布相关联。您在 onSizeChanged() 方法中获取它的尺寸(您需要在自定义视图中覆盖它)并在其 onDraw() 方法中绘制到它的 Canvas(再次,您需要覆盖它)

    Canvas 是您用于绘图的对象。 Canvas 对象绘制到 Bitmap 对象上。 Canvas 通常代表整个屏幕,所有 View 可能共享同一个 Canvas。当 onDraw() 被调用时,Canvas 将应用一个变换矩阵,并设置其剪切区域,以便您的渲染调用将使用 0,0 作为 View 的左上角,您的绘图将是限制在视图内。

    注意:不要使用 canvas.getWidth/Height() 从 view.onDraw() 中获取可绘制区域;这将返回整个屏幕的大小,而不是您想要的。请改用 view.onSizeChanged()。

    您还需要一个 Paint 对象,该对象被传递给大多数 Canvas 绘图方法。 Paint 对象包含颜色、字体、填充样式和其他用于渲染的数据。

    位图是可以绘制的东西。物理屏幕或内存是 Canvas 的基础。我相信画布和位图之间是一一对应的。 canvas.setDevice() 方法可用于将 Canvas 绑定到 Bitmap,或者可以在 Canvas 的构造函数中完成绑定。我不相信有办法从画布中检索位图。

    位图也可以用作源并渲染到画布上。

    Drawable 对象不是可以绘制到(目标)上的东西,而是渲染到画布(源)上的东西。通常 Drawable 取自您应用程序的资源,但也可以从网络下载或从您的图库中检索等。

    【讨论】:

    • 感谢您的回复,这也有助于解决问题!我希望我可以将两者都标记为答案!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多