当前位置: 编程技术>移动开发
本页文章导读:
▪QQ阅读器技术框架解析之三《代码预览跟分析》 QQ阅读器技术框架解析之三《代码预览和分析》
本文主要介绍书架的架构
BookStandActivity extends ReaderBaseActivity implements DialogInterface.OnCancelListener, View.OnCreateContextMenuListener
入口函数:onCreate1. .........
▪ 混同变化(移动,旋转,缩放)的顺序 混合变化(移动,旋转,缩放)的顺序
在opengl和android的canvas对于图形的变化都是用矩阵来操作的,如移动,旋转,缩放。对于组合变化,就是让这些多种变化的矩阵进行相乘,而矩阵的乘法.........
▪ 运用URLConection获取信息 使用URLConection获取信息
介绍完URI,在来一篇互联网方面的内容吧,后面要对c层一探究竟了,虽然还有很多东西可以学,但是,还是完成主线在回头弄清楚所有东西吧。使用Socket却是是一.........
[1]QQ阅读器技术框架解析之三《代码预览跟分析》
来源: 互联网 发布时间: 2014-02-18
QQ阅读器技术框架解析之三《代码预览和分析》
本文主要介绍书架的架构
入口函数: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的内容。
本文主要介绍书架的架构
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的内容。
[2] 混同变化(移动,旋转,缩放)的顺序
来源: 互联网 发布时间: 2014-02-18
混合变化(移动,旋转,缩放)的顺序
在opengl和android的canvas对于图形的变化都是用矩阵来操作的,如移动,旋转,缩放。对于组合变化,就是让这些多种变化的矩阵进行相乘,而矩阵的乘法不满足交换律,之这一点上,就可以看出组合变化也不满足交换律。
例如:要实现下面两张图形的变化,我们要怎样做:
首先想像一下,只有先缩放再旋转,图形才能变成上图,如果是先旋转再缩放,再就会变成下面的图形(变化会对其中的每个点进行矩阵变化):
那代码要怎样写了:
// 变化一(这个变化其实,才是我们想要的) gl.glRotatef(45, 0, 0, 1); gl.glScalef(2, 0.5f, 1); // 变化二(与我们的想要的结果相差很远) gl.glRotatef(45, 0, 0, 1); gl.glScalef(2, 0.5f, 1);
这里我们可能就会把我们弄混淆了,可事实就是要这样去写,那如何才能让我们不会被弄混淆了,记住一点:last specified, first applied(后指定的变化,先被执行变化),
[3] 运用URLConection获取信息
来源: 互联网 发布时间: 2014-02-18
使用URLConection获取信息
介绍完URI,在来一篇互联网方面的内容吧,后面要对c层一探究竟了,虽然还有很多东西可以学,但是,还是完成主线在回头弄清楚所有东西吧。使用Socket却是是一个很底层的方法,用起来灵活性会比较大,但是不方便。日常使用,书中推荐封装好的URLConnection代替繁琐的各种过程。
在工作中,还是使用原始的http post之类的apache包可能会更有自由些。不过,使用connection也肯定是完全没问题的。
我理解的是,URLConnection比Socket是再更高一级的抽象,所以,你可以使用一些封装好的接口,而无需重新创造轮子。啰嗦了这么多,看段代码,所有情况就一目了然了。
首先是得到URL
然后得到URLConnection
如果你想访问一个有口令保护的Web服务,则可使用下面的用法
然后我们可以连接了,默认是输入流,所以不用使用setDoInput(true);
最后,我们来看看connection能给我们带来什么
首先可以得到响应头字段
java提供了6种常见的响应头字段获取方法
最后,获得数据流
由于setRequestProperty()是一个可以赋值所有name/value的请求头函数,其实也存在一些set方法可以简单的赋值请求头,如setIfModifiedSince(),setUseCaches()(只对applet有用)。
输出流使用
使用方法和Socket差不多。看,就是多了很多方便的方法而已。
介绍完URI,在来一篇互联网方面的内容吧,后面要对c层一探究竟了,虽然还有很多东西可以学,但是,还是完成主线在回头弄清楚所有东西吧。使用Socket却是是一个很底层的方法,用起来灵活性会比较大,但是不方便。日常使用,书中推荐封装好的URLConnection代替繁琐的各种过程。
在工作中,还是使用原始的http post之类的apache包可能会更有自由些。不过,使用connection也肯定是完全没问题的。
我理解的是,URLConnection比Socket是再更高一级的抽象,所以,你可以使用一些封装好的接口,而无需重新创造轮子。啰嗦了这么多,看段代码,所有情况就一目了然了。
首先是得到URL
URL url = new URL("http://java.sun.com");
然后得到URLConnection
URLConnection connection = url.openConnection();
如果你想访问一个有口令保护的Web服务,则可使用下面的用法
String username = ""; String password = ""; String input = username + ":" + password; String encoding = base64Encode(input); connection.setRequestProperty("Authorization", "Basic" + encoding);
然后我们可以连接了,默认是输入流,所以不用使用setDoInput(true);
connection.connect();
最后,我们来看看connection能给我们带来什么
首先可以得到响应头字段
Map<String, List<String>> headers = connection.getHeaderFields(); for(Map.Entry<String, List<String>> entry : headers.entrySet()){ String key = entry.getKey(); for(String value : entry.getValue()) { System.out.print(key + ":" + value); } }
java提供了6种常见的响应头字段获取方法
System.out.print("" + connection.getContentType()); System.out.print("" + connection.getContentLength()); System.out.print("" + connection.getContentEncoding()); System.out.print("" + connection.getDate); System.out.print("" + connection.getExpirition()); System.out.print("" + connection.getLastModified());
最后,获得数据流
Scanner scanner = new Scanner(connection.getInputStream()); while(scanner.hasNextLine()){ System.out.print("" + scanner.nextLine()); }
由于setRequestProperty()是一个可以赋值所有name/value的请求头函数,其实也存在一些set方法可以简单的赋值请求头,如setIfModifiedSince(),setUseCaches()(只对applet有用)。
输出流使用
connection.getOutputStream();
使用方法和Socket差不多。看,就是多了很多方便的方法而已。
最新技术文章: