android 开源书架代码分析(一)

源码下载自  http://www.bangchui.org/read.php?tid=52
调试,运行,一个长了蜘蛛网的红木书架就出来了。
我是小白,对书架源码一窍不通,开始到处逛逛。
一如既往,Android Manifest.xml开始查看,里面使用了一个主题样式,Let's see see.
 
   

android:theme="@style/Theme.Shelves"

F3跟踪打开Theme.Shelves

windowNoTitle可以调用context.requestWindowFeature(Window.FEATURE_NO_TITLE);实现,之前看到的哈:)
backgroud_shelf没办法F3了,打开项目结构,进入res/drawable,看到backgroud_shelf.xml,打开看到
 
   

xmlns:android="http://schemas.android.com/apk/res/android" android:src="@drawable/shelf_panel" android:tileMode="repeat" />

shelf_panel是一个 只能放一本书的红木架子的图片,整个效果是重复这个红木布满全局。Amazing!
小提示:源码里面经常会有一些英文单词看不懂意思,安装一个有道词典吧,把取词设成双击ctrl,每次碰到陌生单词时双击吧~~
回到AndroidManifest.xml查看主Activity,不要说不懂哪个是主Activity哦,鉴于这是我刚刚开始写笔记,做此说明,今后不再赘述。
 
   

android:name="android.intent.action.MAIN" /> android:name="android.intent.category.LAUNCHER" />

上面这段代码是filter是过滤器,MAIN主函数,不由自主让人想到main()函数,对的,一个意思;LAUNCHER,登录,好吧,不多说。
F3 .activity.ShelvesActivity
 
   

android:name=".activity.ShelvesActivity"

好啦,Eclipse自动帮我们进入ShelvesActivity了,ctrl-j oncreate,定位到onCreate()函数(主函数)看看主体代码。
先来看看内容视图contentView
 
   

setContentView(R.layout.screen_shelves);

先来做如下猜测:
书架应该是继承自GridView
用sqlite数据库保存数据
提供方法扫描本地图书
...
神奇的发现:
神1:在通常显示LinearLayout或RelativeLayout位置显示的是merge,中文意思是合并,google出来的结果中merge和Include一起都被称为layout标签,查看 http://developer.android.com/resources/articles/layout-tricks-merge.html
小提示:在开发者社区搜索源码中任何函数、标签、变量名经常会有所搜获,不要怕单词问题,咱有有道呢,双击ctrl就知道了,也很快。
merge的效果是让层级关系跟简单,我自己以前写的布局中经常有linearlayout中又加了好多子linearlayout,而Merge的作用是用自己替代父linearlayout,而省略子linearlayout。
神2:ViewStub,好吧,又是一个陌生的视图~~姑且叫存根吧,查看 http://www.cnblogs.com/xirihanlin/archive/2010/04/28/1723291.html认识到针对很少用到的视图填充,比如这里可能的用途就是书籍下载时的下载进度条等,这个视图的好处是使用的资源很少,而且本身也很少用到,至少一本书下载好之后这个进度条就永远不会再次使用,当然删除掉这本书重新下是例外。
查看screen_shelvs中的自定义View
 
   

org.curiouscreature.android.shelves.view.ShelvesView

.....省略对书架view的介绍N行


到这里对整个我们能看到的介绍完毕(MVC中的V),后面如果是用户就是导入图书、阅览图书了(MVC中的C)。
而作为程序员我们去分析这些内容的时候就要考虑是如何从数据库获取数据的,对应的adapter是什么(MVC中的M)。
这里扯几句MVC是因为这是整个程序设计的思想,尤其是好的android程序,它或多或少都会遵从MVC,也便于我们去理解,另一个角度是从源码框架中去理解,当然框架本身就是MVC最好的案例。


看到shelvesActivity中的onCreate()第五句是
 
   

setupViews();

可想而知 ,数据的读取在这个函数中进行,仔细查看。
setupViews()函数第一句就是
 
   

final BooksAdapter adapter = new BooksAdapter(this);

F3 BooksAdapter(this) 该类继承自CursorAdapter
 
   

super(activity, activity.managedQuery(BooksStore.Book.CONTENT_URI, PROJECTION_IDS_AND_TITLE, null, null, BooksStore.Book.DEFAULT_SORT_ORDER), true);

追踪CursorAdapter查看对数据的处理
主要是数据的初始化
 
   

Uri.parse("content://shelves/books");

....adapter读取完毕;
查看set(adapter),猜想此处是将提取出的数据赋值给视图,用于显示。
而具体每个网格显示的效果应该是事先定义好的。
本案例中具体设置视图效果的代码为setAdapter(adapter)
 
   

requestLayout();

该段代码在开发者社区中的解释是
 
   

To intiate a layout, call requestLayout(). This method is typically called by a view on itself whenit believes that is can no longer fit within its current bounds.

判断每个网格的效果是事先定义好的
查看如何导入图书,导入是在OptionMenu中的settings,在onItemClickListener()中跟踪打开的是SettingActivity。
这是一个读取sharedPreference文件的一个PreferenceActivity,惊讶的是里面没有显式调用setContentView(),既是隐式调用了,跟踪进super()看到
 
   

setContentView(com.android.internal.R.layout.preference_list_content)

....
 
   

a.getResourceId(R.styleable.ShelvesView_shelfBackground, 0);

查看ShelvesView_shelfBackgroud,打开res/values/attrs.xml
 
   

name="ShelvesView"> name="shelfBackground" format="reference" />

实际获取背景图的方法是shelvesView类中的load()这里载入了视图的背景。

而实际的顺序是activity开始->shelvesView.init()->activity完毕->shelvesView.load()->shelvesView.dispatchDraw()


而视图的文字,即书名在何处加载,判断是跟此处的布局有关,尝试从xml布局文件出发,找到所需的文字。
找到shelf_book.xml
 
    

org.curiouscreature.android.shelves.view.BubbleTextView

使用的自定义视图BubbleTextView
每个函数中添加断点,F11调试,activity执行完毕后调用setCompoundDrawablesWithIntrinsicBounds()

如需自定义书本的View应添加如shelvesView.load()中

从上可知,谨记MVC的基本道理能够帮我更加容易的来读懂代码。

时间原因,有些需要查考的地方先记下来,以后再查
备查1:这个之前看书的时候看到过,但没记住什么意思... android:launchMode="singleTask"

你可能感兴趣的:(开源书架)