//bitmap可以获得图像文件信息,然后进行旋转剪切等操作,而且可以指定格式保存图像文件。但bitmap是将图像信息全部存入内存中,所以也容易引发oom
bitmap:画布
canvas:画家
paint:画笔
drawable:就是将画出来的东西展示出来的接口
**获取canvas有2个方式:**
1、一种是自定义view和自定义SurfaceView对象获取canvas。
由于自定义view和SurfaceView在界面中已经获得了显示区域,所以canvas只不过在其显示区域上进行布局的设计,完成后,系统会显示canvas的操作结果。
自定义view获取canvas:
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
}
自定义surfaceView获取canvas:
SurfaceView surfaceView = new SurfaceView(this);
SurfaceHolder holder = surfaceView.getHolder();
Canvas canvas = holder.lockCanvas();
//Canvas canvas1 = holder.lockCanvas(new Rect(0, 0, 100, 100));
holder.unlockCanvasAndPost(canvas);//释放canvas锁,并显示视图
2、一种是代码创建canvas对象。这种情况需要我们在绘画结束后将画图区域转化为drawable图片,或者setBitmap(bitmap)展现。
Bitmap bitmap = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_4444);//画布
Canvas canvas = new Canvas(bitmap);
//进行绘制操作….
//然后展示
Drawable drawable = new BitmapDrawable(bitmap) ;
imgView .setBackgroundDrawable(drawable) ;
//imgView .setImageBitmap(bitmap);
**canvas方法介绍:**
**clipxxx():**
就是在当前canvas显示区域上clip出一个新的绘制区域,这个新的绘制区域就是canvas的当前绘制区域了。
**save():**
保存由canvas绘制出来的东西。之后的操作不会对其产生影响。比如现在已经画好了,需要进行旋转,先save,再旋转,这样画的东西就会跟着一起旋转。如果想在旋转后进行操作就要调用restore方法,还原到原来的状态,然后进行操作。
比如画钟的那个例子,需要先画一个圆,然后画刻度。这个刻度就是旋转前先save保存已经画的东西,然后旋转一定的角度,画上刻度,然后restore原来的状态(没旋转时的状态),如此循环。
**restore():**
还原save方法之前保存的资源。
**drawxxx:**
**translate(float x,float y):**
移动canvas,x、y代表移动的px大小
**rotate(float degrees):**
旋转canvas
paint方法介绍:
* Paint类介绍
*
* Paint即画笔,在绘图过程中起到了极其重要的作用,画笔主要保存了颜色,
* 样式等绘制信息,指定了如何绘制文本和图形,画笔对象有很多设置方法,
* 大体上可以分为两类,一类与图形绘制相关,一类与文本绘制相关。
*
* 1.图形绘制
* setARGB(int a,int r,int g,int b);
* 设置绘制的颜色,a代表透明度,r,g,b代表颜色值。
*
* setAlpha(int a);
* 设置绘制图形的透明度。
*
* setColor(int color);
* 设置绘制的颜色,使用颜色值来表示,该颜色值包括透明度和RGB颜色。
*
* setAntiAlias(boolean aa);
* 设置是否使用抗锯齿功能,会消耗较大资源,绘制图形速度会变慢。
*
* setDither(boolean dither);
* 设定是否使用图像抖动处理,会使绘制出来的图片颜色更加平滑和饱满,图像更加清晰
*
* setFilterBitmap(boolean filter);
* 如果该项设置为true,则图像在动画进行中会滤掉对Bitmap图像的优化操作,加快显示
* 速度,本设置项依赖于dither和xfermode的设置
*
* setMaskFilter(MaskFilter maskfilter);
* 设置MaskFilter,可以用不同的MaskFilter实现滤镜的效果,如滤化,立体等 *
* setColorFilter(ColorFilter colorfilter);
* 设置颜色过滤器,可以在绘制颜色时实现不用颜色的变换效果
*
* setPathEffect(PathEffect effect);
* 设置绘制路径的效果,如点画线等
*
* setShader(Shader shader);
* 设置图像效果,使用Shader可以绘制出各种渐变效果
*
* setShadowLayer(float radius ,float dx,float dy,int color);
* 在图形下面设置阴影层,产生阴影效果,radius为阴影的角度,dx和dy为阴影在x轴和y轴上的距离,color为阴影的颜色
*
* setStyle(Paint.Style style);
* 设置画笔的样式,为FILL,FILL_OR_STROKE,或STROKE
*
* setStrokeCap(Paint.Cap cap);
* 当画笔样式为STROKE或FILL_OR_STROKE时,设置笔刷的图形样式,如圆形样式
* Cap.ROUND,或方形样式Cap.SQUARE
*
* setSrokeJoin(Paint.Join join);
* 设置绘制时各图形的结合方式,如平滑效果等
*
* setStrokeWidth(float width);
* 当画笔样式为STROKE或FILL_OR_STROKE时,设置笔刷的粗细度
*
* setXfermode(Xfermode xfermode);
* 设置图形重叠时的处理方式,如合并,取交集或并集,经常用来制作橡皮的擦除效果
*
* 2.文本绘制
* setFakeBoldText(boolean fakeBoldText);
* 模拟实现粗体文字,设置在小字体上效果会非常差
*
* setSubpixelText(boolean subpixelText);
* 设置该项为true,将有助于文本在LCD屏幕上的显示效果
*
* setTextAlign(Paint.Align align);
* 设置绘制文字的对齐方向
*
* setTextScaleX(float scaleX);
* 设置绘制文字x轴的缩放比例,可以实现文字的拉伸的效果
*
* setTextSize(float textSize);
* 设置绘制文字的字号大小
*
* setTextSkewX(float skewX);
* 设置斜体文字,skewX为倾斜弧度
*
* setTypeface(Typeface typeface);
* 设置Typeface对象,即字体风格,包括粗体,斜体以及衬线体,非衬线体等
*
* setUnderlineText(boolean underlineText);
* 设置带有下划线的文字效果
*
* setTextAlign(Paint.Align align);
* 设置绘制文字的对齐方向
*
* setUnderlineText(boolean underlineText);
* 设置带有下划线的文字效果
*
* setStrikeThruText(boolean strikeThruText);
* 设置带有删除线的效果
*
* setStrikeThruText(boolean strikeThruText);
* 设置带有删除线的效果
*
* setDither(boolean dither);
* 设定是否使用图像抖动处理,会使绘制出来的图片颜色更加平滑和饱满,图像更加清晰
*
* setMaskFilter(MaskFilter maskfilter);
* 设置MaskFilter,可以用不同的MaskFilter实现滤镜的效果,如滤化,立体等
*
* setColorFilter(ColorFilter colorfilter);
* 设置颜色过滤器,可以在绘制颜色时实现不用颜色的变换效果
*
* setShadowLayer(float radius ,float dx,float dy,int color);
* 在图形下面设置阴影层,产生阴影效果,radius为阴影的角度,dx和dy为阴影在x轴和y轴上的距离,color为阴影的颜色
*
setStrokeCap(Paint.Cap cap);
* 当画笔样式为STROKE或FILL_OR_STROKE时,设置笔刷的图形样式,如圆形样式Cap.ROUND,或方形样式Cap.SQUARE
*
* setXfermode(Xfermode xfermode);
* 设置图形重叠时的处理方式,如合并,取交集或并集,经常用来制作橡皮的擦除效果 ,比如圆形头像的制作
*/
设置渐变色
Shader mShader = new LinearGradient(0, 0, 100, 100,new int[] {Color.RED, Color.GREEN, Color.BLUE, Color.YELLOW },new float[]{0 , 0.5f,1.0f}, Shader.TileMode.REPEAT);
参数:
起始点的x坐标
起始点的y坐标
终点的x坐标
终点的y坐标
渐变色的数组
定义每个颜色处于的渐变相对位置, 这个参数可以为null,如果为null表示所有的颜色按顺序均匀的分布
渐变模式:
// REPEAT:沿着渐变方向循环重复
// CLAMP:如果在预先定义的范围外画的话,就重复边界的颜色
// MIRROR:与REPEAT一样都是循环重复,但这个会对称重复
dawArc(RectF f,float startAngel,float sweepAngel,boolean useCenter,Paint p)
//参数介绍
f:就是要画在画布上的矩形的范围。
startAngel:圆弧开始的角度
sweepAngel:圆弧扫过的角度(大于0顺时针)
useCenter:是否使用中心点
paint:画笔
drawArc(float left,float,top,float right,float bottom,float startAngel,float sweepAngel,boolean useCenter,Paint p)
同上,只不过讲矩形范围放在了参数中
drawBitmap()
drawBitmap(Bitmap bitmap, Rect src, RectF dst, Paint paint)
src:裁剪的图片的区域,若为null,则表示不裁剪,即为整个图片
dst:图片在canvas中显示的区域
drawBitmap(Bitmap bitmap, float left, float top, Paint paint)
left:左起点
top:上起点
drawCircle( float x,float y,float radius,Paint p)
drawColor(int color)
dawColor(int color,Mode mode)
Mode:
//画线
drawLine(float startx,float starty,float endx,float endy,Paint p)
//画椭圆,矩形区域内
drawOval(RectF f,Paint p)
//画点
drawPoint()
9、drawPicture()
10、drawPaint()
//画路径
drawPath(Path path,Paint paint)
Path path = new Path();
path.moveTo(x,y);
path.lineTo(x,y);
path.lineTo(x,y);
path.close();//闭合
由于path的起始点是(0,0),我们可以自己设置起始点,就是moveTo(x,y)
lineTo(x,y)就是下一个点。
close()方法是闭合的意思,如果闭合了,然后paint的style设置的是实心的,那么就会以paint的颜色填充该闭合区域,如果设置的是空心的那么就只有线有颜色。(开始很懵逼,然后自己猜测着试了一下,是这样的)
二级贝塞尔曲线:
path.moveTo(x,y);//左边起始点坐标
path.quadTo(x1,y1,x2,y2);//1控制点和2结束点
canvas.drawPath(path,paint);
//将文字一个一个画在点上面
drawPosText(String text,new Float[]{x,y,x,y,x,y,….},Paint p)
效果:
//画矩形
drawRect(Rect rect,Paint p)
14、drawRGB()
//画圆角矩形
drawRoundRect(Rect r,float x,float y,Paint p)
x:4个角的圆角的x半径
y:4个角的圆角的y半径
//将文字画在路径上
drawTextOnPath(String text,Path path,float startx,float starty,Paint p)
“`
17、drarVertices()