自定义控件的概念和view类的重要性
自定义控件的概念:Android中组件必须是View的直接子类或间接的子类,其中view有一个viewGroup的子类,用于定义容器,(FramenLayout,LinearLayout.....,都是ViewGroup的子类).
如果组件中还有子组件,就是从ViewGroup类继承,否则从view类继承,view类就相当于控件的上帝一样,只要你自定义控件,要么是view的直接子类,要么就是view的间接子类
View类定义组件相关的通用功能,只要是自定义控件一定会和view产生关系.所以view是我们开发者必须要详细理解的类.
自定义view的三种形式:
1.扩展式自定义view继承自Android原生特定的view.如TextView,ImageView等等,我们通过重写onDraw等回调方法进行扩展!其实我们想要的功能或者形式!
注意:该方法实现的自定义view控件不需要自己支持wrap_content和padding.(因为继承的View已经实现了)
2.组合式自定义view继承自viewGroup其中的子View(LinearLayout,RelativityLayout,FramLayout....)当某种效果看起来像几种View组合在一起实现的时候,我们就可以用这种方法.
注意:该方法实现自定义View不需要自己处理ViewGroup的测量和布局这两个过程.
3.完成自定义View继承自View(Android中所有空间的基类),通常实现一些不方便布局的组合方式来达到的需求,静态或动态的显示一些不规则的控件或图形
注意:该方法实现的自定义View需要自己支持wrap_content和Padding(完成从无到有,系统是无法确定.必须自己操作)
实现步骤:
( 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个效果图(圆,文字,三角形):
文章图片
文章图片
文章图片
【自定义控件的概念和view类的重要性】
推荐阅读
- 热闹中的孤独
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 放屁有这三个特征的,请注意啦!这说明你的身体毒素太多
- 一个人的旅行,三亚
- 布丽吉特,人生绝对的赢家
- 慢慢的美丽
- 尽力
- 一个小故事,我的思考。
- 家乡的那条小河
- 《真与假的困惑》???|《真与假的困惑》??? ——致良知是一种伟大的力量