Canvas基础知识
2017-05-19 11:33
661 查看
public class TestView1 extends View { private Bitmap mBitmap; private BitmapShader mBitmapShader; public TestView1(Context context) { super(context); } public TestView1(Context context, @Nullable AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub mBitmap = ((BitmapDrawable)getResources().getDrawable(R.drawable.xyjy2)).getBitmap(); mBitmapShader = new BitmapShader(mBitmap, Shader.TileMode.REPEAT, Shader.TileMode.REPEAT); } public TestView1(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) public TestView1(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); //绘制直线 Paint paint = new Paint(); paint.setColor(Color.RED); paint.setStyle(Paint.Style.FILL); paint.setStyle(Paint.Style.STROKE); paint.setStrokeWidth(10); paint.setShader(mBitmapShader); paint.setAntiAlias(true); canvas.drawLine(0, 0, 100, 100, paint); } }
float []pts = {0,0,100,100,200,200,300,300};
canvas.drawLines(pts, paint);
float []pts = {0,0,100,100,200,200,300,300};
canvas.drawPoint(500, 500, paint);
canvas.drawPoints(pts, paint);
RectF r = new RectF(100, 100, 400, 500);
canvas.drawRect(r, paint);
//canvas.drawRect(left, top, right, bottom, paint);
RectF r = new RectF(100, 100, 400, 500);
// canvas.drawRect(r, paint);
//canvas.drawRect(left, top, right, bottom, paint);
//画圆角矩形
//x-radius ,y-radius圆角的半径
canvas.drawRoundRect(r, 30, 30, paint);
canvas.drawCircle(300, 300, 200, paint);
RectF r = new RectF(100, 100, 400, 500);
paint.setColor(Color.GREEN);
canvas.drawOval(r, paint);
RectF r = new RectF(100, 100, 400, 500);
// canvas.drawArc(
// r,
// startAngle, //其实角度,相对X轴正方向
// sweepAngle, //画多少角度的弧度
// useCenter, //boolean, false:只有一个纯弧线;true:闭合的边
// paint);
canvas.drawArc(r, 0, 90, true, paint);//顺时针旋转90度
Path path = new Path();
path.moveTo(100, 100);//画笔落笔的位置
//移动
path.lineTo(200, 100);
path.lineTo(200, 200);
path.cubicTo(250, 200, 350, 300, 450, 400);
path.close();
canvas.drawPath(path, paint);
//圆角矩形路径
RectF r = new RectF(100, 100, 600, 800);
Path path = new Path();
float radii[] = {10,10,10,10,10,10,50,60};
path.addRoundRect(r, radii, Path.Direction.CCW);
//path.addArc(oval, startAngle, sweepAngle);
canvas.drawPath(path, paint);
//--------------------Canvas变换技巧--------------------------
//1.平移(Translate)
// 绘制坐标系
RectF r = new RectF(0, 0, 400, 500);
paint.setColor(Color.GREEN);
canvas.drawRect(r, paint);
// 第一次绘制坐标轴
canvas.drawLine(0,0,canvas.getWidth(),0,paint);// X 轴
paint.setColor(Color.BLUE);
canvas.drawLine(0,0,0,canvas.getHeight(),paint);// Y 轴
//平移--即改变坐标原点
canvas.translate(50, 50);
// 第二次绘制坐标轴
paint.setColor(Color.GREEN);
canvas.drawLine(0,0,canvas.getWidth(),0,paint);// X 轴
paint.setColor(Color.BLUE);
canvas.drawLine(0,0,0,canvas.getHeight(),paint);// Y 轴
canvas.rotate(45);
// 第三次绘制坐标轴
paint.setColor(Color.GREEN);
canvas.drawLine(0,0,canvas.getWidth(),0,paint);// X 轴
paint.setColor(Color.BLUE);
canvas.drawLine(0,0,0,canvas.getHeight(),paint);// Y 轴
canvas.drawColor(Color.BLUE); RectF r2 = new RectF(0, 0, 400, 500); paint.setColor(Color.RED); //虽然新建了一个画布图层,但是还是会沿用之前设置的平移变换。不可逆的。(save和restore来解决) canvas.drawRect(r2, paint);
//2.缩放Scale RectF r = new RectF(0, 0, 400, 500); canvas.drawRect(r, paint); paint.setColor(Color.BLUE); //sx,sy:分别对x/y方向的一个缩放系数,画布的缩放会导致里面所有的绘制的东西都会有一个缩放效果 canvas.scale(1.5f, 0.5f); canvas.drawRect(r, paint);
//3.旋转Rotate RectF r = new RectF(200, 200, 400, 500); canvas.drawRect(r, paint); paint.setColor(Color.BLUE); canvas.rotate(45); //canvas.rotate(45, 200, 200); canvas.drawRect(r, paint);
//4.斜拉画布Skew RectF r = new RectF(100, 100, 600, 800); canvas.drawRect(r, paint); paint.setColor(Color.BLUE); //sx,sy倾斜度:X轴方向上倾斜60度,tan60=根号3 canvas.skew(1.73f, 0); canvas.drawRect(r, paint);
//5.裁剪画布clip
RectF r = new RectF(200, 200, 400, 500);
canvas.drawRect(r, paint);
paint.setColor(Color.BLUE);
canvas.clipRect(new Rect(250, 250, 300, 400));
canvas.drawColor(Color.YELLOW);
// save 和 restore
RectF r = new RectF(0, 0, 400, 500);
paint.setColor(Color.GREEN);
canvas.drawRect(r, paint);
canvas.save();
//平移
canvas.translate(50, 50);
paint.setColor(Color.BLUE);
canvas.drawRect(r, paint);
canvas.restore();
canvas.rotate(45);
paint.setColor(Color.YELLOW);
r = new RectF(0, 0, 200, 200);
canvas.drawRect(r, paint);
//当canvas执行saveLayer的时候就会新建一个新的画布图层 int layer = canvas.saveLayer(0,0,canvas.getWidth(),canvas.getHeight(),null,Canvas.ALL_SAVE_FLAG); canvas.drawColor(Color.YELLOW); canvas.translate(50, 50); paint.setColor(Color.BLUE); canvas.drawRect(r, paint); canvas.restoreToCount(layer);
相关文章推荐
- 使用HTML5 canvas做地图(1)基础知识
- 24个canvas基础知识小结
- canvas API ,通俗的canvas基础知识(二)
- Canvas基础知识积累
- html5的canvas的基础知识(ie9+)
- HTML5 Canvas实践(一)Canvas 基础知识
- Html5 Canvas核心技术(图形,动画,游戏开发)--基础知识
- canvas API ,通俗的canvas基础知识(六)
- canvas API ,通俗的canvas基础知识(一)
- Android中Canvas绘图知识的基础学习
- [HTML5 Canvas学习] 基础知识
- Android 2D Graphics学习(二)、Canvas篇2、Canvas裁剪和Region、RegionIterator 分类: Android基础知识学习
- Android自定义控件前导基础知识学习(一)——Canvas
- canvas API ,通俗的canvas基础知识(四)
- Canvas基础知识总结之一
- HTML5 学习(一 CANVAS 的基础知识点)
- Canvas基础知识总结之二
- Canvas 项目经验整理 基础知识加总结
- HTML5 Canvas游戏开发(一)基础知识
- Canvas基础知识(1)