自定义view时常常要自己画图形,现在就把它总结总结:
基本上用到的类和函数:
View,
Canvas:画布
Paint:画笔
Path:画线:
用到的函数:
Canvas:下的
首先:新建个对象Canvas canvas=new Canvas();若是重写protected void onDraw(Canvas canvas) 可直接获取Canvas对象
canvas.drawColor(Color.WHITE); //设置画布背景颜色
canvas.drawCircle(40, 40, 30, paint); //画圆形 :参数为圆形坐标x,圆形坐标y,半径,画笔
canvas.drawRect(10, 90, 70, 150, paint); //画矩阵 :参数为矩阵的左上点的(x,y),右下角的(x,y),画笔
canvas.drawRect(10, 170, 70, 200, paint); //矩阵 : 同上一条
canvas.drawOval(new RectF(10, 220, 70, 250), paint); //画椭圆 : 矩阵,画笔
Path: 可以画各种图形:三角形,矩阵,正方形,长方形,等边形,各种形状
三角形:
Path path = new Path(); //路径类
path.moveTo(10, 330); //鼠标移动到点坐标(10,330),起始位置
path.lineTo(70, 330); //从起始位置,画条线到(70,330)
path.lineTo(40, 270); //从起始位置画条线到(40,270)
path.close(); // 把点连起来(3点相连)
canvas.drawPath(path, paint); //画路径 //可以看到是个三角形
梯形:
Path path = new Path(); //路径类
path.moveTo(10, 330); //鼠标移动到点坐标(10,330),起始位置
path.lineTo(70, 330); //从起始位置,画条线到(70,330)
path.lineTo(40, 270); //从起始位置画条线到(40,270)
path.lineTo(50,320) //从起始位置画条线到(60,270)
path.close(); // 把点连起来(4点相连)
canvas.drawPath(path, paint); //画路径 //可以看到是个梯形
除了画直线,也可以画曲线:
Path path1 = new Path();//贝赛尔曲线
path1.moveTo(10, 410);//绘画基点
path1.quadTo(200, 100, 390, 410); //前两个参数控制点坐标(x,y),后两个参数重点坐标(x,y)
path1.close();//把开始的点和最后的点连接在一起,构成一个封闭图形
canvas.drawPath(path1, paint);
上面那么多函数中我们都看到paint这个东东,就是画笔来的:
Paint:
新建一只画笔:为其设置好是各种参数:颜色,尺寸,空实心,渐变等等:
Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setColor(Color.RED); //颜色
paint.setStyle(Paint.Style.STROKE);//设置为空心
paint.setStrokeWidth(3); //线的宽度
Shader mShader = new LinearGradient(15, 15, 100, 100,
new int[] { Color.RED, Color.GREEN, Color.BLUE, Color.YELLOW },
null, Shader.TileMode.REPEAT);
// Shader.TileMode三种模式
// REPEAT:沿着渐变方向循环重复
// CLAMP:如果在预先定义的范围外画的话,就重复边界的颜色
// MIRROR:与REPEAT一样都是循环重复,但这个会对称重复
paint.setShader(mShader);// 用Shader中定义定义的颜色来话
弄个例子:
public class GravdView extends View{
public GravdView(Context context){super(context);}
public GravdView(Context context, AttributeSet attrs){super(context, attrs);}
public GravdView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
// TODO Auto-generated constructor stub
Canvas canvas=new Canvas();
}
@Override
protected void onDraw(Canvas canvas)
{
super.onDraw(canvas);
canvas.drawColor(Color.WHITE);
Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setColor(Color.RED);
paint.setStyle(Paint.Style.STROKE);//设置为空心
paint.setStrokeWidth(3);
canvas.drawCircle(40, 40, 30, paint);
canvas.drawRect(10, 90, 70, 150, paint);
canvas.drawRect(10, 170, 70, 200, paint);
canvas.drawOval(new RectF(10, 220, 70, 250), paint);
Path path = new Path();//三角形
path.moveTo(10, 330);
path.lineTo(70, 330);
path.lineTo(40, 270);
path.close();
canvas.drawPath(path, paint);
Path path1 = new Path();//梯形
path1.moveTo(10, 410);//绘画基点
// path1.lineTo(70, 410);
path1.quadTo(200, 100, 390, 410);
// path1.lineTo(55, 350);
// path1.lineTo(25, 350);
path1.close();//把开始的点和最后的点连接在一起,构成一个封闭图形
/*
* 最重要的就是movtTo和close,如果是Style.FILL的话,不设置close,也没有区别,可是如果是STROKE模式,
* 如果不设置close,图形不封闭。
*
* 当然,你也可以不设置close,再添加一条线,效果一样。
*/
canvas.drawPath(path1, paint);
///////////////////////////////////////第二列
paint.setColor(Color.BLUE);
paint.setStyle(Paint.Style.FILL);//设置实心
canvas.drawCircle(120, 40, 30, paint);
canvas.drawRect(90, 90, 150, 150, paint);
canvas.drawRect(90, 170, 150, 200, paint);
RectF re2 = new RectF(90, 220, 150, 250);
canvas.drawOval(re2, paint);
Path path2 = new Path();
path2.moveTo(90, 330);
path2.lineTo(150, 330);
path2.lineTo(120, 270);
path2.close();
canvas.drawPath(path2, paint);
Path path3 = new Path();
path3.moveTo(90, 410);
path3.lineTo(150, 410);
path3.lineTo(135, 350);
path3.lineTo(105, 350);
path3.close();
canvas.drawPath(path3, paint);
////////////////////////////////////////////////////第三列
/*
* LinearGradient shader = new LinearGradient(0, 0, endX, endY, new
* int[]{startColor, midleColor, endColor},new float[]{0 , 0.5f,
* 1.0f}, TileMode.MIRROR);
* 参数一为渐变起初点坐标x位置,参数二为y轴位置,参数三和四分辨对应渐变终点
* 其中参数new int[]{startColor, midleColor,endColor}是参与渐变效果的颜色集合,
* 其中参数new float[]{0 , 0.5f, 1.0f}是定义每个颜色处于的渐变相对位置, 这个参数可以为null,如果为null表示所有的颜色按顺序均匀的分布
*/
Shader mShader = new LinearGradient(15, 15, 100, 100,
new int[] { Color.RED, Color.GREEN, Color.BLUE, Color.YELLOW },
null, Shader.TileMode.REPEAT);
// Shader.TileMode三种模式
// REPEAT:沿着渐变方向循环重复
// CLAMP:如果在预先定义的范围外画的话,就重复边界的颜色
// MIRROR:与REPEAT一样都是循环重复,但这个会对称重复
paint.setShader(mShader);// 用Shader中定义定义的颜色来话
canvas.drawCircle(200, 40, 30, paint);
canvas.drawRect(170, 90, 230, 150, paint);
canvas.drawRect(170, 170, 230, 200, paint);
RectF re3 = new RectF(170, 220, 230, 250);
canvas.drawOval(re3, paint);
Path path4 = new Path();
path4.moveTo(170, 330);
path4.lineTo(230, 330);
path4.lineTo(200, 270);
path4.close();
canvas.drawPath(path4, paint);
Path path5 = new Path();
path5.moveTo(170, 410);
path5.lineTo(230, 410);
path5.lineTo(215, 350);
path5.lineTo(185, 350);
path5.close();
canvas.drawPath(path5, paint);
//////////////////////////////////第4列
paint.setTextSize(24);
canvas.drawText("圆形", 240, 50, paint);
canvas.drawText("正方形", 240, 120, paint);
canvas.drawText("长方形", 240, 190, paint);
canvas.drawText("椭圆形", 240, 250, paint);
canvas.drawText("三角形", 240, 320, paint);
canvas.drawText("梯形", 240, 390, paint);
}
}