你們都知道Android項目中的res目錄中的資源,eclipse插件會在gen中自動生成相應的id應用,這樣就統一了資源管理。那麼這種自動生成的id就是寫死的東西了,這就致使了不容易作修改。項目中須要將現有的組件打成jar包,這樣打包後類文件固然是確定沒問題,可是資源文件就不行了。這個地方的id不能在新建的項目中被應用了,因此資源文件不能被打到res目錄中,這種狀況下就必需要打到assets目錄中,這樣就會出現問題了,通常狀況下咱們應用資源文件是經過int型的id來引用的,這裏就不能直接應用了,咱們須要手動讀取Assert目錄下的資源。
java
Android提供了AssetManager來管理資源,讀取就很簡單了。只須要在Acitivity中Context.getAssets().open(「sample.png」) 能夠直接獲取相應的Inpustream 根據須要能夠經過包裝來得到須要的流來解析一些XML TXT等文件。
得到Bitmap : BitmapFactory.decodeStream(mapActivity.getAssets().open("btn_zoomout.png"))
得到Drawable:new BitmapDrawable(BitmapFactory.decodeStream(mapActivity.getAssets().open("btn_zoomout.png")))
通常咱們用到Button的時候會使用selector來獲得一些點擊(pressed)、焦點(focused)的一些效果,但當把selector的XML文件放到Assert文件中後 我試了N種的方法包括反射都用上了。發現都是解析不了,看源碼也沒找到具體什麼緣由,始終找不到爲何。StateListDrawable 不能解析出來,實在沒辦法了.....但問題仍是得解決啊。換了個思路,既然XML類型的StateListDrawable解析不了,我能夠手動建立一個StateListDrawable對象啊,這個真是簡單啊
白白花了那麼多時間去看源碼試方法鑽牛角尖,換了個角度才豁然開朗, eclipse
normalzoomin = new BitmapDrawable(BitmapFactory.decodeStream(mapActivity.getAssets().open("btn_zoomin.png")));
selectedzoomin = new BitmapDrawable(BitmapFactory.decodeStream(mapActivity.getAssets().open("btn_zoomin1.png")));
disablezoomin = new BitmapDrawable(BitmapFactory.decodeStream(mapActivity.getAssets().open("btn_zoomin2.png")));
StateListDrawable bgzoomin = new StateListDrawable();
bgzoomin.addState(View.PRESSED_ENABLED_STATE_SET, selectedzoomin);
bgzoomin.addState(View.ENABLED_FOCUSED_STATE_SET, selectedzoomin);
bgzoomin.addState(View.ENABLED_STATE_SET, normalzoomin);
bgzoomin.addState(View.FOCUSED_STATE_SET, selectedzoomin);
bgzoomin.addState(View.EMPTY_STATE_SET, disablezoomin);
btnZoomIn.setBackgroundDrawable(bgzoomin);
btnZoomIn.setMinimumWidth(BitmapFactory.decodeStream(mapActivity.getAssets().open("btn_zoomin.png")).getWidth());
btnZoomIn.setMinimumHeight(BitmapFactory.decodeStream(mapActivity.getAssets().open("btn_zoomin.png")).getHeight());
spa
這樣就實現功能了,還有就是要注意最後要關閉流 這個最好是統一管理起來,
插件
上面是打jar包時的文件目錄 須要選擇java代碼 而後和assets目錄 像gen和res就不要打到包裏了,固然manifest這些文件也不能打包。
code