制作电子书遇到的知识点整理

来源:互联网 发布:g71车内孔编程实例 编辑:程序博客网 时间:2024/06/05 15:48

1. byte打印

Integer.toHexString(b & 0xff)

因为byte的取值是0000 0000 ~ 1111 1111

打印的时候会扩展成int,如果byte的高位为1,扩展高位的三字节全为 ff ,即 ff ff ff byte
如果byte的高位为0,扩展高位的三字节全为 00 ,即 00 00 00 byte

而 byte  & 0xff 等同于
byte  & 0x000000ff 

所以需要跟0xff与,去掉高位的1


2. 进度跳转

目前是按照byte为单位来跳转的,会出现乱码的情况。

目测原因:

若字符编码参数使用”GBK“
则遇字母占一个字节,遇中文占两个字节
若字符编码参数使用”UTF-8“
则遇字母占一个字节,遇中文占三个字节
若字符编码参数使用”UTF-16LE“
则无论字母或中文均占两个字节




3. 不知道为什么canvas上面draw出来的字体大小跟radiobutton上面的字体大小不一样



4. 自定义样式

之前默认的效果是没有全屏的,所以dialogfragment上面的字体背景颜色seekbar的效果还比较满意,

可是当我把样式换成全屏之后,默认的样式就变了,不好看了,所以想用自定义样式来控制字体大小颜色背景颜色什么的。

在value下面新建一个xml value文件,取一个名字,如style(文件名无所谓,系统会自动去识别文件里面resource标签里面的样式)

<?xml version="1.0" encoding="utf-8"?><resources>    <!-- dialog按钮的样式 -->    <style name="DialogButton">        <item name="android:padding">5dp</item>        <item name="android:textSize">24sp</item>        <item name="android:textColor">@color/black</item>        <item name="android:gravity">center</item>        <item name="android:background">@drawable/novel_dialog_btn_selector</item>    </style></resources>
最外层是resource,然后里面用style标签来分别包裹一个控件的样式,可参考系统自己的theme的样式。

然后往style里面来填充item就好了,就相当于layout布局文件中的每一个属性,可以先在layout里面写好,然后在搬过来就成了。

最后是在layout里面的相应控件引用一下就ok了。

style="@style/DialogButton"

这样好几种相同样式的控件就可以直接用这个style,改动的时候也可以一起改动,便于维护



5. 在activity中设置全屏

设置全屏有两种方法,一种是在manifest里面设置theme,

android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen"

但是这种方法不只是全屏,还会改变其他的style,我上面遇到的问题就是由这个引起的,所以我才会想办法去自己来定义style。

但是其实如果只是想实现全屏的话,另一种直接在activity里面设置的方法会比较好

this.requestWindowFeature(Window.FEATURE_NO_TITLE);this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);

这样不仅实现了预期的效果,还避免了其他的style被意外的改动


6. 序列化对象

想做书签功能,由于现在还不想用到sqlite数据库,只想先用sharepreference,所以就先想到了将书签的数据对象序列化之后存入sharepreference,用的时候再取出来反序列化,这是第一个想法,说不定以后用sqlite为了方便也会这样继续用,就不一条一条的往数据库存了,反正量也不大。

实现方法,给自己的数据对象类只需要继承  implements Serializable 即可。这只是给对象打了一个标记,系统会自动将其序列化


7. 泛型class<T>

由于用到了存储,其实很多存储的代码都是重复的,于是想到将他们整合一下,自然要用到泛型



8. sharepreference可以传null

editor.putString("test", null);

可以传null,返回true,源码写到传入null相当于remove



9. 如何设置dialogfragment的宽高?

遇到一个讨厌的问题,无法设置dialogfragment的宽高,

尝试的方法:

  1)在oncreateview里面getDialog().getWindow().setLayout(300,300);

  2)就没有了

难道我只能用全屏的dialogfragment了吗?


10. 多线程同步



11 canvas的drawTex

drawText(String text, float x, float y, Paint paint)
其中y表示绘图的底部,所以如果要以顶部为y的0点,在y0处画一个高位y1的图,这里的y 要取 y0 + y1


12. 做了一个翻页的控件,触摸事件总是返回false

