
drawCircle方法:绘制圆形
功能说明该方法用于在画布上绘制圆形,通过指定圆形圆心的坐标和半径来实现。该方法是绘制圆形的主要方法,同时也可以通过设置画笔的空心效果来绘制空心的圆形。
基本语法public void drawCircle (float cx, float cy, float radius, Paint paint)
参数说明
cx:圆心的x坐标。
cy:圆心的y坐标。
radius:圆的半径。
paint:绘制时所使用的画笔。
实例演示下面通过代码来演示如何在画布上绘制圆形。
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
superonDraw(canvas);
paintsetAntiAlias(true); //设置画笔为无锯齿
paintsetColor(ColorBLACK); //设置画笔颜色
canvasdrawColor(ColorWHITE); //白色背景
paintsetStrokeWidth((float) 30); //线宽
paintsetStyle(StyleSTROKE); //空心效果
canvasdrawCircle(50, 50, 10, paint); //绘制圆形
canvasdrawCircle(100, 100, 20, paint); //绘制圆形
canvasdrawCircle(150, 150, 30, paint); //绘制圆形
canvasdrawCircle(200, 200, 40, paint); //绘制圆形
canvasdrawCircle(250, 250, 50, paint); //绘制圆形
canvasdrawCircle(300, 300, 60, paint); //绘制圆形
canvasdrawCircle(350, 350, 70, paint); //绘制圆形
}
在这段代码中,首先设置了Paint画笔的颜色,并设置Canvas画布为白色背景。接着设置画笔的线宽以及空心效果,这样将绘制出空心圆形。最后,调用drawCircle方法绘制了多个圆形,坐标和半径都在不断变化。
(一) OnPaint 和 OnDraw
(1)OnPaint是WM_PAINT消息的消息处理函数,在OnPaint中调用OnDraw,一般来说,用户自己的绘图代码应放在OnDraw中。
(2)OnPaint()是CWnd的类成员,负责响应WM_PAINT消息。OnDraw()是CVIEW的成员函数,没有响应消息的功能
(3)当视图变得无效时(包括大小的改变,移动,被遮盖等等),Windows发送WM_PAINT消息。该视图的OnPaint 处理函数通过创建CPaintDC类的DC对象来响应该消息并调用视图的OnDraw成员函数OnPaint最后也要调用OnDraw,因此一般在OnDraw函数中进行绘制。
(4)The WM_PAINT message is sent when the UpdateWindow or RedrawWindow member function is called
(5)在OnPaint中,将调用BeginPaint,用来获得客户区的显示设备环境,并以此调用GDI函数执行绘图 *** 作。在绘图 *** 作完成后,将调用EndPaint以释放显示设备环境。而OnDraw在BeginPaint与EndPaint间被调用。
(二) MFC结构(1)在MFC结构里OnPaint是CWnd的成员函数 OnDraw是CView的成员函数
(2)OnPaint()调用OnDraw(),OnPrint也会调用OnDraw(),所以OnDraw()是显示和打印的共同 *** 作。
(3)OnPaint是WM_PAINT消息引发的重绘消息处理函数,在OnPaint中会调用OnDraw来进行绘图。
1 OnPaint中首先构造一个CPaintDC类得实例,然后以这个实例为参数来调用虚函数OnPrepareDC来进行一些绘制前的一些处理,比设置映射模式,最后调用OnDraw。
2 OnDraw和OnPrepareDC不是消息处理函数。所以在不是因为重绘消息所引发的OnPaint导致OnDraw被调用时,比如在OnLButtonDown等消息处理函数中绘图时,要先自己调用OnPrepareDC。
(4)至于CPaintDC和CClientDC根本是两回事情:
1 CPaintDC是一个设备环境类,在OnPaint中作为参数传递给OnPrepareDC来作设备环境的设置。
2 真正和CClientDC具有可比性的是CWindowDC,他们一个是描述客户区域,一个是描述整个屏幕。 如果是对CVIEW或从CVIEW类派生的窗口绘图时应该用OnDraw。
(三) OnDraw()和OnPaint()区别1 首先:我们先要明确CView类派生自CWnd类。而OnPaint()是CWnd的类成员,同时负责响应WM_PAINT消息。OnDraw()是CVIEW的成员函数,并且没有响应消息的功能。这就是为什么你用VC生成的程序代码时,在视图类只有OnDraw没有OnPaint的原因。而在基于对话框的程序中,只有OnPaint。
2 其次:要想在屏幕上绘图或显示图形,首先需要建立设备环境DC。其实DC是一个数据结构,它包含输出设备(不单指你的纯屏显示器,还包括打印机之类的输出设备)的绘图属性的描述。MFC提供了CPaintDC类和CWindwoDC类来实时的响应,而CPaintDC支持重画。当视图变得无效时(包括大小的改变,移动,被遮盖等等),Windows 将 WM_PAINT 消息发送给它。该视图的OnPaint 处理函数通过创建 CPaintDC 类的DC对象来响应该消息并调用视图的 OnDraw 成员函数。通常我们不必编写重写的 OnPaint 处理成员函数。
///CView默认的标准的重画函数void CView::OnPaint() //见VIEWCORECPP
{
CPaintDC dc(this);
OnPrepareDC(&dc);
OnDraw(&dc); //调用了OnDraw
}
///CView默认的标准的OnPrint函数
void CView::OnPrint(CDC pDC, CPrintInfo)
{
ASSERT_VALID(pDC);
OnDraw(pDC); // Call Draw
}
既然OnPaint最后也要调用OnDraw,因此我们一般会在OnDraw函数中进行绘制。下面是一个典型的程序。
///视图中的绘图代码首先检索指向文档的指针,然后通过DC进行绘图调用。void CMyView::OnDraw( CDC pDC )
{
CMyDoc pDoc = GetDocument();
CString s = pDoc->GetData();
GetClientRect( &rect ); // Returns a CString CRect rect;
pDC->SetTextAlign( TA_BASELINE | TA_CENTER );
pDC->TextOut( rectright / 2, rectbottom / 2, s, sGetLength() );
}
3 最后:现在大家明白这哥俩之间的关系了吧。因此我们一般用OnPaint维护窗口的客户区(例如我们的窗口客户区加一个背景),用OnDraw维护视图的客户区(例如我们通过鼠标在视图中画图)。当然你也可以不按照上面规律来,只要达到目的并且没有问题,怎么干都成。
4 补充:我们还可以利用Invalidate(),ValidateRgn(),ValidateRect()函数强制的重画窗口,具体的请参考MSDN的CWnd::Invalidate
5 OnDraw中可以绘制用户区域。OnPaint中只是当窗口无效时重绘不会保留CClientDC绘制的内容。
(四)、这两个函数有区别也有联系:1、区别:OnDraw是一个纯虚函数,定义为virtual void OnDraw( CDC pDC ) = 0; 而OnPaint是一个消息响应函数,它响应了WM_PANIT消息,也是是窗口重绘消息。
2、联系:我们一般在视类中作图的时候,往往不直接响应WM_PANIT消息,而是重载OnDraw纯虚函数,这是因为在CVIEW类中的WM_PANIT消息响应函数中调用了OnDraw函数。如果在我们自己定义的类CMYVIEW中响应了WM_PAINT消息,不显式地调用OnDraw函数的话,是不会在窗口重绘的时候调用OnDraw函数的(显式调用必须自己准备设备环境( CDC pDC=GetDC(); OnDraw(pDC); ))。
3、应用程序中几乎所有的绘图都在视图的 OnDraw 成员函数中发生,必须在视图类中重写该成员函数。(鼠标绘图是个特例,这在通过视图解释用户输入中讨论。)
4、OnDraw 重写: 通过调用您提供的文档成员函数获取数据。 通过调用框架传递给 OnDraw 的设备上下文对象的成员函数来显示数据。 当文档的数据以某种方式更改后,必须重绘视图以反映该更改。默认的 OnUpdate 实现使视图的整个工作区无效。当视图变得无效时,Windows 将 WM_PAINT 消息发送给它。该视图的 OnPaint 处理函数通过创建 CPaintDC 类的设备上下文对象来响应该消息并调用视图的 OnDraw 成员函数。
5、想象一下,窗口显示的内容和打印的内容是差不多的,所以,一般情况下,统一由OnDraw来画。窗口前景需要刷新时,系统会会调用到OnPaint,而OnPaint一般情况下是对DC作一些初始化 *** 作后,调用OnDraw()。
6、OnEraseBkGnd(),是窗口背景需要刷新时由系统调用的。明显的一个例子是设置窗口的背景颜色(你可以把这放在OnPaint中去做,但是会使产生闪烁的现象)。 至于怎么界定背景和前景,那要具体问题具体分析了,一般情况下,你还是很容易区别的吧。
(五)OnPaint()用来响应WM_PAINT消息,视类的OnPaint()内部根据是打印还是屏幕绘制分别以不同的参数调用OnDraw()虚函数。所以在OnDraw()里你可以区别对待打印和屏幕绘制。 其实,MFC在进行打印前后还做了很多工作,调用了很多虚函数,比如OnPreparePrint()等。
对于OnDraw() :This method is called by the framework to render an image of the document The framework calls this method to perform screen display, printing, and print preview, and it passes a different device context in each case There is no default implementation
最近在做自定义控件,偏展示的那种,视觉出的花里胡哨的,没有现成的,只好自己画。
View 提供了一个 onDraw 方法,
画布 这是画画的地方,系统已经为我们提供好了,就是 onDraw 方法的入参 Canvas 类对象。
画笔 画画的时候有可能只用一支铅笔,有可能用到好几种笔刷。在 Android 里可以用 Paint 类对象来表示,并且画笔是可以带颜色的,就像蜡笔一样五颜六色。
颜料 如果画的是油画或者水彩,笔刷需要配着颜料才能画出颜色。在 Android 里省去了这步,可以直接在 Paint 对象设置颜色,这样画笔就带上了颜色。
小画家 当然是我们啦,想画啥画啥。
Android 坐标系 以我们面对这屏幕,左上角为坐标原点,向右为 x 轴正方向,向下为 y 轴正方向。还有涉及到角度时,请拿出我们的左手,竖起大拇指,握起其他手指,放在手机屏幕上,大拇指朝向就是 z 轴正方向,其他手指握起的方向就是角度的正方向,以 x 轴的正半轴为 0 度角,转到 y 轴正半轴就是 90 度。(其实就是顺时针方向,与极坐标系相反)
系统提供了一些基本的形状绘画功能,画线,画圆,写个字,描个点等等,当然系统也提供了画圆弧的方法。虽然现实中,画什么东西是我们小画家在 *** 作,但在 Android 交给了 Canvas 来负责,(也就是 Canvas 类提供了这些功能方法)我们小画家只要告诉 Canvas 对象要画什么就可以了。
区域范围 正如 drawArc 方法入参提到的,应该画任何东西都要确定一个位置和范围,这个范围应该小于等于整个画布,但画布感觉是无边际的(虽然手机屏幕只有这么大,但画布应该是可以超出屏幕),所以画某个具体图形的范围也可以无限大,只不过实际都会指定一个可见范围,不然意义就不大了。
这个区域范围可以用 RectF 类表示,也可以用 左,上,右,下四个值来限定。其实这个区域范围有点类似 PS 的选区,框选某个范围后,只有那个区域画画才生效,超出了边界,再怎么画也是看不到的。当然,Android 的这个区域范围可能还影响这最终画出来的图形形状。
再来说下渐变色的实现。系统提供了 Shader 类来控制颜色的变化,渐变也算一种。像如果需要给圆弧设置颜色渐变就可以用 Shader 的子类 SweepGradient。
最后,会画圆弧了,可以用来表示什么呢?例如,油表盘,刻度盘,环形进度条(当然这个现成的也有)等等。
SurfaceHolder sh = SomeViewthisgetHolder();
Canvas canvas = shlockCanvas();
try{
synchronized(sh){
onDraw(canvas);
}
}catch(Exception e){
eprintStackTrace();
}finally{
if(null != canvas){
shunlockCanvasAndPost(canvas);
}
}
简短的说就像text框要输入文字一样,你必须先让text取得焦点,获得光标才能进行输入
bitmap就像画布,canvas就像画笔。要画画就要知道画在哪里,所以必须要画布。
view的onDraw的canvas是花在view的背景上,也是类似bitmap上。
缓冲是在另一个后台bitmap上画好在进行展示
以上代表个人通俗理解只做参考理解,不是标准
绘制VIew本身的内容,通过调用ViewonDraw(canvas)函数实现
绘制自己的孩子通过dispatchDraw(canvas)实现
View组件的绘制会调用draw(Canvas canvas)方法,draw过程中主要是先画Drawable背景,对 drawable调用setBounds()然后是draw(Canvas c)方法有点注意的是背景drawable的实际大小会影响view组件的大小,drawable的实际大小通过getIntrinsicWidth()和getIntrinsicHeight()获取,当背景比较大时view组件大小等于背景drawable的大小。
画完背景后,draw过程会调用onDraw(Canvas canvas)方法,然后就是dispatchDraw(Canvas canvas)方法, dispatchDraw()主要是分发给子组件进行绘制,我们通常定制组件的时候重写的是onDraw()方法。值得注意的是ViewGroup容器组件的绘制,当它没有背景时直接调用的是dispatchDraw()方法, 而绕过了draw()方法,当它有背景的时候就调用draw()方法,而draw()方法里包含了dispatchDraw()方法的调用。因此要在ViewGroup上绘制东西的时候往往重写的是dispatchDraw()方法而不是onDraw()方法,或者自定制一个Drawable,重写它的draw(Canvas c)和 getIntrinsicWidth(),getIntrinsicHeight()方法,然后设为背景。
以上就是关于draw_circle怎么调用画圈函数全部的内容,包括:draw_circle怎么调用画圈函数、MFC中OnDraw和OnPaint的区别、来,用 Android 画个圆弧看看等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)