《Android群英传》---读书笔记1

来源:互联网 发布:淘宝怎么删除追加评论 编辑:程序博客网 时间:2024/05/01 13:09

Android群英传—-读书笔记

标签: android进阶 读书笔记


1.3 Android app组件架构

应用运行上下文
可以理解为Context即为android系统中应用的上下文对象
Activity, Service, Application都是继承自Context
当应用程序第一次启动的时候,Android系统会创建一个Application对象,同时创建Application Context,所有组件共同拥有这样一个Context对象,这个Context在整个应用程序的生命周期都存在,为应用全局提供功能和环境支持
getApplicationContext()可以获取该全局Context

3.1 Android控件架构

每个Activity都包含一个Window对象(通常由PhoneWindow实现),然后该Window(PhoneWindow)将DecorWindow作为整个应用窗口的根View,然后DecorWindow将屏幕分为两部分即TitleView和ContentView(ContentView是一个ID为content的FrameLayout)

3.2 View的测量

1 onMeasure(int widthMeasureSpec,int heightMeasureSpec)方法
注意widthMeaureSpec和heightMeasureSpec都是MeasureSpec类,MeasureSpec是一个32的int值,高二位表示测量模式,低30位表示测量的大小,
MeasureSpec.getMode()和MeasureSpec.getSize()可以分别获取模式和大小,测量模式分为EXACTLY,AT_MOST,UNSPECIFIED 系统默认的onMeasure方法只支持EXACTLY模式,所以我们必须自己重写onMeasure来支持其他的模式

2 onMeasure方法最终会将测量好的宽和高作为参数调用系统的setMeasuredDimension(int,int)方法
(所以我们可以重写onMeasure方法然后在其内部调用setMeasuredDimension方法,实现自己的测量逻辑)

3.4 ViewGroup的测量

在自定义ViewGroup中通常需要重写onLayout()方法来控制子View的显示位置,如果支持wrap_content属性(即AT_MOST模式)还必须重写onMeasure方法

3.6 自定义View

1 对现有控件进行扩展
2 通过组合来实现新的控件
3 重写View来实现全新的控件
在View中通常由以下重要的回调方法
onFinishInflate():从XML加载组件后回调
onSizeChanged():组件改变大小时回调
onMeasure():回调该方法进行测量
onLayout():回调该方法来确定显示的位置
onTouchEvent():监听到触摸事件回调

3.6.1 对现有控件进行扩展
一般可以在onDraw()方法中对原生控件进行扩展

3.6.2 创建复合控件
一般可以创建出具有重用功能的控件集合。通常要继承一个合适的ViewGroup,再给它添加指定功能的控件,通常我们还会给它指定一些可配置自定义的属性,让它具有更好的扩展性。
自定义属性:
1在values目录里面创建一个attr.xml文件
2在文件里面通过

    <declare-styleable> 标签来声明使用了自定义的属性 并通过name属性确定引用的名称,最后通过    <attr>声明具体的自定义属性 ,其中name确定属性的具体名称,format属性确定属性的类型(可以用|来将多个类型分隔开来表示多个类型)例如<resoures>    <declare-styleable name="TopBar">    <attr name="title" format="string">    <attr name="titleSize" format="dimension">    <attr name=titleColor"  format="color">    <attr name="leftBackBackground" format="reference|color">    </declare-styleable></resoures>

3在构造方法中通过TypedArray ta=context.obtainStyledAttributes(attrs,R.styleable.TopBar)获得自定义属性集
然后可以通过TypedArray 的getString(),getColor()等方法,就可以获取这些自定义的属性值(color类型对应的类型值为int,图片的引用类型为Drawable)

4获取属性值之后再构造方法中回收TypedArray 调用ta.recycle()方法

5将获得的属性设置给我们的具体控件

6定义接口

7暴露接口给调用者

 注意 如果想引用自定义属性我们还必须指定第三方控件的引用的名字空间 在android studio中统一用 xmlns:custom="http://schemas.android.com/apk/res-auto" 来引用 这样就可以在布局文件中引用自定义的属性了

3.6.3
重写View来实现全新的控件
一般可以通过这种方式实现复杂的图表等效果,主要通过重写onDraw(),onMeasure()等方法来实现

3.8 事件拦截机制分析

可以借用下面的伪代码来记忆

public boolean dispatchTouchEvent(MotionEvent ev){        boolean intercepted=false;    if(onInterceptTouchEvent(ev))    {        intercepted=onTouchEvent(ev)    }else    {        inptercepted=child.dispatchTouchEvent(ev);    }    return intercpeted;}

事件传递的时候先调用dispatchTouchEvent,在调用onInterCeptTouchEvent :如果为true,表示拦截,不继续l;反之不拦截,继续
事件处理的返回值即onTouchEvent:true,处理了不用返回给父类了;反之返回给父类处理

初始情况下,返回值都是false

理解事件拦截机制的目的就是来处理滑动冲突
一般来说有两种解决办法即:
1父类拦截法
2子类拦截法
详细的代码示例可以参看《Android开发艺术探索》P158

0 0
原创粉丝点击