栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

Android自定义控件-绘图基础

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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的样式是STROKE 和FILL_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的坐标

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

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

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

 @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        Paint paint = new Paint();
        paint.setColor(0xffffff00); 
        paint.setStyle(Paint.Style.FILL);
        paint.setStrokeWidth(50); //50px

        canvas.drawCircle(200,100,80,paint);
    }

(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()函数会将路径首尾点连接起来,形成闭环

 示例:画三角

       Paint paint = new Paint();
        paint.setColor(Color.RED);
        paint.setStrokeWidth(10);
        paint.setStyle(Paint.Style.STROKE);
        paint.setAntiAlias(true);

        Path path = new Path();
        path.moveTo(100, 100);
        path.lineTo(100, 200);
        path.lineTo(200, 200);
        path.close();
        
        canvas.drawPath(path, paint);

 2)弧线路径

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

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

        Paint paint = new Paint();
        paint.setColor(Color.RED);
        paint.setStrokeWidth(10);
        paint.setStyle(Paint.Style.STROKE);
        paint.setAntiAlias(true);
        RectF rectF = new RectF(100,300,150,500);
        canvas.drawRect(rectF,paint);


        paint.setColor(Color.GREEN);
        Path path = new Path();
//        path.moveTo(100,300);
        path.arcTo(rectF,180,270);
        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) //创建一个矩形区域(常用)

 Region region = new Region(new Rect(100,100,200,300));
 drawRegion(canvas,paint,region);


    
    private void drawRegion(Canvas canvas, Paint paint, Region region) {
        RegionIterator iter = new RegionIterator(region);
        Rect r = new Rect();
        while (iter.next(r)){
            canvas.drawRect(r,paint);
        }
    }

(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) //根据路径的区域和某区域的交集构造出新的区域

 //画椭圆路径
 Path path = new Path();
 RectF rect = new RectF(50, 50, 200, 500);
 path.addOval(rect, Path.Direction.CCW);  

Region rgn =new Region() ;
rgn . setPath(ovalPath , new Region(50, 50 , 200, 200));

 //画出路径
 drawRegion(canvas , paint,rgn);


 //Path.Direction.CCW  逆时针
 //Path.Direction.CW   顺时针

2、区域相交

(1)union函数

boolean union(@NonNull Rect r) 该函数用于与指定矩形取并集,即将Rect所指定的矩形加入当前区域中。
 Paint paint = new Paint();
 paint.setColor(Color.RED);
 paint.setStyle(Paint.Style.FILL);

 Region region= new Region(l0 , 10 , 200 ,1 00 );
 region . union ( new Rect (l 0, 10,50,300));

 //画出区域
 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。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1029460.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号