已知长方形怎么怎样用圆规画宽为√2的长方形圆角

文章介绍ImageView(方法也可以应用到其它View)圆角矩形(包括圆形)的一种实现方式,四个角可以分别指定为圆角。思路是利用“Xfermode + Path”来进行Bitmap的裁剪。

圆角矩形实现的方法应该很多,网上一大堆。很怀疑为啥安卓的控件不内置这样的属性(我不知道有)?

之前用到的网络图片加载库(UniversalImageLoader等)都自带“圆形图片”这样的功能。这次需要的效果是圆角矩形,而且只有图片上面左、右两个角是圆角。然后藐似没发现有这种功能,刚好就自己实践下了。

一个需要强调的事实就是,像ImageView这样的控件,它可以是wrap_content这样的,最终大小不定,由对应的Drawable或Bitmap资源决定其大小。另一种情况下ImageView的大小是固定的,此时图片的实际填充效果(可视范围)受到scaleType的影响,不一定和View大小一致,不过往往会保持图片宽高比例,使得最终ImageView的宽高和显示的图片是一致的。

在画布上进行裁剪时,必须明确要操作的相关Bitmap的尺寸。由于上面的原因,根据实际ImageView大小的确定方式不同,要么是取ImageView的大小来作为整个“圆角矩形”的范围,要么是以实际展示的Bitmap的大小为准。

下面采取自定义ImageView子类的形式提供案例来说明“Xfermode + Path”实现圆角矩形的思路。而且会以ImageView固定大小(图片填充,scaleType=fitXY)的形式,也就是说要显示的图片是完全填充ImageView的,它们一样大小。如果以Bitmap为准,那么就得自己去设法得到原本ImageView的“设置下”显示的图片的范围,然后对应的去裁剪。这里为突出重点,就不考虑那么多了(^-^)。

方法android.graphics.Canvas#clipPath(android.graphics.Path)用来沿着Path指定的路线从目前的canvas裁剪出新的区域的canvas,就是改变了画布的可绘制区域。理解上,就像你拿着剪刀沿着圆环路径裁剪画纸就可以裁剪出一个圆型画纸一样。

Canvas类的一些API是直接绘制内容的操作,另一些是针对canvas(画布)本身做设置的。clip**系列方法就是对画布进行裁剪,之后的绘制(“可以简单地”认为之前通过canvas的绘制已经固定在画布对应存储图像的bitmap上了)都在裁剪后的区域中进行。

使用clipPath()实现圆角矩形的完整代码如下:

* 设置四个角的圆角半径

注意需要先在canvas上执行clipPath(),之后再继续绘制原本的图片,这样就保证了绘制的内容范围限制在裁剪后的“圆角矩形画布”中。

它就是用来描述一个圆角矩形的路径。可以看到四个角都可以指定,而且还可以是不同的x,y半径。但是这里只允许圆角是圆。

最初的版本就是这样ok了,完成任务。后来测试说是图片圆角处模糊,
这里先给一个对比图,感受下:

我以为是网络加载的图片的Bitmap.Config引起的,改后无果。关键字“clipPath 锯齿”搜了下发现clipPath这种方式无法抗锯齿。
后面看到上歪果仁的一个回答,说Xfermode可以实现。

把圆作为一个画框看待,那么第2行第2个效果图:SrcIn,画了一个矩形,矩形只有落在圆中的部分才最终可见。
同样的思路,可以先做一个圆角矩形的画框——方式类似上面的clipPath()也是使用Path实现。然后让原本的图片画在这个画框上,效果就是圆角矩形的图片了。

接下来就是用上面的示例来完成抗锯齿的圆角矩形。

要弄清楚apiDemo中的圆和矩形混合效果的实现,先来看下它的核心代码:

  • mSrcB: 源位图,矩形
  • mDstB: 目标位图,圆

可以看到,先绘制矩形,然后setXfermode(),然后绘制圆。

bitmap,它是完全透明的),之后的绘制操作都在此bitmap上执行。每个layer可以看做一个独立的画布,所有layer形成一个栈,栈底是初始的layer。每次在栈顶产生的新layer,任何时候都在栈顶的layer上执行绘图,调用restoreToCount()后栈顶layer出栈,其对应的bitmap的内容合并(进行像素的argb混合)到之前layer中。很显然,最后也只应该剩下最初的layer,这样保证所绘制内容都最终输出到canvas的目标bitmap中,形成最终的内容(可以假想“画布生成的内容就是bitmap”——带颜色的像素区域)。

这里不严谨的认为:每个layer是一个canvas(画布),画布关联一个Bitmap存储最终绘制的内容。实际上不像现实中的画布或画纸,Canvas更像一个“绘图工具集”,包含直尺,圆规等绘图工具。skia文档中对SkCanvas的解释是“drawing context”——绘画环境。它提供的都是有关绘制的API,而绘制的内容会输出到Canvas的“绘制目标”——画纸,可以是Bitmap(像素集合),或者Hardware-layer(具备硬件加速的Bitmap)和DisplayList(存储绘制指令的序列而非最终的像素集合),从存储绘制结果的角度看本质是一样的。

上面的代码中,onDraw()方法在新的layer中使用Xfermode绘图模式来画圆和矩形。原因是drawBitmap()会把参数bitmap绘制到layer对应的bitmap中(也许用词上是胡说八道,但这样可以理解吧?),Xfermode模式下后续drawBitmap()方法会以当前layer的“整个区域的内容”作为混合操作的参考bitmap,所以为了不让之前layer已有内容对混合产生影响,就使用一个全新的layer——也就是全新的bitmap来进行混合绘制,最终再合并回去。

