注意:该方法实现的自定义view控件不需要自己支持wrap_content和padding.(因为继承的View已经实现了)
2.组合式自定义view继承自viewGroup其中的子View(LinearLayout,RelativityLayout,FramLayout....)当某种效果看起来像几种View组合在一起实现的时候,我们就可以用这种方法.
注意:该方法实现自定义View不需要自己处理ViewGroup的测量和布局这两个过程.
实现步骤:
( 1.)首先创建一个类,继承View,
( 2.)重写红色框中的方法,因为在实际开发过程当中第4个方法相对而言我们用的比较少,最后点击ok就自动帮你实现好了这三个方法
Java代码
在这里我实现了三个画图:圆,直线,三角形.
public class MyView extends View {
//为画笔建立全局对象
private Paint mPaint;
//在代码中添加我们自定义View时,所调用的构造方法
public MyView(Context context) {
super(context);
//在构造方法里初始化画笔对象
mPaint = newPaint();
}
//在布局XML文件中添加我们自定义的控件时,所调用的方法,多了一个参数AttributeSet
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
System.out.println("MyView(Context context,AttributeSet attrs)我被调用了");
//在构造方法里初始化画笔的对象
mPaint = newPaint();
}
//这个方法一般我们用不到,不是系统调用,需要我们事先调用并给defStyleAttr传值,多了一个参数
//引用style资源的属性参数,也就是我们可以在style中为自定义View定义一个默认的属性样式然后添加进来
public MyView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
//测量view控件,决定控件在手机所占位置的大小
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
在这里重点给大家细说一下实现画笔的一些参数:
//设置画笔的属性,在构造方法里进行了初始化
@NonNull
private Paint newPaint(){
//1.0画笔
Paint paint = new Paint();
//设置抗锯齿
paint.setAntiAlias(true);
//设置画笔的宽度
paint.setStrokeWidth(3);
//设置画笔的颜色
paint.setColor(Color.BLUE);
//设置画笔的样式 Style.STROKE:画笔为空心 Paint.Style.FILL_AND_STROKE和Paint.Sryle.FILL画笔为实心
paint.setStyle(Paint.Style.STROKE);
//设置画笔绘制的文本的字体大小
paint.setTextSize(60);
return paint;
}
//绘制了控件,决定了控件呈现的样式,参数就是画布,可以直接使用
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//2.0 画布
//绘制一个圆,参数1和2:指定的就是圆心,参数3:指定的半径R 参数4:画笔
// canvas.drawCircle(100, 100, 80, paint);
//绘制一个文本参数1:要画的文本 参数2和3画的启示坐标paint 参数4:画笔
// canvas.drawText("带你走向人生巅峰", 100, 400, paint);
//绘制直线,参数1和2:开始画直线的坐标 参数3和4:直线结束的坐标 参数5:画笔
// canvas.drawLine(200, 200, 200, 500, paint);
//绘制路径,首先创建路径对象
Path path = new Path();
//移动到一个平台
path.moveTo(60, 60);
path.moveTo(120, 0);
path.moveTo(180, 120);
//绘制直线
path.lineTo(60, 60);
path.lineTo(120, 0);
path.lineTo(180, 120);
//图像闭合
path.close();
//开始画,参数1:path对象, 参数2:画笔
canvas.drawPath(path, mPaint);
}
}
1:首先我们创建一个Paint(画笔)的对象,也就是说我们画图的时候是不是先得有个笔啊?那么在这里我们也得需要先创建一个画笔.
2:然后通过:paint.setAntiAlias(true)是设置图像的像素点的
3:paint.setStrokeWidth(3)是设置画笔的宽度,通过下面两张图我们可以看出,左1的图要细点,我们在看看右2的这张图明显是不是加粗了许多,如果想要设置画笔的粗和细修改你的参数,参数值越大,画出来的图形就越粗.
4:paint.setColor(Color.BLUE)是设置画笔的颜色,我设置的是蓝色,你也可以选择其它的颜色,这个呢,其实很简单的,我就不细说啦
5:paint.setStyle(Paint.Stryle.STROKE)通过这两个参数可以设置你绘的图是空心还是实心,STROKE是(空心),FILL_AND_STROKE是(实心),如下图:
Java布局:
最后添加你写好的自定义控件
这张图阐述了手机屏幕在android中实际是被划分成X,Y轴坐标
最终实现的3个效果图(圆,文字,三角形):