用Android绘制二维图形

用Android绘制二维图形,android,Android,我试图了解安卓绘图是如何工作的 我希望有人能解释一下绘图组件之间的关系(视图、可绘图、画布、位图) 这一切看起来都很混乱,文档也没有很好地解释它 通过onDraw()插入视图的画布对象中的位图是代表整个显示,还是仅代表视图绘制的块 drawable做什么,它们只是将一组命令封装到画布对象的对象吗 我希望有人能帮助我对它的工作原理有一个基本的了解,我没有eny java背景的纯动作脚本和C#(silverlight)。这是一个相当模糊的问题,但我会试一试。这是我在这个网站上的第一个答案,我绝不是一

我试图了解安卓绘图是如何工作的

我希望有人能解释一下绘图组件之间的关系(视图、可绘图、画布、位图)

这一切看起来都很混乱,文档也没有很好地解释它

通过onDraw()插入视图的画布对象中的位图是代表整个显示,还是仅代表视图绘制的块

drawable做什么,它们只是将一组命令封装到画布对象的对象吗


我希望有人能帮助我对它的工作原理有一个基本的了解,我没有eny java背景的纯动作脚本和C#(silverlight)。

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

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

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

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

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

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

onDraw()方法提供的canvas对象具有许多用于在视图上绘制的有用函数。玩玩它,这是学习如何使用它的最好方法。另外,别忘了查看Android开发者网站,查看所有方法的完整列表

你到底希望用绘画做什么?如果您试图制作类似游戏的东西,您可能应该考虑使用
SurfaceView

以下是自定义视图类的示例:

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

创建此视图时,应将其自身绘制为红色。

此视图是用户与之交互的GUI对象。它与画布相关联。在onSizeChanged()方法中获取其维度(需要在自定义视图中重写),然后在onDraw()方法中绘制到其画布(同样,需要重写该方法)

画布是用于绘制的对象。画布对象绘制到位图对象上。画布通常代表整个屏幕,所有视图可能共享同一个画布。调用onDraw()时,画布将应用变换矩阵,并设置其剪裁区域,以便渲染调用将0,0用作视图的左上角,并且图形将被约束在视图内

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

您还需要将绘制对象传递给大多数画布绘制方法。绘制对象包含用于渲染的颜色、字体、填充样式和其他数据

位图是可以绘制在其上的东西。它是物理画布或记忆,是画布的基础。我相信画布和位图之间存在一对一的对应关系。可以使用canvas.setDevice()方法将画布绑定到位图,也可以在画布的构造函数中进行绑定。我不相信有办法从画布上检索位图

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


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

感谢您的精彩而简单的解释,我开始了解它是如何构成的。但它仍然有点模糊的组件之间的区别。但正如你所说,玩弄它有助于建立更好的理解。我不想画什么特别的东西,我只是开始学习Android,我喜欢对不同的组件有很好的了解。哇。真棒的回答。谢谢回答得很好,但我会放弃R.java和资源的东西。我们想进一步了解onDraw()和setBounds(),至少在我的情况下是这样。感谢您的回复,这也有助于解决问题!我希望我能把这两个都标为答案!