Android View学习(二) -- View绘制流程

基于 android 2.3.3_r1 代码研究

Android中的任何一个布局、任何一个控件其实都是直接或间接继承自View的,如 TextView、Button、ImageView、ListView 等。知道了View的绘制原理,我们就可以自由定制个性化的View。

每一个视图的绘制过程都必须经历三个最主要的阶段,即 onMeasure()、onLayout() 和 onDraw(),下面我们逐个对这三个阶段展开进行探讨。


一. onMeasure

measure 即测量的意思,onMeasure 方法顾名思义就是用于测量视图的大小的。View 系统的绘制流程会从 ViewRoot 的 performTraversals() 方法中开始,在其内部调用 View 的 measure() 方法。measure() 方法接收两个参数,widthMeasureSpec 和 heightMeasureSpec,这两个值分别用于确定视图的宽度和高度的规格和大小。

Show More

Android View学习(一) -- LayoutInflater

基于 android 2.3.3_r1 代码研究

我们在 activity 中加载布局文件通常使用如下方法:

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
/**
 * Set the activity content from a layout resource.  The resource will be
 * inflated, adding all top-level views to the activity.
 * 
 * @param layoutResID Resource ID to be inflated.
 */
public void setContentView(int layoutResID) {
    getWindow().setContentView(layoutResID);
}

/**
 * Set the activity content to an explicit view.  This view is placed
 * directly into the activity's view hierarchy.  It can itself be a complex
 * view hierarhcy.
 * 
 * @param view The desired content to display.
 */
public void setContentView(View view) {
    getWindow().setContentView(view);
}

/**
 * Set the activity content to an explicit view.  This view is placed
 * directly into the activity's view hierarchy.  It can itself be a complex
 * view hierarhcy.
 * 
 * @param view The desired content to display.
 * @param params Layout parameters for the view.
 */
public void setContentView(View view, ViewGroup.LayoutParams params) {
    getWindow().setContentView(view, params);
}

不管使用上面哪个方法,最终都需要使用 LayoutInflater 将 xml 定义的 layout 布局文件解析为 View 对象。

下面我们就来把LayoutInflater的工作流程仔细地剖析一遍。

Show More

Android中使用TextView显示HTML文本

再Android中可用使用TextView来显示HTML文本:


TextView中显示HTML文本:

final String htmlString = "<font color="#00ff0000">abcdefg</font>";
final TextView tv = (TextView)findViewById(R.id.tv);
tv.setText(Html.fromHtml(htmlString));

如上可以显示一串红色文本。


去除HTML标签

还可以将HTML文本中的标签去除,转换为普通文本:

final String htmlString = "<font color="#00ff0000">abcdefg</font>";
final String normalString = Html.fromHtml(htmlString).toString();
final TextView tv = (TextView)findViewById(R.id.tv);
tv.setText(normalString);

这样可以快捷的将HTML文本转换为不含HTML标签的文本

Show More

Java的反射机制

在Java 运行时 环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用他的方法?这些答案是肯定的,这种动态获取类的信息,以及动态调用类的方法的功能来源于JAVA的反射。从而使java具有动态语言的特性。


JAVA反射机制主要提供了以下功能:

1.在运行时判断任意一个对象所属的类
2.在运行时构造任意一个类的对象
3.在运行时访问任意一个类所具有的成员变量和方法(通过反射甚至可以调用private方法)
4.在运行时调用任意一个对象的方法(注意:前提都是在运行时,而不是在编译时)

Java 反射相关的API简介:

与反射有关的所有接口以及类都在java.lang.reflect包里。

接口

接口摘要
AnnotatedElement 表示目前正在此 VM 中运行的程序的一个已注释元素。
GenericArrayType GenericArrayType 表示一种数组类型,其组件类型为参数化类型或类型变量。
GenericDeclaration 声明类型变量的所有实体的公共接口。
InvocationHandler InvocationHandler 是代理实例的调用处理程序 实现的接口。
Member 成员是一种接口,反映有关单个成员(字段或方法)或构造方法的标识信息。
ParameterizedType ParameterizedType 表示参数化类型,如 Collection<String>。
Type Type 是 Java 编程语言中所有类型的公共高级接口。
TypeVariable<D extends GenericDeclaration> TypeVariable 是各种类型变量的公共高级接口。
WildcardType WildcardType 表示一个通配符类型表达式,如 ?、? extends Number 或 ? super Integer。

