Android View的绘制和动画效果的实现

在 Android 应用开发里面,UI是非常重要的一部分,一般情况下,你使用自带控件,再加上一些开源库,已经能够实现大部分的UI效果了,但是对于一些比较花哨比较新颖的效果,,往往需要通过自定义view来实现,自定义View 每个人多多少少都会一点,,但是完全掌握的人却不多,在这我说的这个完全掌握,指的是给你一个任意的设计,只要这个设计是Android能够做到的,你只要能够给做出来,全能给实现,那么这个就是我说的完全掌握自定义view,说到这儿,可能有人觉得,你说的这个标准太高了,不现实啊,,我要学习你这个程度,他需要你花的时间和精力都太多了,但其实要掌握自定义view,真的没有那么难,你只要掌握它的三个关键的知识点,布局,绘制和触摸反馈,也就是对于一个界面来说,它里面的控件,怎么把它们 用正确的大小,摆放到正确的位置,显示出正确的内容,以及对用户的一些触摸操作给出正确的反馈,就这么点东西

绘制

所谓绘制,指的就是控件内容的显示,什么意思呢?我们作为软件的开发者,控件显示什么内容肯定是由我们来控制的.但是一般情况下,我们并不是直接操作绘制这些绘制内容,而是通过Api对控件进行设置,然后控件自己完成绘制过程,例如:你通过一行 setText() ,把文字设置给TextView,它自己会负责显示在合适的位置,至于文字的起始坐标,从哪个字开始自动换行,换行之后怎么保证行与行之间依然对齐的,这些你都不用关注,而自定义绘制指的就是由你来接管这个绘制过程,去操作这些绘制细节以此来显示本来自带控件显示不出的内容,例如:你要做一个统计表格,如果要纯文字的显示,那使用自带控件很容易就能做出来,但如果要你用直方图,那自带控件做起来就有点麻烦了,就算能做出来,比如:RelativeLayout 加上一堆控件硬是给拼出来了,也是很复杂的,而且性能可能会出问题,假如我再换一个,换成饼图呢?自带控件就完全做不出来了.而不管是直方图还是饼图,还是其他各种各样简单复杂的界面,使用自定义绘制都能很轻松的绘制出来,这个就是自定义绘制的作用,下面我简单说一下自定义绘制的实现,Android里的绘制是在每一个 View 绘制方法里发生的 ,一个 View 的绘制方法里面写了什么代码,他就会绘制什么内容,而自定义绘制就是通过重写绘制方法,插入你自己的绘制代码来实现的,绘制方法不是一个方法,有好几个,其中最常见的叫做 onDraw() onDraw()这个绘制方法,它负责 View 的主体的绘制,例如:TextView 的文字,ImageView 的图像,都是 onDraw () 里绘制的,具体执行绘制操作的是 onDraw() 里面的canvas 参数,例如:你写一行 canvas.drawCicle() 你的View 就会在内部 画一个圆,显示给用户看,这个Canvas 是什么?从名字来看: 画布,现实中的画布是画的载体,你把画画在画布上 对吧,而在Android里面,Canvas 就是一个绘制工具,它唯一的功能就是绘制,drawCicle 只是一个例子,Canvas 能画的非常多,方块 三角 ,不规则图形,图片,文字都可以,实际上你所见过的Android 应用中的界面 ,几乎全部是用Canvas绘制的,除了 一些3D 游戏会用到 OpenGL ,所以只要掌握了 Canvas,你就基本上能做出所有的界面了,好!简单说一下Canvas

Canvas

  • drawCicle
    drawCicle 的意思 从名字就能看出来: 画一个圆,在它的参数里,有圆的坐标和半径这些基本信息另外还有一个叫Paint的参数, ,本意是颜料,颜料是干什么的,涂色的,而Android里面的这个Paint,它是加强版的颜料,它负责提供的颜色和风格信息,所谓风格就是:例如这个圆是空心还是实心,线条粗细是多少,有没有阴影,等等这些附加信息,除了我说的这几个,Paint还可以提供其他风格信息,具体的我会在以后给出详细的讲解,Paint这个类对于绘制非常关键,如果你想掌握自定义绘制,一定把它了解清楚除了 drawCicle , 还有:

  • drawRect

  • drawBitmap

  • drawText

另外:除了直接绘制,Canvaus 还有 两类, 一类是绘制范围的裁切,这个很好理解,你通过裁切来把绘制限制在某个范围内,然后当你绘制的时候,超出部分会被切掉,不会显示出来,这些方法全部以
clip- 开头,使用也很简单
另一类是绘制内容的集合变换,什么是几何变换呢,我举个例子,放大缩小就是几何变换的一种,平移和旋转也是几何变换,还有错切 水平错切 垂直错切.那么具体有哪些变换呢?你可以这么想一下.把你绘制区域的四个顶点任意拉扯,绘制的内容就会发生相应的变化.这些拉扯所对应的所有形变都是几何变换,这些奇形怪状的变换你别觉得没有用, 3D 绘制的 模拟 就是用他们做的 , 比如一个页面 像纸一样 翻起来的效果,其实就是吧绘制区域做了两个顶点的拉伸,以及高度的压缩,好 前面说的就是自定义绘制最核心的技巧 . 重写 onDraw 方法 ,在里面用Canvas 的一些 方法进行绘制, 配合上 范围内 和几何变换,来达到想要的效果 会了这些,你就会想画什么就画什么了.不过,还有一个问题:绘制顺序,假设你写了一个自定义layout ,重写她的 onDraw() ,然后在里面画了一些想要的东西 ,之 后你会发现,当添加了子View之后,绘制的内容会被子View给盖住,如果这是你想要的这样没有问题,但如果你期望的是他盖住子View,那么,而不是被子View盖住呢?Android里面的绘制是按顺序的,先绘制的内容会被后绘制的盖住,前面我说了绘制方法不是只有一个,有好几个,其中onDraw()方法只是负责主题内容的绘制,另外还有一些方法有负责绘制背景的,有负责绘制前景的,有负责整体内容绘制的, 他们在整个绘制过程中都处于各自不同的绘制步骤,也就是不同的步骤,如果你对你的遮盖关系有你的特殊要求,那么你就需要了解这个步骤,去了解它们每一个绘制方法处于这个绘制过程的哪一个位置.然后,在实际使用过程中,你就知道自己应该选择哪一个绘制方法来重写,从而达到你想要的绘制效果,好,自定义绘制大概就是这样,现在,我简单的总结一下:
自定义绘制的绘制方式:

  • 重写绘制方法(最常用 onDraw())

  • 绘制的关键: Canvas

    • Canvas 绘制类方法: drawXXX() (关键参数: Paint)
    • Canva 类的辅助 : 范围裁切(clipXXX()) 和 几何变换
  • 使用不同绘制方法来控制遮盖关系

猜你喜欢

转载自blog.csdn.net/Kibaco/article/details/88086226