上篇的学习,Paint中的基础知识基本结束,笔学完了,学习开始学习画布。本篇记录学习Canvas中的一些知识。在drawBitmap()方法中会引出计划下篇要学习的内容Matrix,drawPath()方法会引出计划在下下篇学习的贝塞尔曲线,学习的重点也是这两个方法
学习资料:
本人很菜,有错误,请指出
虽然称Canvas为画布,但并不是直接在Canvas画,Canvas内部默认会创建一个Biatmap,也可以通过构造方法或者setBitmap()方法传入一个,像素所有的信息是画在了这个Bitmap上,然后Bitmap被保存在了Canvas之内
这是我看爱哥的博客后,自己做的一个总结,若有错误,请指出。针对Canvas的两种构造方法,爱哥针对源码有做分析,可以看看了解一下
在Canvas的方法中,clip和draw方法占据了一大半,在Android 自定义View学习(二)——开始了解Canvas和Paint了解过了几个draw方法,本篇进行补充学习
1.draw方法补充学习在draw一系列方法中,有一个特殊的牛B的存在,drawBitmapMesh(),这个方法牛B在可以几乎对Bitmap做任何操作。虽然这个方法很强大,但使用的频率并不算高,也有点鸡肋。一些比较简单的Bitmap处理可能优先考虑Matrix,而过于复杂的处理,会耗时比较久,效率可能并不高。一般优先不考虑这个方法,遇到Matrix实现不了的需求,记得有这么一个方法可以学习,然后使用
1.1 drawBitmap方法感觉这个方法使用频率很高。一共有6个重载方法,其中两个参数最多的方法已经废弃,也就是需要学习4个
1.1.1 第1个方法 drawBitmap(@NonNull Bitmap bitmap, float left, float top, @Nullable Paint paint)简单使用
@Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); final Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.test); final float x = getWidth() / 2 - bitmap.getWidth() / 2;//水平居中 final float y = 0; canvas.drawBitmap(bitmap, x, y, mPaint); }
drawBitmap第1个方法
在实际开发中,还会考虑图片宽高的压缩,显示位置,以及padding的等等
1.1.2 第2个和第3个方法 drawBitmap(@NonNull Bitmap bitmap, @Nullable Rect src, @NonNull Rect dst,@Nullable Paint paint) drawBitmap(@NonNull Bitmap bitmap, @Nullable Rect src, @NonNull RectF dst,@Nullable Paint paint)两个方法的差别在于第三个参数Rect和RectF
简单使用
private void init() { mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.test); rect = new Rect(0,0,1080,600); rectF = new RectF(0f,0f,1080f,600f); } protected void onDraw(Canvas canvas) { super.onDraw(canvas); if (bitmap != null) canvas.drawBitmap(bitmap,null,rectF,mPaint); }
drawBitmap第2个方法
1080是测试手机的屏幕宽度
第2个参数rect = new Rect(x,y,x1,y1) ,构造方法中四个参数分别为:
第3个参数rectF = new RectF(x,y,x1,y1),构造方法中四个参数分别为:
简单修改代码:
rect = new Rect(0,0,400,600); rectF = new RectF(100f,0f,700f,600f);
拉伸显示局部
此时在控件X轴100f位置开始绘制资源Bitmap的(0,0)到(400,600)局部区域,最终的显示效果就成了拉伸局部的效果。Y轴同理
这两个参数的作用,用几个数简单测试一下,比较直观。
1.1.3 第4个方法 drawBitmap(@NonNull Bitmap bitmap, @NonNull Matrix matrix, @Nullable Paint paint)简单使用
private void init() { mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.test); matrix = new Matrix(); matrix.setTranslate(100f,100f); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawBitmap(bitmap,matrix,mPaint); }
drawBitmap第4个方法
Matrix是一个3 * 3的矩阵,下篇进行记录学习
1.2 画Line方法画一条线的方法
drawLine(float startX, float startY, float stopX, float stopY, @NonNull Paint paint)