• Android自定义控件属性函数


    一. Paint画笔

    (1) void setColor(int color) : 设置画笔颜色

            color只能取8位的0xAARRGGBB样式的颜色值,A代表透明度(Alpha),取值范围是0-255(对应十六进制数0x00-0xFF),取值越小,透明度越高,图像也越透明。当取0时,图像完全不可见。R:红色值,取值范围是0-255,取值越小,红色越少。G:绿色值,取值范围是0-255,取值越小,绿色越少。B:蓝色值,取值范围是0-255,取值越小,蓝色越少。

    (2) void setStyle(Style style) 设置填充样式

    style取值如下:

    Paint.Style.FILL  仅填充内部
    Paint.Style.STROKE 仅描边
    Paint.Style.FILL_AND_STROKE 填充内部和描边

    (3)void setStrokeWidth(float width) 设置描边宽度值,单位是px,当Paint的样式是STROKEFILL_AND_STROKE 时有效

    二.Canvas画布

    重写 void onDraw(Canvas canvas)函数

    (1)画布背景设置

    void drawColor(@ColorInt int color)   //0xffff00ff  紫色画布
    void drawARGB(int a, int r, int g, int b)   //(0xff,0xff,0,0xff)
    void drawRGB(int r, int g, int b)   //(0xff,0xff,0xff)
    

    (2)void drawLine(float startX, float startY, float stopX, float stopY, @NonNull Paint paint)

       参数说明:startX:起始点X坐标

                         startY:起始点Y坐标

                         stopX:结束点X坐标

                         stopY:结束点Y坐标

     从上图可以看出:直线的粗细与画笔的Style是没有关系的,直线的粗细与setStrokeWidth()有直接的关系。

    所以,一般而言,p a i n t . s e t S t r o k e Width(),S t y l e起作用时,用于设置描边宽度;在S t y l e不起作用时,用于设置画笔宽度。

    (3) void drawPoint(float x, float y, @NonNull Paint paint)  画点

    参数说明:float x:x的坐标,float y:y的坐标

    1. Paint paint = new Paint();
    2. paint.setColor(Color.RED);
    3. paint.setStrokeWidth(10);
    4. canvas.drawPoint(100,100,paint);

     (4)void drawCircle (float cx, float cy, float radius, Paint paint)

    参数说明:cx:圆心的x坐标,cy:圆心的y坐标,radius:圆的半径,paint:绘制时所使用的画笔。

    1. @Override
    2. protected void onDraw(Canvas canvas) {
    3. super.onDraw(canvas);
    4. Paint paint = new Paint();
    5. paint.setColor(0xffffff00);
    6. paint.setStyle(Paint.Style.FILL);
    7. paint.setStrokeWidth(50); //50px
    8. canvas.drawCircle(200,100,80,paint);
    9. }

    (5) 画矩形

    1)工具类 RectF 和 Rect
    RectF(float left, float top, float right, float bottom)  //(矩形左侧的X坐标,顶部的Y坐标,右侧的X坐标,下部的Y坐标)左上角点和右下角点确定
    Rect(int left, int top, int right, int bottom)
    
    RectF与Rect的构造函数基本相同,不同的只是RectF所保存的数值类型是float类型,而Rect所保存的数值类型是int类型。 
    
    2)画矩形
    void drawRect(@NonNull RectF rect, @NonNull Paint paint)
    void drawRect(@NonNull Rect r, @NonNull Paint paint)
    void drawRect(float left, float top, float right, float bottom, @NonNull Paint paint)

    一定要记住,在onDr aw()函数中不能创建变量!一般在自定义控件的构造函数中创建变,即在初始化时一次性创建。

    (6)绘制路径 Path类

    void drawPath(@NonNull Path path, @NonNull Paint paint)

    1)直线路径

    void moveTo(float x, float y)  ,(x,y)是直线的起点坐标

    void lineTo(float x2, float y2)  ,(x2,y2)是直线的终点,又是下一次绘制直线路径的起始点;lineTo()函数可以一直使用。

    void close() 如果连续画了几条直线,但没有形成闭环,那么调用close()函数会将路径首尾点连接起来,形成闭环

     示例:画三角

    1. Paint paint = new Paint();
    2. paint.setColor(Color.RED);
    3. paint.setStrokeWidth(10);
    4. paint.setStyle(Paint.Style.STROKE);
    5. paint.setAntiAlias(true);
    6. Path path = new Path();
    7. path.moveTo(100, 100);
    8. path.lineTo(100, 200);
    9. path.lineTo(200, 200);
    10. path.close();
    11. canvas.drawPath(path, paint);

     2)弧线路径

     void arcTo(@NonNull RectF oval, float startAngle, float sweepAngle)  这是一个画弧线路径的方法,弧线是从椭圆上截取的一部分。

    参数说明:RectF oval:生成椭圆的矩形;float startAngle:弧开始的角度,以X轴正方向为0度;float sweepAngle:弧持续的角度。

    1. Paint paint = new Paint();
    2. paint.setColor(Color.RED);
    3. paint.setStrokeWidth(10);
    4. paint.setStyle(Paint.Style.STROKE);
    5. paint.setAntiAlias(true);
    6. RectF rectF = new RectF(100,300,150,500);
    7. canvas.drawRect(rectF,paint);
    8. paint.setColor(Color.GREEN);
    9. Path path = new Path();
    10. // path.moveTo(100,300);
    11. path.arcTo(rectF,180,270);
    12. canvas.drawPath(path,paint);

     三.Region

    1、构造Region

    Region是一块任意形状的封闭图形

    (1)直接构造函数

            Region(@NonNull Region region)     // 复制一个Region范围

            Region(@NonNull Rect r)    //创建一个矩形区域(常用)

           Region(int left, int top, int right, int bottom) //创建一个矩形区域(常用)

    1. Region region = new Region(new Rect(100,100,200,300));
    2. drawRegion(canvas,paint,region);
    3. /**
    4. * 自定义画区域函数
    5. */
    6. private void drawRegion(Canvas canvas, Paint paint, Region region) {
    7. RegionIterator iter = new RegionIterator(region);
    8. Rect r = new Rect();
    9. while (iter.next(r)){
    10. canvas.drawRect(r,paint);
    11. }
    12. }

    (2)间接构造函数

    通过 public Region()的空构造函数与set系列函数相结合来实现的

    public void setEmpty()   //置空
    public boolean set(Region region)  //利用新的区域替换原来的区域
    public boolean set(Rect r) //利用矩形所代表的区域替换原来的区域
    public boolean set(int left , int top , int right , int bottom) //根据矩形的两个角点构造出矩形区域来替换原来的区域
    public boolean setPath(Path path , Region clip) //根据路径的区域和某区域的交集构造出新的区域

    1. //画椭圆路径
    2. Path path = new Path();
    3. RectF rect = new RectF(50, 50, 200, 500);
    4. path.addOval(rect, Path.Direction.CCW);
    5. Region rgn =new Region() ;
    6. rgn . setPath(ovalPath , new Region(50, 50 , 200, 200));
    7. //画出路径
    8. drawRegion(canvas , paint,rgn);
    9. //Path.Direction.CCW 逆时针
    10. //Path.Direction.CW 顺时针

    2、区域相交

    (1)union函数

    boolean union(@NonNull Rect r) 该函数用于与指定矩形取并集,即将Rect所指定的矩形加入当前区域中。
    1. Paint paint = new Paint();
    2. paint.setColor(Color.RED);
    3. paint.setStyle(Paint.Style.FILL);
    4. Region region= new Region(l0 , 10 , 200 ,1 00 );
    5. region . union ( new Rect (l 0, 10,50,300));
    6. //画出区域
    7. drawRegion(canvas,paint,region);

    (2)区域操作

    系列方法一:

    boolean op (Rect r , Op op)

    boolean op(int left , int top , int right , int bottom , Op op)

    boolean op(Region region , Op op)

    用当前的Region对象与指定的一个Rect对象或者Region对象执行相交操作,并将结果赋值给当前的Region对象。如果计算成功,则返回true;否则返回false。

  • 相关阅读:
    Vue3 计算属性和侦听器实战(computed、watch)——简易点餐页面
    Java运算符和逻辑控制
    操作系统4小时速成:I/O管理,spooling脱机技术,设备分配,分配数据结构,IO调度,IO子系统,IO控制方式,IO分类
    brew 安装MySQL 5.7
    【算能】stream在docker的环境下编译报错
    【C语言拓展提升】类型转换、内存分区
    删除链表的倒数第N个节点-双指针法
    加密算法总结
    面试面经|Java面试MySQL面试题
    Lsm树学习笔记
  • 原文地址:https://blog.csdn.net/baidu_24743861/article/details/126029081