本文主要分析书架模块的原理和模型
书架的整体分为书架、书城、账户,统一到一个Activity为:MainActivity,继承TabActivity
书架的整体布局是TabHost,布局文件为maintabs.xml,整体分布如图
[img]http://dl.iteye.com/upload/attachment/0066/1908/0089400b-ecc1-3438-88bf-1630bb4b5d8d.png[/img]
本文主要介绍书架的架构
入口函数:onCreate
1. 设置notitle(这个可以放到activity的配置文件中)
2. 设置layout为new_bookstand.xml:顶部阴影,两侧图片中间是自定的listview:com.qq.reader.view.SpringListView.java,这个list是可以支持整体滑动效果的,从1.0版本到现在始终是这个listview。
3. 初始化listview的适配器
1. 获取屏幕宽度,除以每本所占的宽度,计算每行可以展示书本个数cols,这样解决了多种屏幕展示的问题
2. 获取屏幕高度,除以每行书架所占的高度,计算每屏幕可以展示的书架行数rows,书架最小行数为cols+1;
3. getCount即list的行数等于:(书本总个数 + 1)除以每行展示的个数;
4. getView,单个视图为new_liner_item.xml,它其实是个linearLayout,用于存放单个书本的view,本质上是每行的容器,其中设置了背景等基本排版信息。
1. 生成每本书的layout对象bookmarkstanditem.xml,渲染模板后,添加到父容器linearLayout中。直到填满每行展示的书本个数。
2. 如果父容器已经存在,则便利父容器的子视图对象,逐一渲染
5. getItem/getItemId,大家都懂得。
6. listview添加了header,本质是textView,就是书架上方的广告栏,支持点击事件
7. 书本的点击函数在哪里?
1. 不可在listview上添加点击,因为书本知识listview每行中的一本,点击事件只能添加到每本书的布局视图上
2. QQ的点击事件在书本视图的最外层RelativeLayout上,并把当前书本的id放在tag中,当点击书本时,点击函数从getItem传入tag,获取书本对象,打开书本。
8. 书本的长按函数在哪里?
1. 同样也在layout上,长按函数本质是图案出一个对话框,根据layout的tag中的书本id获取书本对象后,渲染dialog的内容。
9. 书架左侧书本分类与广告都在listview的head视图中(standlist_header.xml)
1. 本质也是对话框,通过设置进入和退出动画,给人的感觉是好像从书架延伸出来的一样。
2. 点击分类名的核心代码
首先设置listview的当前选择项为0,然后展示对话框
10. 书架下侧的本地文件浏览窗口
1. 实现方式:SlidingDrawer(滑动抽屉)
2. 抽屉分为抽屉句柄和抽屉内部内容,点击句柄“本地”按钮,设置动画显示抽屉的内容,点击“返回”隐藏抽屉的内容
书架的整体分为书架、书城、账户,统一到一个Activity为:MainActivity,继承TabActivity
public class MainActivity extends TabActivity implements CompoundButton.OnCheckedChangeListener, cu, m
书架的整体布局是TabHost,布局文件为maintabs.xml,整体分布如图
[img]http://dl.iteye.com/upload/attachment/0066/1908/0089400b-ecc1-3438-88bf-1630bb4b5d8d.png[/img]
分别对应
书架:BookStandActivity.java
书城:WebBrowser.java
账户:ProfileActivity.java
本地:点击出现本地文件浏览窗口
本文主要介绍书架的架构
BookStandActivity extends ReaderBaseActivity implements DialogInterface.OnCancelListener, View.OnCreateContextMenuListener
入口函数:onCreate
1. 设置notitle(这个可以放到activity的配置文件中)
2. 设置layout为new_bookstand.xml:顶部阴影,两侧图片中间是自定的listview:com.qq.reader.view.SpringListView.java,这个list是可以支持整体滑动效果的,从1.0版本到现在始终是这个listview。
3. 初始化listview的适配器
1. 获取屏幕宽度,除以每本所占的宽度,计算每行可以展示书本个数cols,这样解决了多种屏幕展示的问题
2. 获取屏幕高度,除以每行书架所占的高度,计算每屏幕可以展示的书架行数rows,书架最小行数为cols+1;
3. getCount即list的行数等于:(书本总个数 + 1)除以每行展示的个数;
4. getView,单个视图为new_liner_item.xml,它其实是个linearLayout,用于存放单个书本的view,本质上是每行的容器,其中设置了背景等基本排版信息。
1. 生成每本书的layout对象bookmarkstanditem.xml,渲染模板后,添加到父容器linearLayout中。直到填满每行展示的书本个数。
2. 如果父容器已经存在,则便利父容器的子视图对象,逐一渲染
5. getItem/getItemId,大家都懂得。
6. listview添加了header,本质是textView,就是书架上方的广告栏,支持点击事件
7. 书本的点击函数在哪里?
1. 不可在listview上添加点击,因为书本知识listview每行中的一本,点击事件只能添加到每本书的布局视图上
2. QQ的点击事件在书本视图的最外层RelativeLayout上,并把当前书本的id放在tag中,当点击书本时,点击函数从getItem传入tag,获取书本对象,打开书本。
8. 书本的长按函数在哪里?
1. 同样也在layout上,长按函数本质是图案出一个对话框,根据layout的tag中的书本id获取书本对象后,渲染dialog的内容。
9. 书架左侧书本分类与广告都在listview的head视图中(standlist_header.xml)
1. 本质也是对话框,通过设置进入和退出动画,给人的感觉是好像从书架延伸出来的一样。
2. 点击分类名的核心代码
@Override
public final void onClick(View paramView) {
((ListView) BookStandActivity.j(this.a)).setSelection(0);
BookStandActivity.b(this.a, false);
a.a(13, 0);
}
首先设置listview的当前选择项为0,然后展示对话框
10. 书架下侧的本地文件浏览窗口
1. 实现方式:SlidingDrawer(滑动抽屉)
public class SlidingDrawerFileBrowser extends SlidingDrawer implements View.OnCreateContextMenuListener, AbsListView.OnScrollListener
2. 抽屉分为抽屉句柄和抽屉内部内容,点击句柄“本地”按钮,设置动画显示抽屉的内容,点击“返回”隐藏抽屉的内容