布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".activity.CanvasActivity">
<com.example.myapplication.view.CanvasView
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
Activity
package com.example.myapplication.activity;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import com.example.myapplication.R;
public class CanvasActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_canvas);
}
}
自定义View
package com.example.myapplication.view;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
public class CanvasView extends View {
private Paint mPaint;
public CanvasView(Context context) {
super(context);
Log.i("CanvasView","构造===1");
init(context);
}
public CanvasView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
Log.i("CanvasView","构造===2");
init(context);
}
public CanvasView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
Log.i("CanvasView","构造==3");
init(context);
}
//初始化 画笔 路径等
private void init(Context context) {
//设置背景颜色
setBackgroundColor(Color.parseColor("#222222"));
mPaint = new Paint();
mPaint.setColor(Color.WHITE);//设置颜色
mPaint.setTextSize(36);//设置文字的大小
mPaint.setStrokeWidth(10);//设置线的粗细
mPaint.setAntiAlias(true);//设置抗锯齿
mPaint.setTextAlign(Paint.Align.CENTER);//设置文字居中
}
//绘制
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Log.i("CanvasView","onDraw");
//几种常见的方法
getWidth();//手机的宽度
getRight();//手机的宽度
getHeight();//手机的高度
getBottom();//手机的高度
getLeft();//距离左边
getTop();//距离上边
mPaint.setStyle(Paint.Style.FILL);//设置实心
//绘制文字
canvas.drawText("了解自定义View", getRight() / 2, 50, mPaint);
//绘制线 横线
canvas.drawLine(0, 100, getRight(), 100, mPaint);
//绘制线 竖线
canvas.drawLine(100, 0, 100, getBottom(), mPaint);
mPaint.setStyle(Paint.Style.STROKE);//设置空心
//绘制圆
canvas.drawCircle(getRight() / 2, getBottom() / 2, 100, mPaint);
//绘制矩形
Rect rect = new Rect();
rect.left = 200;
rect.right = 300;
rect.top = 200;
rect.bottom = 300;
canvas.drawRect(rect, mPaint);
}
//测量
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
Log.i("CanvasView","onMeasure");
int width = MeasureSpec.getSize(widthMeasureSpec);
int height = MeasureSpec.getSize(heightMeasureSpec);
int mode = MeasureSpec.getMode(widthMeasureSpec);
if (mode == MeasureSpec.AT_MOST) {//包裹内容
Log.i("CanvasView","包裹==");
} else if (mode == MeasureSpec.EXACTLY) {//精确模式
Log.i("CanvasView","精确==");
} else {
Log.i("CanvasView","不对View做限制==");
}
//setMeasuredDimension(widthMeasureSpec,heightMeasureSpec);
}
//位置 设置子View的一个位置
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
Log.i("CanvasView","onLayout");
}
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
Log.i("CanvasView","onAttachedToWindow");
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
Log.i("CanvasView","onDetachedFromWindow");
}
}
效果图