Android 动画机制总结

1.Android动画类型

1.1 Android动画类型分类
  • 逐帧动画【Frame Animation】,即顺序播放事先做好的图像,跟电影类似
  • 补间动画【Tween Animation】,即通过对场景里的对象不断做图像变换 ( 平移、缩放、旋转 ) 产生动画效果
阅读更多

Android 自定义 ViewGroup

01.自定义ViewGroup步骤

  • 自定义ViewGroup
    • 自定义ViewGroup一般是利用现有的组件根据特定的布局方式来组成新的组件,大多继承自ViewGroup或各种Layout,包含有子View。
  • 大概的步骤如下所示
    • 1、创建类继承ViewGroup
    • 2、测量View
    • 3、布局View
    • 4、绘制View
    • 5、事件分发处理
阅读更多

Android 获取 View 宽高

01.获取View宽高的方式

1.1 onWindowFocusChanged

  • 如下所示

    1
    2
    3
    4
    5
    6
    7
    8
    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    if (hasFocus) {
    int width = view.getMeasuredWidth();
    int height = view.getMeasuredHeight();
    }
    }
阅读更多

Android 自定义 View 控件

01.自定义控件步骤

  • 根据Android Developers官网的介绍,自定义控件你需要以下的步骤。(根据你的需要,某些步骤可以省略)
    • 1、创建View
    • 2、处理View的布局
    • 3、绘制View
    • 4、与用户进行交互
    • 5、优化已定义的View
  • 上面列出的五项就是android官方给出的自定义控件的步骤。
    • 每个步骤里面又包括了很多细小的知识点。可以记住这五个点,并且了解每个点里包含的小知识点。再加上一些自定义控件的练习。不断的将这些知识熟练于心,相信我们每个人都能够定义出优秀的自定义控件。接下来我们开始对上面列出的5个要点进行细化解说。
阅读更多

Android View 之 invalidate,requestLayout,postInvalidate

01.requestLayout、invalidate与postInvalidate作用与区别

  • invalidate() postInvalidate()
    • 共同点:都是调用onDraw()方法,然后去达到重绘view的目的
    • 区别:invalidate()用于主线程,postInvalidate()用于子线程【通过handler发送消息,在handleMessage中((View) msg.obj).invalidate(),】
阅读更多

Android View 之 Canvas,Paint,Matrix,Rect 等介绍

1.Paint画笔介绍

  • Paint即画笔,在绘图过程中起到了极其重要的作用,画笔主要保存了颜色, 样式等绘制信息,指定了如何绘制文本和图形,画笔对象有很多设置方法,大体上可以分为两类,一类与图形绘制相关,一类与文本绘制相关。

1.1 图形绘制

  • 常用的方法有这些

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    * 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_AND_STROKE,或STROKE
    * setStrokeCap(Paint.Cap cap);
    当画笔样式为STROKE或FILL_AND_STROKE时,设置笔刷的图形样式,如圆形样式 Cap.ROUND,或方形样式Cap.SQUARE
    * setSrokeJoin(Paint.Join join);
    设置绘制时各图形的结合方式,如平滑效果等
    * setStrokeWidth(float width);
    当画笔样式为STROKE或FILL_AND_STROKE时,设置笔刷的粗细度
    * setXfermode(Xfermode xfermode);
    设置图形重叠时的处理方式,如合并,取交集或并集,经常用来制作橡皮的擦除效果
阅读更多

Android View 之 onDraw 深入介绍

1.Draw绘制过程

1.1 View的绘制过程遵循步骤

  • View的绘制过程遵循如下几步:
    • ①绘制背景 background.draw(canvas)
    • ②绘制自己(onDraw)
    • ③绘制Children(dispatchDraw)
阅读更多

Android View 之 onMeasure 深入介绍

01.Measure流程分析

  • 顾名思义,就是测量每个控件的大小。调用measure()方法,进行一些逻辑处理,然后调用onMeasure()方法,在其中调用setMeasuredDimension()设定View的宽高信息,完成View的测量操作。

    1
    2
    public final void measure(int widthMeasureSpec, int heightMeasureSpec) {
    }
阅读更多

Android View 之 onLayout 深入分析

01.Layout流程

  • 测量完View大小后,就需要将View布局在Window中,View的布局主要通过确定上下左右四个点来确定的。

    • 其中布局也是自上而下,不同的是ViewGroup先在layout()中确定自己的布局,然后在onLayout()方法中再调用子View的layout()方法,让子View布局。在Measure过程中,ViewGroup一般是先测量子View的大小,然后再确定自身的大小。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    public void layout(int l, int t, int r, int b) {  

    // 当前视图的四个顶点
    int oldL = mLeft;
    int oldT = mTop;
    int oldB = mBottom;
    int oldR = mRight;

    // setFrame() / setOpticalFrame():确定View自身的位置
    // 即初始化四个顶点的值,然后判断当前View大小和位置是否发生了变化并返回
    boolean changed = isLayoutModeOptical(mParent) ?
    setOpticalFrame(l, t, r, b) : setFrame(l, t, r, b);

    //如果视图的大小和位置发生变化,会调用onLayout()
    if (changed || (mPrivateFlags & PFLAG_LAYOUT_REQUIRED) == PFLAG_LAYOUT_REQUIRED) {

    // onLayout():确定该View所有的子View在父容器的位置
    onLayout(changed, l, t, r, b);
    ...

    }
阅读更多

Android View 绘制流程

01.View绘制的流程框架

  • 如图所示
    • img
  • View的绘制是从上往下一层层迭代下来的。DecorView–>ViewGroup(—>ViewGroup)–>View ,按照这个流程从上往下,依次measure(测量),layout(布局),draw(绘制)。
阅读更多