自定义View基础

来源:互联网 发布:cf端游刷枪软件安卓版 编辑:程序博客网 时间:2024/06/06 04:54

一,自定义View概述

定义:系统内部的控件无法满足用户需求时,需要用户自己去创建相应的UI布局

 

二,自定义View的分类

1,使用现有的控件组合成新的控件

2,继承已有的控件创建新的控件   

3,直接继承自View类创建新的控件

4,直接继承自ViewGroup类创建的新的控件

 

三,自定义View的作用

创建和系统UI不一样的UI控件

 

四,使用现有的控件组合成新的控件


五,相关的绘制类

Canvas  画布

通过该类提供的方法,可以绘制各种图形,如,矩形,圆形,和线条等,通常情况下,要在Andaroid中绘图,需要先创建一个继承自View类的视图,并且在该类中重写它的onDraw(Canvas canvas)方法,然后在显示绘图的Activity中添加该视图

 

Paint    画笔

Paint类代表画笔,用来描述图形的颜色和风格,如线宽,颜色,透明度,和填充效果等信息,使用Paint时,需要先创建该类的对象,这可以通过该类提供的构造方法来实现。通常情况下,只需要使用无参数的构造方法来创建一个使用默认设置的Paint对象:

方法

描述

setColor(int color)

用于设置颜色,参数color可以通过Color类提供的颜色常量指定,也可以通过Color.rgb(int red,int green,int blue)方法指定

setAlpha(int a)

用于设置透明度,值为0~255之间的整数

setAntiAlias(boolean aa)

用于指定是否使用抗锯齿功能,如果使用会使绘图速度变慢

setDither(boolean dither)

用于指定是否使用图像抖动处理,如果使用会使图像颜色更加平滑和饱满,更加清晰

setShader(Shader shader)

用于设置渐变,可以使用LinearGradient(线性渐变)、RadialGradient(径向渐变)或者SweepGradient(角度渐变)

setShadowLayer(float radius, float dx, float dy, int color)

用于设置阴影,参数radius为阴影的角度,dxdy为阴影在x轴和y轴上的距离,color为阴影的颜色。如果参数radius的值为0,那么将没有阴影

setStrokeCap(Paint.Cap cap)

用于当画笔的填充样式为STROKEFILL_AND_STROKE时,设置笔刷的图形样式,参数值可以是Cap.BUTTCap.ROUNDCap.SQUARE。主要体现在线的端点上

setStrokeJoin(Paint.Join join)

用于设置画笔转弯处的连接风格,参数值为Join.BEVELJoin.MITERJoin.ROUND

setStrokeWidth(float width)

用于设置笔触的宽度

setStyle(Paint.Style style)

用于设置填充风格,参数值为Style.FILLStyle.FILL_AND_STROKEStyle.STROKE

setTextAlign(Paint.Align align)

用于设置绘制文本时的文字对齐方式,参数值为Align.CENTERAlign.LEFTAlign.RIGHT

setTextSize(float textSize)

用于设置绘制文本时的文字的大小

setFakeBoldText(boolean fakeBoldText)

用于设置是否为粗体文字

setXfermode(Xfermode xfermode)

用于设置图形重叠时的处理方式,例如合并、取交集或并集,经常用来制作橡皮的擦除效果



步骤一:创建自定义View类继承View
1
public class MyView extends View
步骤二:构造方法,初始化画笔
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
    //声明画笔
    private Paint paint;
 
    public MyView(Context context) {
        super(context);
        initPaint();
    }
 
    public MyView(Context context, AttributeSet attrs) {
        super(context, attrs);
        initPaint();
    }
 
    public MyView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initPaint();
    }
 
    /**
     * 初始化画笔
     */
    private void initPaint() {
        paint = new Paint();
    }
步骤三:实现onDraw方法
1
2
    @Override
    protected void onDraw(Canvas canvas)
步骤四:使用画笔在画布上绘画
    设置画笔
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        //重置画笔
        paint.reset();
        //设置画笔的颜色
        paint.setColor(Color.RED);
//        //设置填充样式为填充(默认)
//        paint.setStyle(Paint.Style.FILL);
//        //设置填充样式为描边
//        paint.setStyle(Paint.Style.STROKE);
        //设置画笔的粗细
        paint.setStrokeWidth(20);
        //设置坑锯齿
        paint.setAntiAlias(true);
        //设置透明度
        paint.setAlpha(100);
    画点
1
2
        //画点--参数,点XY坐标,画笔
        canvas.drawPoint(100100, paint);
    画多点
1
2
3
4
5
6
        //坐标数组有四个点:(10,10)、(100,100),(200,200),(400,400))
        float []pts= {1010100100200,200,400,400};
        //多个点--参数,坐标数组,跳过的数值个数,绘制的数值个数,画笔
        //(绘制从的三个数值开始往后的4个数值--第二和第三个点)
        canvas.drawPoints(pts, 24, paint);
//        canvas.drawPoints(pts, paint);
    画线
1
2
        //画线--参数,开始XY坐标,结束XY坐标,画笔
        canvas.drawLine(101030010, paint);
    画多线
1
2
3
4
        //坐标数组有四个点:(10,10)、(100,100),(200,200),(400,400)),两两连成一条直线
        float []ptss={10,10,100,100,200,200,400,400};
        //画多条直线--参数,坐标数组,画笔
        canvas.drawLines(ptss, paint);
    矩形类(RectF和Rect,用法一致)
1
2
        //new一个矩形类--参数,矩形左上角XY坐标,矩形右下角XY坐标
        RectF oval=new RectF(getWidth()/2-150,getHeight()/2-150,getWidth() / 2 150, getHeight()/2+150);
    画矩形
1
2
3
        //画矩形--参数,矩形,画笔
        canvas.drawRect(oval, paint);
//        canvas.drawRect(getWidth()/2-150,getHeight()/2-150,getWidth() / 2 + 150, getHeight()/2+150, paint);
    画圆
1
2
        //画圆--参数圆心XY坐标,半径,画笔
        canvas.drawCircle(getWidth() / 2, getHeight() / 2150, paint);
    画椭圆
1
2
        //画椭圆--参数,外接矩形,画笔
        canvas.drawRect(oval, paint);
    画圆形矩形
1
2
        //画圆形矩形--参数,矩形,生成圆角的椭圆的X轴半径,生成圆角的椭圆的Y轴半径,画笔
        canvas.drawRoundRect(oval, 2010, paint);
    画弧
1
2
        //画弧度--参数,外接矩形,弧开始的角度(以X轴正方向为0度),弧持续的角度,是否有弧的两边,画笔
        canvas.drawArc(oval, 090true, paint);
    绘制文本
1
2
3
4
        //设置字体大小
        paint.setTextSize(50);
        //写文本--参数,文本内容,文本起始位置XY坐标(或者每个字符的位置的坐标数组),画笔
        canvas.drawText("文本", (getWidth() / 2), (getHeight() / 2), paint);
    重画(清除画布)
1
2
        //重画
        this.postInvalidate();

0 0
原创粉丝点击