想通过手势来判断如何翻页(上一页还是下一页),在一个activity里面写了可以,但是换到控件(framelayout)里面就不行了,奇怪。

@Overridepublic boolean onTouchEvent(MotionEvent event) {boolean result = this.detector.onTouchEvent(event);DEBUG.i("event:"+event.getAction()+"   result:"+result);return result;}@Overridepublic boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY) {return false;}

现在发现是onTouchEvent里面的result在第一次的时候返回的是true,这样就导致后面的onTouch的事件不会传到这里。

而onFling是在ACTION_UP的时候才会进来,所以对第一次ACTION_DOWN的事件是没有任何作用的,因此result第一次才会返回true。

所以,如果想让后续的onTouch事件可以传入gestureDetector,可以在第一次onTouch的时候,强制返回true,表明这个事件我消费了,接下来的move和up等事件都传过来吧。

好吧,发现第一次ACTION_DOWN的事件其实是传到了gestureListener的onDown里面,而默认是返回false的,所以我们在这里返回true就可以了,其他不变。

@Overridepublic boolean onDown(MotionEvent e) {return true;//返回true,表示消费了该touch事件}


13. DialogFragment生命周期

启动:

DialogFragment onCreateDialogDialogFragment onActivityCreatedDialogFragment onStartFragment onResume
取消:

DialogFragment onCancelDialogFragment onDismissFragment onPauseDialogFragment onStopDialogFragment onDestroyViewFragment onDestroyDialogFragment onDetach
home:

Fragment onPauseDialogFragment onSaveInstanceStateDialogFragment onStop
返回:
DialogFragment onStartFragment onResume







电子书:

目标:做一本单独的书

进度:

一、功能

1. txt文本读取 done

2. 分页 done

3. 进度记录 done

4. 进度跳转 done

5. 调整字体 done

6. 书签 done   ->时间,进度,摘要,进度的百分比字符串 done

7. 调整颜色 done

8. 切换翻页效果 done

9. 加入umeng统计

10. 上线

11. 增量更新

12. 给一个显示时间的位置,不用实时 done

13. 给一个显示电量的位置,不用实时 done

14. 给第一次加一个loading




二、UI

1. 看书页面 done

2. 进度跳转框 done

3. 书签页 done

4. 翻页效果和手势交互(可选)

5. 整体颜色调整



三、性能优化

1. pagefactory优化

优化前,模拟器上:

05-06 03:22:43.573: I/(468): onDrawCanvas deltatime:99
05-06 03:22:45.243: I/(468): onDrawCanvas deltatime:46
05-06 03:23:49.143: I/(468): nextPage deltatime:33
05-06 03:23:49.183: I/(468): onDrawCanvas deltatime:43
05-06 03:23:54.233: I/(468): nextPage deltatime:22
05-06 03:23:54.263: I/(468): onDrawCanvas deltatime:27
05-06 03:23:59.363: I/(468): nextPage deltatime:21
05-06 03:23:59.383: I/(468): onDrawCanvas deltatime:22
05-06 03:24:03.133: I/(468): nextPage deltatime:19
05-06 03:24:03.163: I/(468): onDrawCanvas deltatime:31
05-06 03:24:09.373: I/(468): prePage deltatime:28
05-06 03:24:09.383: I/(468): onDrawCanvas deltatime:4
05-06 03:24:14.433: I/(468): prePage deltatime:30
05-06 03:24:14.433: I/(468): onDrawCanvas deltatime:4
05-06 03:24:18.563: I/(468): prePage deltatime:20
05-06 03:24:18.563: I/(468): onDrawCanvas deltatime:4
05-06 03:24:21.623: I/(468): prePage deltatime:20
05-06 03:24:21.623: I/(468): onDrawCanvas deltatime:7
05-06 03:24:24.153: I/(468): prePage deltatime:25
05-06 03:24:24.184: I/(468): onDrawCanvas deltatime:28
05-06 03:24:25.923: I/(468): prePage deltatime:32
05-06 03:24:25.943: I/(468): onDrawCanvas deltatime:17
05-06 03:24:27.873: I/(468): prePage deltatime:32
05-06 03:24:27.903: I/(468): onDrawCanvas deltatime:27
05-06 03:24:29.963: I/(468): prePage deltatime:25
05-06 03:24:29.983: I/(468): onDrawCanvas deltatime:16
05-06 03:24:32.173: I/(468): prePage deltatime:31
05-06 03:24:32.193: I/(468): onDrawCanvas deltatime:19
05-06 03:24:34.393: I/(468): prePage deltatime:32
05-06 03:24:34.423: I/(468): onDrawCanvas deltatime:22
05-06 03:24:38.273: I/(468): prePage deltatime:32
05-06 03:24:38.293: I/(468): onDrawCanvas deltatime:22
05-06 03:24:55.593: I/(468): nextPage deltatime:11
05-06 03:24:55.603: I/(468): onDrawCanvas deltatime:4
05-06 03:24:56.873: I/(468): nextPage deltatime:12
05-06 03:24:56.883: I/(468): onDrawCanvas deltatime:4
05-06 03:24:58.003: I/(468): nextPage deltatime:10
05-06 03:24:58.003: I/(468): onDrawCanvas deltatime:4
05-06 03:24:58.993: I/(468): nextPage deltatime:10
05-06 03:24:58.993: I/(468): onDrawCanvas deltatime:4

小米2S:

05-06 13:01:34.962: I/zoro(15110): onDrawCanvas deltatime:43
05-06 13:02:07.047: I/zoro(15110): nextPage deltatime:18
05-06 13:02:07.077: I/zoro(15110): onDrawCanvas deltatime:29
05-06 13:02:13.303: I/zoro(15110): nextPage deltatime:20
05-06 13:02:13.323: I/zoro(15110): onDrawCanvas deltatime:18
05-06 13:02:18.329: I/zoro(15110): nextPage deltatime:16
05-06 13:02:18.349: I/zoro(15110): onDrawCanvas deltatime:21
05-06 13:02:20.441: I/zoro(15110): nextPage deltatime:12
05-06 13:02:20.461: I/zoro(15110): onDrawCanvas deltatime:24
05-06 13:02:25.787: I/zoro(15110): prePage deltatime:27
05-06 13:02:25.807: I/zoro(15110): onDrawCanvas deltatime:21
05-06 13:02:27.288: I/zoro(15110): prePage deltatime:22
05-06 13:02:27.308: I/zoro(15110): onDrawCanvas deltatime:17
05-06 13:02:28.700: I/zoro(15110): prePage deltatime:13
05-06 13:02:28.730: I/zoro(15110): onDrawCanvas deltatime:27
05-06 13:02:33.124: I/zoro(15110): prePage deltatime:24
05-06 13:02:33.145: I/zoro(15110): onDrawCanvas deltatime:11
05-06 13:02:35.647: I/zoro(15110): nextPage deltatime:3
05-06 13:02:35.667: I/zoro(15110): onDrawCanvas deltatime:12
05-06 13:02:36.378: I/zoro(15110): prePage deltatime:12
05-06 13:02:36.378: I/zoro(15110): onDrawCanvas deltatime:6
05-06 13:02:40.012: I/zoro(15110): nextPage deltatime:3
05-06 13:02:40.022: I/zoro(15110): onDrawCanvas deltatime:10
05-06 13:02:40.733: I/zoro(15110): prePage deltatime:15
05-06 13:02:40.743: I/zoro(15110): onDrawCanvas deltatime:6
05-06 13:02:41.463: I/zoro(15110): prePage deltatime:28
05-06 13:02:41.483: I/zoro(15110): onDrawCanvas deltatime:18
05-06 13:02:42.144: I/zoro(15110): nextPage deltatime:10
05-06 13:02:42.164: I/zoro(15110): onDrawCanvas deltatime:21
05-06 13:02:43.486: I/zoro(15110): prePage deltatime:17
05-06 13:02:43.506: I/zoro(15110): onDrawCanvas deltatime:22
05-06 13:02:45.888: I/zoro(15110): nextPage deltatime:6
05-06 13:02:45.898: I/zoro(15110): onDrawCanvas deltatime:6
05-06 13:02:46.859: I/zoro(15110): prePage deltatime:14
05-06 13:02:46.879: I/zoro(15110): onDrawCanvas deltatime:16
05-06 13:02:50.823: I/zoro(15110): prePage deltatime:20
05-06 13:02:50.853: I/zoro(15110): onDrawCanvas deltatime:24
05-06 13:02:53.316: I/zoro(15110): nextPage deltatime:4
05-06 13:02:53.326: I/zoro(15110): onDrawCanvas deltatime:8
05-06 13:02:55.318: I/zoro(15110): nextPage deltatime:6
05-06 13:02:55.328: I/zoro(15110): onDrawCanvas deltatime:11
05-06 13:02:57.130: I/zoro(15110): prePage deltatime:14
05-06 13:02:57.140: I/zoro(15110): onDrawCanvas deltatime:12
05-06 13:02:58.161: I/zoro(15110): prePage deltatime:11
05-06 13:02:58.181: I/zoro(15110): onDrawCanvas deltatime:17

发现上一页比下一页的计算多10ms左右,差不多1.5倍的关系,其实普通翻页影响不大

onDrawCanvas 的时候,如果前面draw过的,这里其实很快,如果上下切换,貌似之前的页面会很快再次绘制出来


2. 进度跳转优化

优化前,小米2S:

05-06 13:17:15.176: I/zoro(16306): OnProgressChanged delta time:58
05-06 13:17:15.226: I/zoro(16306): OnProgressChanged draw time:52
05-06 13:17:15.226: I/zoro(16306): OnProgressChanged delta time:57
05-06 13:17:15.266: I/zoro(16306): OnProgressChanged draw time:41
05-06 13:17:15.276: I/zoro(16306): OnProgressChanged delta time:52
05-06 13:17:15.326: I/zoro(16306): OnProgressChanged draw time:48
05-06 13:17:15.336: I/zoro(16306): OnProgressChanged delta time:58
05-06 13:17:15.386: I/zoro(16306): OnProgressChanged draw time:49
05-06 13:17:15.396: I/zoro(16306): OnProgressChanged delta time:59
05-06 13:17:15.436: I/zoro(16306): OnProgressChanged draw time:32
05-06 13:17:15.436: I/zoro(16306): OnProgressChanged delta time:42
05-06 13:17:15.476: I/zoro(16306): OnProgressChanged draw time:32
05-06 13:17:15.486: I/zoro(16306): OnProgressChanged delta time:43
05-06 13:17:15.526: I/zoro(16306): OnProgressChanged draw time:38
05-06 13:17:15.536: I/zoro(16306): OnProgressChanged delta time:50
05-06 13:17:15.596: I/zoro(16306): OnProgressChanged draw time:62
05-06 13:17:15.606: I/zoro(16306): OnProgressChanged delta time:72
05-06 13:17:15.666: I/zoro(16306): OnProgressChanged draw time:55
进度跳转时,每一页的绘制时间大概是50ms左右,每次触发绘制的时间间隔也差不多是50ms左右,因为都是在主线程里处理的,所以绘制影响了seekbar的反应时间




3. 内存优化

用MAT分析一下使用过程中内存的情况。

首先去http://www.eclipse.org/mat/downloads.php查看了一下MAT的最新版本和升级的地址 http://download.eclipse.org/mat/1.3.1/update-site/

然后,在eclipse里面install new software里面安装。隔壁小哥安装的shit一般的方正宽带还是长城宽带,网速太慢了,睡觉

在公司里测试了一下,包括上下翻页,进度跳转的频繁操作,结果如下:




主要的内存都耗在bitmap上,好吧,还可以接受,慢慢想办法优化吧




4. 存储优化

原来是只要翻页就存,存储时间在6ms~19ms,平均在10ms吧,居然可以占到绘制时间50ms的20%,时间短但是比例不小,毕竟存进度不应该花销这么大

现在改为只在onpause的时候才存。



5. 翻页优化

翻页的时候,pagefactory里面计算每页的内容分行时用的是vector,vector是带有线程安全的,因此比arraylist的开销要大,所以接下来可以看看二者的时间性能差多少,换成arraylist可能给线程带来的不安全因素



4. 结合native代码



0 0
原创粉丝点击