編輯:關於Android編程
Android資源文件大致可以分為兩種:
第一種是res目錄下存放的可編譯的資源文件:
這種資源文件系統會在R.java裡面自動生成該資源文件的ID,所以訪問這種資源文件比較簡單,通過R.XXX.ID即可;
第二種是assets目錄下存放的原生資源文件:
因為系統在編譯的時候不會編譯assets下的資源文件,所以我們不能通過R.XXX.ID的方式訪問它們。那我麼能不能通過該資源的絕對路徑去訪問它們呢?因為apk安裝之後會放在/data/app/**.apk目錄下,以apk形式存在,asset/res和被綁定在apk裡,並不會解壓到/data/data/YourApp目錄下去,所以我們無法直接獲取到assets的絕對路徑,因為它們根本就沒有。
還好Android系統為我們提供了一個AssetManager工具類。
查看官方API可知,AssetManager提供對應用程序的原始資源文件進行訪問;這個類提供了一個低級別的API,它允許你以簡單的字節流的形式打開和讀取和應用程序綁定在一起的原始資源文件。提供對應用程序的原始資源文件進行訪問;這個類提供了一個低級別的API,它允許你以簡單的字節流的形式打開和讀取和應用程序綁定在一起的原始資源文件。通過getAssets()方法獲取AssetManager對象。
AssetManager類常用方法:Public Methods
finalString[]list(Stringpath)
返回指定路徑下的所有文件及目錄名。
finalInputStreamopen(StringfileName)
使用ACCESS_STREAMING模式打開assets下的指定文件。.
finalInputStreamopen(StringfileName, int accessMode)
使用顯示的訪問模式打開assets下的指定文件.
1.加載assets目錄下的網頁://加載assets/win8_Demo/目錄下的index.html網頁
webView.loadUrl("file:///android_asset/win8_Demo/index.html");
說明:這種方式可以加載assets目錄下的網頁,並且與網頁有關的css,js,圖片等文件也會的加載。
AssetManager.open(String filename),返回的是一個InputSteam類型的字節流,這裡的filename必須是文件比如
(aa.txt;img/semll.jpg),而不能是文件夾。
//獲取assets目錄下的所有文件及目錄名,content(當前的上下文如Activity,Service等ContextWrapper的子類的
都可以)
String fileNames[] =context.getAssets().list(path);
/**
*從assets目錄中復制整個文件夾內容
*@paramcontextContext使用CopyFiles類的Activity
*@paramoldPathString原文件路徑如:/aa
*@paramnewPathString復制後路徑如:xx:/bb/cc
*/
publicvoidcopyFilesFassets(Contextcontext,StringoldPath,StringnewPath){
try{
StringfileNames[]=context.getAssets().list(oldPath);//獲取assets目錄下的所有文件及目錄名
if(fileNames.length>0){//如果是目錄
Filefile=newFile(newPath);
file.mkdirs();//如果文件夾不存在,則遞歸
for(StringfileName:fileNames){
copyFilesFassets(context,oldPath+"/"+fileName,newPath+"/"+fileName);
}
}else{//如果是文件
InputStreamis=context.getAssets().open(oldPath);
FileOutputStreamfos=newFileOutputStream(newFile(newPath));
byte[]buffer=newbyte[1024];
intbyteCount=0;
while((byteCount=is.read(buffer))!=-1){//循環從輸入流讀取buffer字節
fos.write(buffer,0,byteCount);//將讀取的輸入流寫入到輸出流
}
fos.flush();//刷新緩沖區
is.close();
fos.close();
}
}catch(Exceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
//如果捕捉到錯誤則通知UI線程
MainActivity.handler.sendEmptyMessage(COPY_FALSE);
}
}
InputStreamis=getAssets().open("wpics/0ZR424L-0.jpg");
Bitmapbitmap=BitmapFactory.decodeStream(is);
imgShow.setImageBitmap(bitmap);
首先,獲取通過openFd()的方法獲取asset目錄下指定文件的AssetFileDescriptor對象。
其次,通過MediaPlayer對象的setDataSource(FileDescriptorfd,longoffset,longlength)方法加載音樂文件。
最後,調用prepare方法准備音樂,start方法開始播放音樂。
預備知識:
AssetFileDescriptor簡介:
在AssetManager中一項的文件描述符。這提供你自己打開的FileDescriptor可用於讀取的數據,以及在文件中的
偏移量和長度的該項的數據。
可以通過AssetManager的openFd()的方法獲取asset目錄下指定文件的AssetFileDescriptor對象。
常用方法:
Public Methods
FileInputStreamcreateInputStream()
為asset創建並返回一個自動關閉的輸入流。
FileOutputStreamcreateOutputStream()
為asset創建並返回一個自動關閉的輸出流。
FileDescriptorgetFileDescriptor()
返回可用於讀取文件中的數據的FileDescriptor對象。
longgetLength()
返回該asset中項的數據的總字節數。
longgetStartOffset()
返回asset中項的數據字節開始偏移。
具體代碼:
//打開指定音樂文件,獲取assets目錄下指定文件的AssetFileDescriptor對象
AssetFileDescriptorafd=am.openFd(music);
mPlayer.reset();
//使用MediaPlayer加載指定的聲音文件。
mPlayer.setDataSource(afd.getFileDescriptor(),
afd.getStartOffset(),afd.getLength());
//准備聲音
mPlayer.prepare();
//播放
mPlayer.start();
緒論最近項目裡面用到了下拉刷新和左滑刪除,網上找了找並沒有可以用的,有比較好的左滑刪除,但是並沒有和下拉刷新上拉加載結合到一起,要不就是一些比較水的結合,並不能在項目裡面
在新建一個Android項目時,在res目錄下會自動生成幾個drawable文件夾,drawable-ldpi,drawable-mdpi,drawable-hdpi,一
最近項目裡把圖片加載框架從xUtils換到了Picasso,一些下載和緩存的策略也因此發生變化,Picasso的緩存沒有xUtils自動化那麼高,使用起來遇到了一些困難,
之前的一遍學習筆記主要就Android滑動沖突中,在不同方向的滑動所造成沖突進行了了解,這種沖突很容易理解,當然也很容易解決。今天,就同方向的滑動所造成的沖突進行一下了解