类摘要
AccessibleObject AccessibleObject 类是 Field、Method 和 Constructor 对象的基类。
Array Array 类提供了动态创建和访问 Java 数组的方法。
Constructor<T> Constructor 提供关于类的单个构造方法的信息以及对它的访问权限。
Field Field 提供有关类或接口的单个字段的信息,以及对它的动态访问权限。
Method Method 提供关于类或接口上单独某个方法(以及如何访问该方法)的信息。
Modifier Modifier 类提供了 static 方法和常量,对类和成员访问修饰符进行解码。
Proxy Proxy 提供用于创建动态代理类和实例的静态方法,它还是由这些方法创建的所有动态代理类的超类。
ReflectPermission 反射操作的 Permission 类。
Show More

Ubuntu12.04安装SVN 1.7

Ubuntu12.04LTS默认安装的SVN版本是1.6的,使用apt-get无法升级到1.7。我们可以下载源码自己编译安装,或者使用第三方PPA仓库来安装。

在Launchpad上有subversion的官方PPA可以使用:

打开软件源配置文件:

sudo vim /etc/apt/sources.list
Show More

Ubuntu12.04开机自动开启数字小键盘

Ubuntu12.04开启后数字小键盘默认是关闭的,不方便使用。可以使用numlocxk程序在Ubuntu启动后自动将小键盘打开:

numlockx程序有3个可用命令:

numlockx on          打开数字小键盘
numlockx off         关闭数字小键盘
numlockx toggle      开关数字小键盘
Show More

SparseArray分析

SparseArray(稀疏数组)是android提供的建议替换HashMap<Integer, E>的用来存储整型、对象键值对的类。它比HashMap<Integer, E>要高效轻量。其内部使用了两个数组来分别缓存key和value,查找使用折半通过key来查找。

SparseArray提供以下方法:

构造

SparseArray提供了两个构造函数:

public SparseArray();//默认初始化容器大小为10

public SparseArray(int initialCapacity);

public void put(int key, E value);//增加或替换

public void append(int key, E value);//同put,对key大于所有已缓存key情况进行了优化

public void delete(int key);

public void remove(int key);//同delete

public void removeAt(int index);

public void clear();

public void setValueAt(int index, E value);//设置序号index处value

public E get(int key);//没有则返回null

public E get(int key, E valueIfKeyNotFound);//没有返回valueIfKeyNotFound

public int keyAt(int index);

public E valueAt(int index);

public int indexOfKey(int key);

public int indexOfValue(E value);
Show More

ListView的onItemClick事件无法响应问题

我们在使用ListView时,可以会遇到点击列表项时,onItemClick事件没有被调用,我们的点击没有响应,这种情况往往是由于列表项点击事件被列表项中的其他控件截获的原因:

Show More

Jekyll -- 使用摘要

摘要是博客的一个重要部分,有助于使读者对博文有个简要的直观认识。我看到很多使用Jekyll的博客,有的是自己定义变量并使用代码来提取摘要,也有使用其他方法的。这可能是早期的Jekyll没有提供摘要的缘故,现在这些已经是不必要的了。Jekyll从1.0版本开始,提供了两种使用摘要的方法:

  1. 在_config.yml文件中设置摘要分割符
  2. 在YAML Front-Matter中设置excerpt变量
Show More

Jekyll文档(十一) -- Pagination

对于很多网站来说,尤其是对于博客,我们很常见的将我们的posts的很长的列表分成多个小的列表并分多页进行展示。Jekyll有内置的分页,我们可以自行为分页的列表产生合适的文件和目录。

分页只能适用于HTML文件

Jekyll的分页并不适用于Jekyll网站中的Markdown或者Textile的文件,只适用于HTML文件。一般我们都是使用分页来展示posts,因此这个问题基本没有影响。

Show More

—  我的个人空间 |   —