Canvas基础知识
16lz
2021-01-26
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.缩放ScaleRectF 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.旋转RotateRectF 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.斜拉画布SkewRectF r = new RectF(100, 100, 600, 800);canvas.drawRect(r, paint);paint.setColor(Color.BLUE);//sx,sy倾斜度:X轴方向上倾斜60度,tan60=根号3canvas.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);
更多相关文章
- android进阶 重写view来实现全新控件
- 仿迅雷下载球
- Android日历周视图 可添加事件标记
- Android中Adapter使用ViewHolder优化
- Android(安卓)UI Surface 界面绘制原理
- android 使用Shape绘制实用圆圈
- Android中View,SurfaceView和GLSurfaceView绘图的区别
- 【Android】View类详解 (游戏开发必备)
- osg for android 学习之十五:显示图片