Android绘图最基本的三个对象Color, Canvas, Paint, 均在android.graphics包下。

1)Color : 颜色对象 ----> 颜料

Color.颜色名,来获取颜色。

argb方法,可以调出颜色。

2)Paint : 画笔对象 ----> 画笔

Paint的设置方法
setAntiAlas() 设置画笔的锯齿效果 setColor() 设置画笔颜色
setARGB() 设置画笔的a,r,g,b值 setAlpha() 设置Alpha值
setTextSize() 设置字体尺寸 setStyle() 设置画笔风格,空心或实心
setStokeWidth() 设置空心的边框宽度 getColor() 得到画笔的颜色
getAlpha() 得到画笔的Alpha值

3)Canvas : 画布对象 ----> 画板

Canvas绘制常见方法
drawLine() 绘制直线
drawRect() 绘制矩形
drawCircle() 绘制圆形

Start from Here....

现在想完成一个简单的Chrome的logo的绘制,需要完成下图这样的效果:


android绘图画Chrome图标

代码如下:

方案一:最复杂的方法

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绘图画Chrome图标

附录:(一些项目中遇到的小问题)

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的时候,画布的坐标系也会跟着旋转。

更多相关文章

  1. Android Activity启动和退出过程中onResume()方法的回调
  2. andorid跳过系统API获取以太网IP,网关,DNS,MAC的方法
  3. 【Android】关联source code的方法
  4. [转]NDK中log输出方法
  5. Android应用程序设置系统时间的方法
  6. Android官方使低版本系统(2.1)支持ActionBar的方法
  7. Androi与html中的JavaScript之间方法相互调用

随机推荐

  1. Android(安卓)来电(包括铃声),短信拦截的
  2. Android中I/O
  3. android接口调试工具
  4. Android(安卓)task和back stack详解四:int
  5. Android(安卓)React Native的使用细节问
  6. Android(安卓)BSP成长计划随笔之虚拟设备
  7. androidStudio开发安卓APP的五种框架布局
  8. Android结构及Applications与Application
  9. 【Android】混合开发之WebView的介绍及使
  10. Android(安卓)布局阴影实现