ViewGroup的测量 画一个渐变的矩形,画笔的应用paint canvas基本方法 消除锯齿,画颜色,阴影

所有的布局都继承自ViewGroup

ViewGroup的测量描述

当ViewGroup的值为wrap_content时,会对所有的子View进行遍历,以便得到所有View的大小,从而来决定自己的大小

ViewGroup的测量

ViewGroup在测量时通过遍历所有子View从而调用所有子View的Measure()方法,来获得每一个子View的测量结果

如何放置子View 

遍历子View的layout方法,并自定义其具体位置

自定义ViewGroup

重写onLayout方法

使用 dipatchDraw()方法来绘制其子View,其过程同样式通过遍历s所有子View ,并调用子View的绘制方法来完成绘制工作

设置透明度

setARGB() 

setAlpha()

setAntiAlias()

写一个类继承View重写onDraw方法

package com.yifei.myapplication;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.LinearGradient;
import android.graphics.Paint;
import android.graphics.Shader;
import android.view.View;

public class MyPointView extends View {
    //初始化数据
    public MyPointView(Context context) {
        super(context);
    }

    //绘图
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
       Paint paint = new Paint();//创建画笔
        //线性渐变
        Shader shader = new LinearGradient(0,0,50,50,Color.RED,Color.BLUE,Shader.TileMode.CLAMP);//注意这个mode
        paint.setShader(shader);//为画笔设置渐变器
        canvas.drawRect(0,0,250,100,paint);
    }
}

activity调用这个类

FrameLayout frameLayout = findViewById(R.id.frame);
        MyPointView myPointView = new MyPointView(this);
        frameLayout.addView(myPointView);

画一个圆形渐变

       shader = new RadialGradient(300,300,50,Color.RED,Color.YELLOW,Shader.TileMode.CLAMP);
        paint.setShader(shader);
        canvas.drawCircle(300,300,50,paint);

角度渐变

sweep

 Paint paint = new Paint();//创建画笔
        //线性渐变
        Shader shader = new LinearGradient(0,50,250,50,Color.RED,Color.BLUE,Shader.TileMode.MIRROR);//
        paint.setShader(shader);//为画笔设置渐变器
        canvas.drawRect(20,20,250,250,paint);
        shader = new RadialGradient(300,300,50,Color.RED,Color.YELLOW,Shader.TileMode.CLAMP);
        paint.setShader(shader);//圆角渐变
        canvas.drawCircle(300,300,50,paint);
        shader = new SweepGradient(550,550,Color.RED,Color.BLUE);
        paint.setShader(shader); //角度渐变
        canvas.drawArc(450,450,660,660,120,250,false,paint);

消除锯齿

paint.setAntiAlias()

canvas基本方法

1 绘制弧  drawArc()

2绘制圆 drawCircle()

3 绘制线 drawLine() 

4绘制多条线 drawLines()

5绘制椭圆 drawOval()

6绘制一个点 drawPoint()

7 绘制多个点 drawPoint

8 绘制矩形 drawRect()

画颜色,画阴影

设置阴影时需要关闭硬件加速

 //绘图 重写View的onDraw方法
    @SuppressLint("NewApi")
    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        Paint paint = new Paint();//创建画笔
        paint.setColor(Color.RED);
        paint.setStrokeWidth(2);
        setLayerType(LAYER_TYPE_SOFTWARE, null);
        paint.setShadowLayer(5, 5, 5,Color.YELLOW);
        canvas.drawOval(10, 500, 300, 900, paint);
    }

转自 https://www.jianshu.com/p/2f1024f9c554

对图片的边界进行模糊

@Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        setLayerType(LAYER_TYPE_SOFTWARE,null);//单个View时,不启动硬件加速

        //得到画笔, 定义颜色,线宽
        Paint paint = new Paint();
        //
        paint.setMaskFilter(new BlurMaskFilter(10,BlurMaskFilter.Blur.NORMAL));
        Bitmap bitmap = BitmapFactory.decodeResource(this.getResources(),R.drawable.timg);//得到这张图片转成bitmap(位图)对象
        //绘制出来了这张图片
        canvas.drawBitmap(bitmap,bitmapX,bitmapY,paint);

        //判断图片是否回收
        if(bitmap.isRecycled()){
            bitmap.recycle();//强制回收图片
        }
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值