在API文档中还有下面的说明:

上面说到在使用Xfermode时,可以开启硬件加速(hardware layer)来直接绘制,此时不需要产生新的layer,会具有更好的性能,后面会给出这种实现。

Xfermode表示要在“绘制管线中使用的颜色传递模式”。概括来说,每一次绘图操作(drawXxx)底层都执行一次绘制管线,通常要经过:路径生成(Path Generation)、光栅化(Rasterization)、着色(Shading)和传递(Transfer)四个阶段。管线操作的输入就是draw**的输入,包括方法对应绘制图形图像的参数信息,以及canvas

Xfermode是一个基类,它的子类表示实际的颜色传递模式。子类PorterDuffXfermode表示:Porter/Duff 颜色混合算法,这里有篇文章描述了它。在ApiDemo中给出了Porter/Duff模式支持的16种不同混合效果。

为了四个角可配,继续使用Path来得到圆角矩形,重要的是为Paint设置ANTI_ALIAS_FLAG标志开启抗锯齿:

上面的saveLayer()接收的saveFlags是和canvas已设置的状态相关的,canvas需要恢复哪些方面的属性,就需要标记对应SAVE_FLAG来保存相应的状态。

因为上面对Paint开启了抗锯齿,最终得到的圆角矩形就不像clipPath那种会在圆角处产生模糊。

根据saveLayer方法的文档介绍,可以去掉saveLayer()/restoreToCount()的调用,只需要在onDraw()中开启硬件加速就可以实现相同的目标了,性能会更好:

上面分别给出了clipPath和Xfermode方式实现圆角矩形的方式,根据场景不同——在什么地方来实现需要的圆角矩形——其它等像基于shader的方式也许是更好的选择。
强调下,上面代码限制ImageView和它展示的内容必须是同样大小的,否则就以实际显示图片的Rect作为“圆角矩形画框”的Rect。

Android有关2D和3D的很多操作,像上面的clipPath和Xfermode,底层都是native方式执行的,framework层几乎只是很薄的C++包装。而且是比较专业的知识了,到底要了解多少,就看自己的app的需求,以及兴趣了。

(本文使用Atom编写)

圆形在我们日常生活中比较常见,在纸张上画一个圆形,我们会通过圆规去画,轻而易举。那么我们是否注意过,在一些物品的标签中也会出现圆形。标签是通过制作的,像防伪标签、货物流动标签等,在标签制作软件中是可以根据实际需求自定义设置标签规格、标签内容的,所以有时候标签中就需要绘制圆形或是椭圆形、圆角矩形等等,那么今天我们就来讲下,在中是如何绘制圆形的?

1.在领跑条码打印软件中新建一个标签,并绘制圆形。

选择左侧工具栏中“椭圆形”图标按钮,然后按住shift键不放,点击鼠标左键,确定起点,然后拖拽鼠标,在标签空白处绘制图形,再点一下鼠标左键结束绘制。如下图所示:

2.设置圆形的图形属性。

在标签上选中圆形,双击鼠标左键,或者是在圆形上右击鼠标选择属性,会弹出“图形属性”窗口。在该窗口下可以对圆形进行描边,填充颜色等个性化设置。在“图形属性”窗口下,选择“样式”选项卡。选择线型为点线、颜色为绿色、粗细输入0.2,就可以得到如下图所示的效果图。

  在领跑中除了可以设置圆形边线外,还可以对圆形内部进行填充设置。填充中的类型包括实心、点线、斜线、网格、渐变色等多种形态;背景色可以设置圆形内部的背景颜色;底纹类型及后面的颜色则是针对填充类型里面的线型进行再次编辑设置;线宽和线距可以根据实际需求进行设置。

那么这里我们分别设置圆形的类型为“竖线”,背景色为“黄色”,底纹为“点线”,底纹颜色为“红色”,线宽0.1,线距为4,就得到如下图所示的效果图,仔细观察效果还是很明显的。

    另外,在“样式”选项下,还有一个“不可见”的功能,就是说,如果勾选了此项,圆形就不存在了,在特殊需要时,该功能也是很实用的。“图形属性”窗口下,除了“样式”选项外,还有“基本”功能选项,可以对圆形的名称、尺寸大小等进行设置。也是很容易操作的。

    以上就是在中绘制圆形的方法,用这种方法,也可以进行绘制直线。总之,在软件中有很多实用的小技巧,都体现了这款的智能和灵活性。

    先将圆规在直尺上量定9毫米,然后再150度夹角处用圆规绘制R9,使R9与150度角的两边相切即可。

    来自知道合伙人认证行家

      这是两相交直线间的圆弧连接。连接圆弧的圆心一定在距离两直线为R9的平行线上。

      画法:1,确定圆心是关键:以9MM分别做150゜两夹角边的平行线,两平行线的交点即为R9的圆心。

      2,连接点不可忽视:连接点在,过R9圆心分别向两直线做垂线,两垂足即为两个连接点。

      3,以确定的圆心为圆心,以R9为半径,从一连接点画至另一连接点。画图完毕。

    找R9的圆心是关键:先画出夹角150度的两直线,然后分别作这两条直线的平行线(距离是半径9),交点即为圆心。

    陶瓷耐磨弯头弯曲半径设计研发生产,球形弯头的设计,双金属耐磨弯头耐高压工艺。消失模铸造工艺。

    首先定好9mm的半径,其次找到起弧位置画出度数对应的弧,就ok了,不过要注意圆心要放在弧的中间。

我要回帖

更多关于 怎样用圆规画宽为√2的长方形 的文章

 

随机推荐