正在做一只图片相关的产品。
关于UI
1. 问题:自己写测量view大小的时候,返回的结果总是错的。
原因:在layout_height中使用wrap_content,这样就需要多次测量。一次测量的结果就是错的。
解决方法:在设置大小的时候尽量使用常量
遗留问题:view在测量控件大小的时候的算法是什么?需要看源代码查找吗?
评论:android中的layout_width和layout_height最好能够赋值常量。对于铺满全屏的控件设置成fill_parent没啥。对于内容大小有变的设置成wrap_content。但是最好少用wrap_content这个选项。因为在控件调用measure时会多次测量。这样一方面浪费资源;另一方面,如果自己要对控件进行测量的话,也会带来多次测量的麻烦。还有一个比较关键的地方就是在listiew一样的AdapterView中,每次加载新的条目时都要测量大小。如果不是固定大小,得测多少次呀。在滑动时也会卡的。所以在写的时候,尽量不要使用wrap_content。根据设计搞自己算出大小然后添在layout参数中。
[2012-07-26]
2. 这个是经验吧,关于用inner drawable替代layout拼凑的方式。
刚开始做的时候,遇到文字前后左右有图片的时候,会习惯用LinearLayout套图片和文字。这么做的好处是可以随便调整大小。坏处是结构比较复杂。替代方案是,设置Textiew的drawableLeft/Right/Top/Down来添加图片。
原因:view的源代码有9102行,ViewGroup有3202行。所以用LinearLayout,就要至少9102*3+3202行代码对象的创建。同时还包括GroupView中onMeasure,onLayout等等的开销。资源消耗是几倍的TextView吧。TextView中drawable无法设置大小的确是个问题。在代码中设置drawable的大小,然后传给TextView是一个解决方法。
评论:能尽量少用layout就尽量少用。多了解widget的用法,减少创建view的消耗。在刚开始学一个东西的时候,总是在找万能工具,比如用layout构建所有的布局。深入之后,会发现专用工具更好用。这个过程总是从完成功能向着优化方向发展,不过自己得去寻找去思考。
[2012-07-26]
3. style的使用。
这个项目之前不会用style,也不知到那是什么。style是android中用于统一配置xml参数的工具。想吧,你有3个工具栏,拥有相同的确认按钮和取消按钮,以及背景图片和padding等。只是内部布局不太一样。相同的参数是不是要在各个控件中都写一边?用style就可以解决这个问题
下面是一个ImageButton的style,写在res/values/styles.xml中
<?xml version="1.0" encoding="utf-8"?> <resources> <style name="topbar_btn" parent="@android:style/Widget.ImageButton"> <item name="android:layout_width">48dp</item> <item name="android:layout_height">31dp</item> <item name="android:background">@drawable/bg_btn_title</item> <item name="android:paddingBottom">8dp</item> <item name="android:paddingTop">8dp</item> <item name="android:scaleType">centerInside</item> </style> </resources>
然后配置按钮:
<ImageButton android:id="@+id/btnRight" style="@style/topbar_btn" android:layout_alignParentRight="true" android:src="@drawable/ico_refresh" />在按钮中添加一个style="@style/topbar_btn"就可以将上面设置的参数放到按钮中了。在修改的时候也不用一个一个xml找了。
[2012-07-26]
关于算法:
1. list中的删除操作
过程是这样的:通过index从list中取出一条数据,访问网络先删除网络数据,删除成功之后再删除本地数据。问题是,这个操作是否支持并发?如果支持并发的话,index取出的数据在去删除的时候,如果别的数据在这条数据删除之前被删除,这个index可能就改变了,会删除错误的数据。所以,需要用取出的数据回list中重新定位,然后删除,便可支持并发。
Object o2Del = list.get(index); networkDelete(o2Del); int pos = list.indexOf(o2Del); if(pos != -1){ list.remove(pos); }[2012-08-02]