本菜最近整理了一下Android自定义View的代码实现(大神勿喷),适合Android初级开发人员学习,有任何错误或问题欢迎留言。首先介绍一下什么是自定义view,我认为就是相对于谷歌封装好的view控件(TextView,ImageView等)来说自己定义的view控件。自定义view有三种形式:1、继承已有的控件,比如imageView,textView这些。2、继承view,一切从头开始。3、组合view,几个view拼接到一起,形成一个view
今天我们学习用自定义view画出圆,椭圆,扇形。
第一步:新建java类继承View,实现其构造方法。
public class MyView extends View {
//第一个构造方法是在你new一个控件的时候调用的
public MyView(Context context) {
this(context, null);
}
//第二个构造,在xml文件中写一个view会调用它,属性都在attrs里
public MyView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
//第三个构造是在xml文件中写的view有style,这种情况下调用
public MyView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
第二步:在init()方法中设置“画笔”
private void init() {
paint = new Paint();
//设置反锯齿
//反锯齿指把锯齿部分画的模糊,使看起来圆滑
paint.setAntiAlias(true);
//设置颜色
//参数是int类型,把int类型
paint.setColor(0xff0000ff);
//设置样式
//Paint.Style.STROKE对于图像描边
//FILL_AND_STROKE描边并填充
paint.setStyle(Paint.Style.STROKE);
//设置画笔的粗细
paint.setStrokeWidth(1);
}
第三步:在onDraw()方法中“画圆”
//在onDraw方法中严禁new对象
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//画圆 第一个第二个参数是圆心的横纵坐标
//第三个是参数的半径,第四个参数是画笔
canvas.drawCircle(50, 50, 40, paint);
}
效果图:
画椭圆只需把第二部代码改成如下所示:新建一个RectF对象,RectF对象的四个参数分别是起始点位置横纵坐标和椭圆外接矩形最右边到最左边的距离,所以要求出椭圆的外接矩形的长就是110-10=80,同理可知其高度为60-10=50.
private Paint paint;
private RectF mRectF;
private void init() {
paint = new Paint();
//设置反锯齿
//反锯齿指把锯齿部分画的模糊,使看起来圆滑
paint.setAntiAlias(true);
//设置颜色
//参数是int类型,把int类型
paint.setColor(0xff0000ff);
//设置样式
//Paint.Style.STROKE对于图像描边
//FILL_AND_STROKE描边并填充
paint.setStyle(Paint.Style.STROKE);
//设置画笔的粗细
paint.setStrokeWidth(5);
//做一个RectF的对象
mRectF = new RectF(10, 10, 110, 60);
}
把第三部改成如下所示:
</pre><pre name="code" class="html"> protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawOval(mRectF,paint);
}
效果图如下:
<img src="https://img-blog.csdn.net/20161016000521756?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
画扇形只需把第三部分代码修改如下:
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//画扇形
//第一个参数是用一个RectF来描述,这个扇形是哪个圆的一部分
//第二个参数是开始的度数(从圆心出发,水平右射线方向为0度,顺时针旋转的角度)
//第三个参数是,扇形扫过区域的角度
//第四个参数是,是否连接圆心
//第五个参数是,画笔
canvas.drawArc(mRectF,30,120,true,paint);
}
效果图如下: