自定义View
① 是什么 ?
就是自己写的一个View,可通过绘制,继承,组合 三种方式
② 怎么用
首先写一个类继承自View,继承父类的三个构造方法
在mxl 文件中引入这个类
<com.example.liyang.customview.CustomView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#528b1d"
/>
自定义View 画图 设,P*(色,心,粗),布色,图,p
自定义View 类中 继承 View // view : 透明的
重写 构造方法,我们首先要 构造方法中递归调用,在第一个构造方法中,调用第二个构造方法,
再在第二个构造方法中调用第三个构造方法 ,以便于在第三个 构造方法中初始化Paint
准备工作 :
让前两个构造函数调用 第三个 构造函数
在第三个构造函数中初始化 画笔 Paint
paint = new Paint();
1在 onDraw(Canvas canvas)先将画布置色 ,不然之前色易有残余
canvas.drawColor(Color.White);
2 paint 可以设置颜色,画笔粗细,样式(实心,空心)
paint.setStrokeWidth(10);
paint.setColor(Color.BLACK);
paint.setStyle(Paint.Style.STROKE);// 或者 FILL 实心
3.我们可以 利用 画笔 和 画布 去 进行绘画 (圆形,矩形,椭圆形..)
canvas.drawPoint(100,100,paint);
canvas.drawLine(200,200,400,400,paint);
canvas.drawRect(300,300,600,700,paint);
canvas.drawCircle(500,500,300,paint);
canvas.drawArc(new RectF(200,500,600,900),0,90,true,paint);
绘制多边形:三角形,正五星..
绘制 多边形, 在绘制多边
① 构建Path 对象利用它的服务
② 利用 path moveTo() ; 与 lineTo() 方法进行绘制
③ canvas.drawPath(path,paint); // 画一下即可
当然我们还可以使用 弧形去连接 两个点
path.arcTo(new RectF(100,100,200,200),0,90,true)
最后我们还可以 画文字
paint.setTextSize();
canvas.drawText("",100,,100,paint);
我们还可以得到 画笔 所划线的 顶部底部等,我们可以通过
Paint.FontMetrics metrics = paint.getFontMetrics(); 的属性进行
文字的书写
top bottom 基准线 leading 以基准线 为 y值坐标 写的这个文字
bttom 其实就是一个偏移量
实现文字恰好位于杠上:
canvas.drawColor(Color.WHITE);
Paint.FontMetrics metrics = paint.getFontMetrics();
paint.setStyle(Paint.Style.STROKE);
canvas.drawRect(100,100,1000,300,paint);
paint.setTextSize(50);
canvas.drawText("测试下对齐了吗",100,100-metrics.bottom,paint);
常用字体属性
载图,set pro post rst
载入图片
注意载入图片属于耗时操作 不能写在 onDraw()方法里
BitmapFactory.deodeResource(context.getResource(),R.mipmap...);
canvas.drawBitmap(bitmap,100,100,paint);
设置矩阵
Matric matrix = new Matrix(); // 12 种属性
![这里写图片描述](https://img-blog.csdn.net/20160328190509989)
通常我们画出来的圆 周边带有 锯齿 ,我们可以开启 抗锯齿,让他们模糊
paint.setAntiAlias(true);
线性渐变 三种模式渐变 cmr
LinearGradient linearGradient = new LinearGradient(100, 100, 500, 100, Color.RED, Color.BLUE, Shader.TileMode.CLAMP);
paint.setShader(linearGradient);
sharder 瓦片模式
彩虹的多彩变化
彩虹色的属性是设置给 画笔的
paint.setSharder(线性,扇形(不存在某个点不在瓦片范围之内),环形(圆))
头像圆形 用sharder 来做 画布移动 与矩阵恢复
有两种 瓦片模式 ,水平 和 垂直 方向上 都有可能超过 图片的范围
SweepGradient sweepGradient = new SweepGradient(getWidth() / 2, getHeight() / 2,
new int[]{0xffff0000,0xffff8800,0xffffff00,0xff00ff00,0xff00ffff,0xff0000ff,0xffff00ff},
new float[]{0,1.0f/6,2.0f/6,3.0f/6,4.0f/6,5.0f/6,1});
paint.setShader(sweepGradient);
BitmapShader bitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
paint.setShader(bitmapShader);
int cir = bitmap.getWidth() / 2;
canvas.save();
//移动我们的画布 达到 头像移动的目的 那要是 多个头像呢
canvas.translate(500-cir,500-cir);
paint.setAntiAlias(true);
canvas.drawCircle(cir,cir,cir,paint);
//恢复上一次矩阵
canvas.restore();
canvas.drawCircle(cir,cir,cir,paint);