Android群英传笔记

Posted by 程序亦非猿 on 2015-10-20

Android群英传

前言

医生写的,适合进阶,不适合初学者,在这里记录一下自己所学到的知识点.

本人是奔着自定义的相关知识点来的,所以对这方面的知识点有所侧重.

第三章

  1. 整个界面的控件形成一个控件树,上层控件负责下层子控件的测量与绘制,并传递事件,并且每个控件树的顶点都有一个ViewParent对象,所有交互事件都由它控制
  2. findViewById在控件树中已深度优先遍历来查找对应元素.
  3. 每个Activity都包含一个Window对象(通常是PhoneWindow),它将DecorView设为整个应用窗口的根View
  4. requestWindowFeature()方法一定要在调用setContentView之前才有效.
  5. onResume之后,系统才将DecorView添加到PhoneWindow并显示.
  6. MeasureSpec,一个32位的int值,高2位为测量的模式,低30位为测量的大小(位运算提高并优化效率)
  7. EXACTLY 精确模式, 具体值/match_parent
  8. AT_MOST,最大值模式—wrap_content,表示子控件不允许超过该大小
  9. UNSPECIFIED,想多大多大,通常用于自定义View
  10. View默认的onMeasure只支持Exactly,可以响应具体值和match_parent,所以自定义View如果要支持wrap_content则需要重写onMeasure
  11. 通过MeasureSpec.getMode和getSize方法获取测量模式与大小.
  12. 最终要setMeasuredDimension(width,height)完成测量
  13. Canvas的bitmap与canvas是紧紧联系在一起的,这过程成为装载画布
  14. 该bitmap存储所有绘制在Canvas上的像素信息(即canvas.drawXXX()都发生在该bitmap上)
  15. mTouchSlop = ViewConfiguration.getScaledTouchSlop()

第四章

  1. 使用viewholder提高效率
  2. 设置显示第几项setSelection(int n),smoothScrollBy(distance,duration),smoothScrollByOffset(offset),smoothScrollToPosition(index)
  3. listview.setEmptyView(view)处理空数据
  4. 弹性ListView实现方法:重写overScrollBy(..int maxOverScrollY),重新赋值参数maxOverScrollY即可

第五章

  1. 屏幕最左上角顶点作为Android坐标系的原点

  2. getLocationOnScreen(int location[])获取在Android坐标系中的位置

  3. ViewGroup.MarginLayoutParams更方便

  4. 通过getLayoutParams可获取LayoutParams对象

  5. ViewDragHelper.smoothSlideViewTo(view,x,y)

  6. ViewCompat.postInvalidateOnAnimation(view)

第六章(todo)

  1. canvas.save()保存画布,canvas.restore()将我们在save之后绘制的所有图像与save之前的图像进行合并(似PS中的合并图层)
  2. canvas.translate(x,y)将原点(0,0)移动到(x,y)并以新的点作为原点
  3. canvas.saveLayer(),saveLayerAlpha()将一个图层入栈,并且后面的操作都发生在这个图层
  4. restore(),restoreToCount()将一个图层出栈,把图层上的图像绘制到上层Canvas上
  5. ColorMatrix,一个4X5的数字矩阵,处理色彩效果.
  6. ColorMatrix.setRotate(int rgb,int value)设置色调,0,1,2分别对应RGB
  7. 饱和度(饱和度为0时,图像就变成灰度图像了)colorMatrix.setSaturation(float sat)
  8. 亮度(亮度为0时,图像就全黑了)colorMatrix.setScale(float rScale, float gScale, float bScale,float aScale)
  9. 矩阵的乘法(将矩阵的作用效果混合,从而叠加处理效果):postContact
  10. 使用ColorMatrix,paint.setColorFilter(new ColorMatrixColorFilter(colorMatrix))接着canvas.drawxx(...,paint)

6.6 Android图像处理之图形特效处理

  1. 变形矩阵Matrix,一个3X3的矩阵,
    |A B C|
    |D E F|
    |0 0 1|
    初始为:
    |1,0,0|
    |0,1,0|
    |0,0,1|
  2. Matrix的四类变换:
  • 平移 set.translate 由CF控制
  • 旋转 set.rotate 由ABCD共同控制
  • 缩放 set.scale 由AE控制
  • 错切 set.skew 由BD控制
  1. pre()post()提供矩阵的前乘和后乘运算,两者不相同(因此,矩阵不满足乘法交换律)
  2. drawBitmapMesh(P144)

6.7画笔特效处理

  1. PoterDuffXfermode 最好关闭硬件加速

  2. Shader着色器,渲染器,用来实现一些列的渐变,渲染效果

  • BitmapShader 位图Shader
  • LinearGradient 线性
  • RadialGradient 光束
  • SweepGradient 梯度
  • ComposeShader 混合
  1. SurfaceView 适用于频繁更新或刷新时数据处理量比较大
  2. lockCanvas()获取Canvas,但是需要drawColor清屏
  3. unlockCanvasAndPost(mCanvas)提交canvas的内容(最好放在finally代码块中)

第七章

  1. 视图动画,优点:简单,缺点:不具备交互性
  • AlphaAnimation
  • RotateAnimation
  • TranslateAnimation
  • ScaleAnimation
  • AnimationSet
  1. 属性动画
  • ObjectAnimator 单一属性
  • PropertyValuesHolder 多个属性结合
  • ValueAnimator
  • AnimatorSet

Q&A(todo)

1
2
3
4
5
6
7
8
9
10
void methodA(){
Object object;
object = new Object();
}
void methodB(){
Object object;
object = new Object();
object = null;
}

Q:methodB 中的最后一行是否会让object的堆内存回收掉?还是说依然要等GC?

A:要等gc的,gc的时候 会去找对象是否还有ref 如果没有的话 才清除 你=null只是清除了ref