所有的布局都继承自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();//强制回收图片
}
}