Android绘图最基本的三个对象Color, Canvas, Paint, 均在android.graphics包下。
1) Color : 颜色对象 ----> 颜料
Color.颜色名,来获取颜色。
argb方法,可以调出颜色。
2) Paint : 画笔对象 ----> 画笔
setAntiAlas() | 设置画笔的锯齿效果 | setColor() | 设置画笔颜色 |
setARGB() | 设置画笔的a,r,g,b值 | setAlpha() | 设置Alpha值 |
setTextSize() | 设置字体尺寸 | setStyle() | 设置画笔风格,空心或实心 |
setStokeWidth() | 设置空心的边框宽度 | getColor() | 得到画笔的颜色 |
getAlpha() | 得到画笔的Alpha值 |
3) Canvas : 画布对象 ----> 画板
drawLine() | 绘制直线 |
drawRect() | 绘制矩形 |
drawCircle() | 绘制圆形 |
Start from Here....
现在想完成一个简单的Chrome的logo的绘制,需要完成下图这样的效果:
代码如下:
方案一:最复杂的方法
public class CanvasView extends View { private int cx; private int cy; public CanvasView(Context context) { super(context); } @Override protected void onDraw(Canvas canvas) { cx = getMeasuredWidth() / 2; cy = getMeasuredHeight() / 2; int innerCr = DensityUtils.dip2px(getContext(), 45); int outerCr = DensityUtils.dip2px(getContext(), 50); int wholeCr = DensityUtils.dip2px(getContext(), 100); Paint paint = new Paint(); paint.setAntiAlias(true); paint.setStyle(Paint.Style.FILL); paint.setStrokeWidth(1); //将整个背景填充为灰色 paint.setColor(Color.GRAY); canvas.drawPaint(paint); Path path = new Path(); RectF innerRectF = new RectF(cx - outerCr, cy - outerCr, cx + outerCr, cy + outerCr); RectF outerRectF = new RectF(cx - wholeCr, cy - wholeCr, cx + wholeCr, cy + wholeCr); //红色叶瓣 path.addArc(innerRectF, 150, 120); path.lineTo((float)(cx + Math.sqrt(3.0) * outerCr), cy - outerCr); path.addArc(outerRectF, -30, -120); path.lineTo((float)(cx - Math.sqrt(3.0) * outerCr / 2), cy + outerCr / 2); paint.setColor(Color.RED); canvas.drawPath(path, paint); path.reset(); //黄色叶瓣 path.addArc(innerRectF, 30, -120); path.lineTo((float)(cx + Math.sqrt(3.0) * outerCr), cy - outerCr); path.addArc(outerRectF, -30, 120); path.lineTo((float)(cx + Math.sqrt(3.0) * outerCr / 2), cy + outerCr / 2); paint.setColor(Color.YELLOW); canvas.drawPath(path, paint); path.reset(); //绿色叶瓣 path.addArc(innerRectF, 150, -120); path.lineTo(cx, cy + wholeCr); path.addArc(outerRectF, 90, 120); path.lineTo((float)(cx - Math.sqrt(3.0) * outerCr / 2), cy + outerCr / 2); paint.setColor(Color.GREEN); canvas.drawPath(path, paint); path.reset(); //中心的圆 drawCenterCircle(paint, canvas, outerCr, innerCr); super.onDraw(canvas); } private void drawCenterCircle(Paint paint, Canvas canvas, int outerCircleR, int innerCircleR){ paint.setColor(Color.WHITE); canvas.drawCircle(cx, cy, outerCircleR, paint);//绘制白色外圆 paint.setColor(Color.BLUE); canvas.drawCircle(cx, cy, innerCircleR, paint);//绘制蓝色内圆 } }
方案二:旋转canvas。
//红色叶瓣 path.addArc(innerRectF, 150, 120); path.lineTo((float)(cx + Math.sqrt(3.0) * outerCr), cy - outerCr); path.addArc(outerRectF, -30, -120); path.lineTo((float)(cx - Math.sqrt(3.0) * outerCr / 2), cy + outerCr / 2); paint.setColor(Color.RED); canvas.drawPath(path, paint); //黄色叶瓣 canvas.rotate(120, cx, cy); paint.setColor(Color.YELLOW); canvas.drawPath(path, paint); //绿色叶瓣 canvas.rotate(120, cx, cy); paint.setColor(Color.GREEN); canvas.drawPath(path, paint);
方案三:旋转path。
//红色叶瓣 path.addArc(innerRectF, 150, 120); path.lineTo((float)(cx + Math.sqrt(3.0) * outerCr), cy - outerCr); path.addArc(outerRectF, -30, -120); path.lineTo((float)(cx - Math.sqrt(3.0) * outerCr / 2), cy + outerCr / 2); paint.setColor(Color.RED); canvas.drawPath(path, paint); Matrix matrix = new Matrix(); matrix.setRotate(120, cx, cy); //黄色叶瓣 path.transform(matrix); paint.setColor(Color.YELLOW); canvas.drawPath(path, paint); //绿色叶瓣 path.transform(matrix); paint.setColor(Color.GREEN); canvas.drawPath(path, paint);
效果如下:
附录:(一些项目中遇到的小问题)
Android中dp和px之间进行转换:
import android.content.Context; public class DensityUtil { //根据手机的分辨率从 dp 的单位 转成为 px(像素) public static int dip2px(Context context, float dpValue) { final float scale = context.getResources().getDisplayMetrics().density; return (int) (dpValue * scale + 0.5f); } //根据手机的分辨率从 px(像素) 的单位 转成为 dp public static int px2dip(Context context, float pxValue) { final float scale = context.getResources().getDisplayMetrics().density; return (int) (pxValue / scale + 0.5f); } }
Android绘图抗锯齿:
方法1:
给Paint加上抗锯齿标志。然后将Paint对象作为参数传给canvas的绘制方法。
paint.setAntiAlias(true);
方法2:
给Canvas加上抗锯齿标志。有些地方不能用paint的,就直接给canvas加抗锯齿,更方便。
canvas.setDrawFilter(new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG|Paint.FILTER_BITMAP_FLAG));
Canvas中rotate()方法的理解:
画图的canvas和显示没有关系。当canvas旋转后,绘制的图形还是只能在canvas内,并且坐标是按照canvas旋转之前来的,也就是左上角坐标仍然是(0,0),右下角的坐标仍然是(width,height)。也就是说旋转canvas的时候,画布的坐标系也会跟着旋转。
相关推荐
可以考虑使用局部更新(仅重绘改变的部分)、双缓冲(在后台缓冲区绘图,再一次性更新到LCD)等技术来提高效率。 6. **模拟器运行**:描述中提到这个示例是在模拟器上运行的,这意味着开发者可以在没有实际硬件的...
本项目"Android 画板(白板)源码 涂鸦 画图 图画"提供了一个完整的实现,让用户能够自由地进行绘图操作。以下是基于该源码的主要知识点: 1. **绘图基础**: - Android的`Canvas`类:它是Android图形系统的核心,...
- **图形元件(Graphic)**:主要用于静态图像,如背景、图标等。在图形元件中进行的任何编辑不会影响舞台上已有的实例,但新实例会反映出这些变化。 - **按钮元件(Button)**:专门用于创建交互式按钮,有四个帧...
python爱心代码高级
在Android平台上进行天地图开发,主要是为了让移动应用能够接入并展示天地图提供的地理信息数据,为用户提供基于位置的服务。天地图是由中国国家测绘局主导建设的全国统一的地理信息公共服务平台,提供了丰富的测绘...
在Android开发中,创建一个互动的画板应用是一项有趣且实用的任务。这个“android 画板,白板,画图”模块提供了一种简单的方法,让用户可以在屏幕上进行涂鸦、绘图、添加文字以及处理图像,非常适合用于教育、设计...
发布:用户及管理人员可以发布绘本,编辑书籍名称、封面、内容图画文字以及上传音频等; 本研究计划运用所学知识,设计一个基于Android平台的儿童绘本阅读应用,项目使用 J2EE平台开发工具来进行开发,使用Java...
绘本作为一种历史古老、效果优秀的早教手段,利用图画和简短的文字构筑出一个跌宕起伏的故事,同时又不受时间、空间限制,深受儿童和年轻父母的推崇。伴随科技进步,将智能终端与绘本相结合,在传统纸媒提供的视觉...
最后,考虑到这是一个面向儿童的应用,界面设计应当简洁易懂,色彩鲜艳,图标和文字应尽可能大且清晰。为了保护孩子的视力,避免使用过于刺眼的颜色,并确保应用符合儿童隐私保护的相关规定。 总结来说,开发“婴儿...
在Android开发中,创建一个图画板应用是一种常见的需求,它允许用户通过手势进行自由绘画、撤销操作以及保存作品。这个"Android 图画板Demo"旨在教你如何构建这样一个功能丰富的交互式绘图应用。 首先,我们需要...
在Android开发领域,SuperMap iClient是一款强大的地理信息系统(GIS)库,它为开发者提供了丰富的地图操作和空间分析功能。本篇文章将详细讲解如何利用SuperMap iClient for Android实现绘制圆对象,帮助开发者在...
在VC++编程环境中,位图画刷(Bitmap Brush)是一种重要的图形绘制工具,它允许程序员用位图填充图形区域。位图背景与位图画刷的概念密切相关,它们是Windows GDI(Graphics Device Interface)图形系统的一部分,...
标题中的“把图画转换成文字图画的软件”指的是利用特定的技术将图像中的视觉元素转化为由文字组成的图形。这种软件通常用于将复杂的图像信息转化为可读性强的文字描述,方便用户理解和记录。这种技术在数据可视化、...
python绘图代码象型柱图画报栏图提取方式是百度网盘分享地址
用户可以从工具栏中选择实体、属性和关系图标,然后在画布上进行拖放操作。实体通常以矩形表示,内部包含其属性;属性则以椭圆形表示,与实体相连;关系则以线段或菱形表示,线段两端连接相关实体,菱形用于表示多对...
【标题】: "手绘线条图像会说话的图画.doc" 【描述】: 该文档主要探讨了关于手绘线条图像在美术教育中的作用,特别是针对中国民间剪纸艺术的欣赏和学习。课程旨在通过欣赏和实践,让学生理解并掌握剪纸的技巧,...
Android开发摄像头SurfaceView预览 背景画图(矩形和圆形) 实现(双surfaceview,顶层画矩形框,底层预览视频); UI:三个按钮 预览 摄像 图片保存,预览界面 可以显示(矩形和圆形等图画)
1. **窗口绘图**:利用QPainter在QWidget或QPaintDevice子类的对象上进行绘制,例如自定义控件的背景、按钮图标等。 2. **图形用户界面(GUI)设计**:QGraphicsView和QGraphicsScene可以构建出具有拖放、缩放和...
9. **性能优化**:在大规模图形绘制时,了解如何高效地管理图形上下文和内存,避免不必要的重绘,对提高应用性能至关重要。 10. **响应式设计**:如果你的应用需要适应不同设备或屏幕尺寸,理解如何根据屏幕大小...
正如公式“文 × 画 = 图画书”所示,图与文的结合使得故事内容远超单独的文字或图画所能表达的。 绘本的结构包括封面、环衬、扉页、正文和封底。封面通常与内容相关,有时与封底结合形成整体画面。环衬虽然常被...