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的坐标

        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。

四、属性动画

   ValueAnimator valueAnimator = ValueAnimator.ofInt(0, 300, 100, 400);
        valueAnimator.setDuration(300);
        valueAnimator.addUpdateListener(new AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                int curValue = (Integer)animation.getAnimatedValue();//获取ValueAnimator在运动时,当前运动点的值
                tv.layout(curValue ,curValue, curValue+tv.getWidth () ,curValue+  tv.getHeight ());
            }
        });
        valueAnimator.start();

tv从(0,0)位置运动到(300,300)再到(100,100)再到(400,400)位置

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值