canvas教程

Android 自定义View学习(七)

字号+ 作者:H5之家 来源:H5之家 2017-01-20 18:09 我要评论( )

上篇的学习,Paint中的基础知识基本结束,笔学完了,学习开始学习画布。本篇记录学习Canvas中的一些知识。在drawBitmap()方法中会引出计划下篇要学习的内容Matrix,drawPath()方法会引出计划在下下篇学习的贝塞尔曲线,学习的重点也是这两个方法 学习资料:

上篇的学习,Paint中的基础知识基本结束,笔学完了,学习开始学习画布。本篇记录学习Canvas中的一些知识。在drawBitmap()方法中会引出计划下篇要学习的内容Matrix,drawPath()方法会引出计划在下下篇学习的贝塞尔曲线,学习的重点也是这两个方法

学习资料:

  • 爱哥的自定义控件其实很简单5/12
  • Canvas api
  • 本人很菜,有错误,请指出

    虽然称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)
  • bitmap 要画的目标Bitmap
  • left 左上角的X轴坐标
  • top 左上角的Y轴坐标
  • 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

  • src 用来截取Bitmap局部所想要显示的像素块区域,通过构造方法中的四个坐标系点确定范围。这个参数可以为null,为null就是整个Bitmap都作为目标资源显示
  • dst 用来显示的区域,在控件中绘制Bitmap的区域,可以实现拉伸或者缩放
  • 简单使用

    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) ,构造方法中四个参数分别为:

  • x, X轴开始的坐标点,默认为0
  • y, Y轴开始的坐标点
  • x1, X轴结束的坐标点,若x1-x大于了Bitmap的宽度,截取的有效区域就是Bitmap的宽度
  • y1, Y轴结束的坐标点
  • 第3个参数rectF = new RectF(x,y,x1,y1),构造方法中四个参数分别为:

  • x,开始绘制的X轴的坐标点,默认为0
  • y,开始绘制的Y轴的坐标点
  • x1,结束绘制的X轴的坐标点,若x1-x大于src中x1-x,就是拉伸;小于就是缩放
  • y1,结束绘制的Y轴的坐标点
  • 简单修改代码:

    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)

     

    1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

    相关文章
    • Android开发之50个常见实用技巧——添加悦目的动画效果

      Android开发之50个常见实用技巧——添加悦目的动画效果

      2017-01-15 08:02

    • 用Shader实现特殊效果

      用Shader实现特殊效果

      2017-01-14 17:00

    • 8.1.2 setAlpha方法:设置透明度

      8.1.2 setAlpha方法:设置透明度

      2017-01-11 12:03

    • Android使用ImageView制作透明圆弧实例代码

      Android使用ImageView制作透明圆弧实例代码

      2017-01-10 09:00

    网友点评