上一篇我们介绍了使用Paint描画基本图形,这一篇我们学习使用Paint描画复杂图形。
首先我们描画一个五边形,描画无边形时需要使用到Path类。
android.graphics.Path
Path类封装了多个化合物(轮廓)组成的直线段,二次曲线,三次曲线的几何路径。它可以绘制与canvas.drawPath(path, paint),无论是填充或抚摸(基于涂料的样式),或它可用于削波或绘制路径上的文本。
简而言之:可以用他来画几何图形、画曲线、画基于路径的文本。这是个绘图的路径类。
Path类的主要方法:
方法 | 描述 |
---|---|
void addArc(RectF oval, float startAngle, float sweepAngle) | 画扇形(弧线) |
void addCircle(float x, float y, float radius, Path.Direction dir) | 画圆 |
void addRect(RectF rect, Path.Direction dir) void addRect(float left, float top, float right, float bottom, Path.Direction dir) | 画个矩形、四个参数对应与原点的相对距离的是个点。 |
void addRoundRect(RectF rect, float rx, float ry, Path.Direction dir) | 画圆角矩形 |
moveTo(float x, float y) | 设置下一个图形的开始点 |
lineTo(float x,float y) | 画一条从最后一点到当前点的线。 |
如下为画五边形的代码:
package com.example.drawdomo;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.view.View;
public class MyView extends View {
Context mContext;
Paint paint;
Path path;
public MyView(Context context) {
super(context);
mContext = context;
paint = new Paint();
path = new Path();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
paint.setColor(Color.RED);
paint.setStyle(Paint.Style.FILL);
paint.setStrokeWidth(5);
int centerX = getWidth()/2;
int centerY = getHeight()/2;
int length=300;
int[] xPoints = new int[5];
int[] yPoints = new int[5];
//计算5个顶点
for(int i=0;i<5;i++){
xPoints[i]=(int)(centerX+length*Math.sin(i*2*Math.PI/5));
yPoints[i]=(int)(centerY+length*Math.cos(i*2*Math.PI/5));
}
//移动到第1个点
path.moveTo(xPoints[0],yPoints[0]);
//根据另外4个点进行描画
for(int i=1;i<5;i++){
path.lineTo(xPoints[i],yPoints[i]);
}
path.close();
canvas.drawPath(path,paint);
}
}
如下为运行效果:
Domo代码:
然后我们再画一个太极的图形,这次没有使用Path类,而是描画了多个半圆和圆而形成的图案。
如下为画太极的代码:
package com.example.drawdomo;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Typeface;
import android.view.View;
public class MyView extends View {
Context mContext;
Paint paint;
public MyView(Context context) {
super(context);
mContext = context;
paint = new Paint();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//设置画布背景颜色
canvas.drawRGB(0,150,255);
paint.setColor(Color.BLACK);
paint.setStyle(Paint.Style.FILL); //设置为填充
paint.setAntiAlias(true);
int diameter;
int width = getWidth();
int height= getHeight();
if(width <= height) {
diameter = width;
}else{
diameter = height;
}
//画两个半圆
paint.setColor(Color.WHITE);
canvas.drawArc(0,0,diameter,diameter,-90,180,true,paint);
paint.setColor(Color.BLACK);
canvas.drawArc(0,0,diameter,diameter,90,180,true,paint);
//画两个小圆,形成圆中间的曲线
paint.setColor(Color.BLACK);
canvas.drawCircle(diameter/2,diameter/4,diameter/4,paint);
paint.setColor(Color.WHITE);
canvas.drawCircle(diameter/2,diameter*3/4,diameter/4,paint);
//画两个小圆点
paint.setColor(Color.WHITE);
canvas.drawCircle(diameter/2,diameter/4,diameter/24,paint);
paint.setColor(Color.BLACK);
canvas.drawCircle(diameter/2,diameter*3/4,diameter/24,paint);
paint.setColor(Color.RED);
paint.setTextSize(100);
paint.setStrokeWidth(5);
paint.setStyle(Paint.Style.STROKE); //设置为描边
paint.setFakeBoldText(true); //设置字体为粗体
canvas.drawText("志强不息,厚德载物",100,1300,paint);
}
}
如下为运行效果:
Domo代码: