package yifeiyuan.practice.practicedemos.customview;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
/**
* canvas基础
*
* 通常情况下(0,0)是我们手机的左上角
* (0,0)
* --------------------------> X
* |
* |
* |
* |
* |
* |
* |
* ⬇Y️
*/
public class CanvasActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
CanvasView view = new CanvasView(CanvasActivity.this);
// FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT);
// lp.leftMargin = 200;
// lp.topMargin = 400;
// view.setLayoutParams(lp);
setContentView(view);
}
class CanvasView extends View {
private RectF mArcRectF;
private RectF mOvalRectF;
public CanvasView(Context context) {
super(context);
init();
}
Paint mLinePaint;
Paint mArcPaint;
Paint mRectFPaint;
Paint mCirclePaint;
Paint mPointPaint;
Paint mOvalPaint;
private void init() {
mPointPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mPointPaint.setColor(Color.parseColor("#000000"));
mPointPaint.setStrokeWidth(15);
mLinePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mLinePaint.setColor(Color.parseColor("#0000ff"));
mLinePaint.setStrokeWidth(5);// stroke宽度
mArcPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mArcPaint.setColor(Color.parseColor("#00ff00"));
mRectFPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mRectFPaint.setColor(Color.parseColor("#eeff00"));
mCirclePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mCirclePaint.setColor(Color.parseColor("#443322"));
mOvalPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mOvalPaint.setColor(Color.parseColor("#88ddff"));
//RectF rectangle 矩形的意思,根据这四个点即可确定一个矩形
mArcRectF = new RectF(0, 30, 267, 222);
mOvalRectF = new RectF(0,0,300,200);
}
@Override
protected void onDraw(Canvas canvas) {
canvas.save();
//X轴平移 10个像素
canvas.translate(10, 0);
//填充整个canvas 画颜色 Notice 前面的translate对 drawARGB没有作用!!
canvas.drawARGB(111, 156, 11, 44);
// 画一个点
canvas.drawPoint(10, 10, mPointPaint);
//X轴平移 50个像素
canvas.translate(50, 0);
//画直线 Notice 前面的translate(10,0) 以及 translate(50,0) 都有影响!
//Notice 也即 这里的起点虽然为(0,0),但是相对于最初始的情况是(60,0)!!
canvas.drawLine(0, 0, 0, 300, mLinePaint);
canvas.drawLine(0, 300, 300, 300, mLinePaint);
//绘制一个矩形
// canvas.drawRect(mArcRectF, mRectFPaint);
// canvas.drawRect(1, 2, 3, 4, mRectFPaint);
// canvas.translate(300, 0);
// canvas.drawRoundRect(mArcRectF,0,20,mRectFPaint);
// canvas.translate(300, 0);
// canvas.drawRoundRect(mArcRectF,50,70,mRectFPaint);
//根据一个矩形绘制一个弧形
//矩阵的中心为圆心,最短边为直径(内切圆)
/**
* Notice 圆心 弧度示意图:
*
* 270°(-90°)
* |
* |
* |
* 180° |
* ___________|____________ 0°
* /|\a
* /b| \
* / | \
* / | \
* / 90°(-270°)
*
*
* startAngle 表示初始位置是多少,从0 开始(a)
* sweepAngle 表示旋转了多少度(b) Notice 超过360°,则为一整个圆.
* 假设 a 为90 b 为22 那么最终效果是 扇形的一条变在 90°处,了一条边在112°处
*
* useCenter true 是否使用圆心
*
* http://ww3.sinaimg.cn/large/98900c07gw1ewtt438wdej20e10c8aa7.jpg
*/
// 使用中心 则为弧形
canvas.drawArc(mArcRectF, 90, 22, true, mArcPaint);
// 不使用中心
canvas.drawArc(mArcRectF, 122, 33, false, mArcPaint);
// canvas.drawArc(1,1,1,1,2,2,false,mArcPaint);
// //只描边 默认fill(填充)
mArcPaint.setStyle(Paint.Style.STROKE);
canvas.drawArc(mArcRectF, 166, 44, true, mArcPaint);
//
canvas.restore();
canvas.translate(0, 300);
//超过360°,则为一整个圆,即使useCenter为false
mArcPaint.setStrokeWidth(20);
mArcPaint.setStyle(Paint.Style.FILL_AND_STROKE);//什么鬼?貌似没什么效果
canvas.drawArc(mArcRectF, 22, 393, false, mArcPaint);
canvas.translate(330, 100);
//画圆 指定圆心,半径 便可画一个圆
mCirclePaint.setStyle(Paint.Style.FILL);
canvas.drawCircle(50, 50, 50, mCirclePaint);
mCirclePaint.setStyle(Paint.Style.STROKE);
canvas.drawRect(0, 0, 100, 100, mCirclePaint);
canvas.translate(400, 0);
mOvalRectF.set(0, 30, 267, 222);//椭圆
canvas.drawOval(mOvalRectF, mOvalPaint);
// canvas.drawOval(1, 1, 1, 1, mOvalPaint);
canvas.translate(0, 300);
mOvalRectF.set(0, 0, 200, 200);//设置成正方形
canvas.drawOval(mOvalRectF, mOvalPaint);
canvas.translate(0, 300);
canvas.drawCircle(50, 50, 100, mOvalPaint);
}
}
}