1.先自己创建一个类继承view 然后重写方法
这个代码是view当中自定义属性信息
public class CustomAttrView extends View{
private String text;
private Paint paint;
//初始化画笔的方法
private void initpaint(){
paint = new Paint();
paint.setColor(Color.RED);
paint.setAntiAlias(true);
setPadding(10,10,10,30);
}
public CustomAttrView(Context context) {
super(context);
initpaint();
}
public CustomAttrView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
initpaint();
/**
* 自定义属性在布局当中设置 后,需要在代码当中接收到对应的值
* */
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.CustomAttrView);
// 获取自定义属性在XML文件当中对应的值
String text = typedArray.getText(R.styleable.CustomAttrView_titleText).toString();
setText(text);
int color = typedArray.getColor(R.styleable.CustomAttrView_titleColor, Color.BLACK);
setColor(color);
float size = typedArray.getDimension(R.styleable.CustomAttrView_titleSize, 20);
setTextSize(size);
typedArray.recycle();
// 清理资源,回收资源,为了避免对于下一次使用造成影响
}
/**
* 设置文字内容
* */
public void setText(String text) {
this.text = text;
requestLayout(); //重新绘制界面
invalidate(); //重新加载数据
}
/**
* 设置文字颜色
* */
public void setColor(int color){
paint.setColor(color);
requestLayout();
invalidate();
}
/**
* 设置文字的尺寸
* */
public void setTextSize(float size){
paint.setTextSize(size);
requestLayout();
invalidate();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawColor(Color.GRAY);
canvas.drawText(text,getPaddingLeft(),getPaddingTop()+(paint.descent()-paint.ascent()),paint);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int wSize = setMeasure(widthMeasureSpec, true);
int hSize = setMeasure(heightMeasureSpec, false);
setMeasuredDimension(wSize,hSize);
}
public int setMeasure(int measureSpec,boolean mode){ //true-->宽度 false-->高度
int result = 0;
// 获取测量的模式和尺寸
int modle = MeasureSpec.getMode(measureSpec);
int size = MeasureSpec.getSize(measureSpec);
switch (modle) {
case MeasureSpec.AT_MOST:
if (mode){
// 测量宽度
result= (int) (getPaddingLeft() + getPaddingRight() + paint.measureText(text));
}else {
result = (int) (getPaddingTop()+getPaddingBottom()+(paint.descent()-paint.ascent()));
}
break;
case MeasureSpec.EXACTLY:
result = size;
break;
}
return result;
}
}
这个代码是自定义绘制图形
public class DrawView extends View{
public DrawView(Context context) {
super(context);
}
public DrawView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawColor(Color.BLACK);
Paint paint = new Paint();
paint.setColor(Color.RED);
canvas.drawText("画圆",10,20,paint);
canvas.drawCircle(60,20,10, paint); //画圆
//抗锯齿
paint.setAntiAlias(true);
// 设置画笔为空心
paint.setStyle(Paint.Style.STROKE);
// 画线和弧线
canvas.drawText("画线和弧线",10,60,paint);
paint.setColor(Color.GREEN);
canvas.drawLine(60,40,100,40,paint); //画横线,和宽度水平的
canvas.drawLine(110,40,190,80,paint); //画斜线
// 获取圆弧的外切矩形
RectF oval = new RectF(150,20,180,40);
canvas.drawArc(oval,180,180,false,paint);
// 重新设置矩形的位置
oval.set(190,20,220,40);
canvas.drawArc(oval,180,180,false,paint);
oval.set(170,30,200,60);
canvas.drawArc(oval,0,180,false,paint);
// 创建线性 渲染
Shader shader = new LinearGradient(0,0,100,100,new int[]{Color.RED,Color.GRAY,Color.YELLOW,Color.BLUE},null, Shader.TileMode.REPEAT);
paint.setShader(shader);
paint.setStyle(Paint.Style.FILL);
// 绘制扇形
RectF rectF = new RectF(120, 100, 260, 240);
canvas.drawArc(rectF,200,150,true,paint);
// 绘制椭圆
/**
* 左 ,上 右 下
* */
canvas.drawOval(280,100,320,130,paint);
// 画三角形
Path path = new Path();
path.moveTo(80,200); //绘制多边形的方法
path.lineTo(120,250);
path.lineTo(80,250);
path.close(); //是每一个点都变成封闭的集合图形
canvas.drawPath(path,paint);
// 绘制圆角矩形
canvas.drawRoundRect(80,290,220,330,20,20,paint);
// 绘制图片到画布上
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);
canvas.drawBitmap(bitmap,250,350,paint);
}
}
* 1.绘制图片 :drawBitmap drawPicture
* 2.绘制颜色: drawColor drawARGB
* 3.绘制基本几何形状 : drawPoint,drawLine,drawCircle,drawArc,drawRect,drawOval,drawRoundRect
* 4.绘制剪切区: clipPath, clipRect,clipRegion,drawPath
* 5.变换Canvas :save,rotate,restore,translate,scale,
* 6.绘制顶点数据:drawVertices, drawBitmapMesh
canvas.drawRect(50,50,100,100,paint); //绘制矩形
2.自定义属性 在values理创建attrs
3.在attrs.xml里面写属性
<?xml version="1.0" encoding="utf-8"?>
<resources>
//自定义属性的类型:
format 可以用|来同时使用
1、reference 参考某一资源Id
2、color 颜色值
3、boolean 布尔值
4、dimension 尺寸值(带有单位的 sp/dp)
5、float 浮点型
6、intager 整形
7、string 字符串
8、fraction 百分比
9、enum 枚举
10、flag 位或运算
<declare-styleable name="zdy">
<attr name="text" format="string"></attr>
<attr name="color" format="color|reference"></attr>
<attr name="size" format="dimension"></attr>
</declare-styleable>
</resources>
4.然后在布局理调用