2010-06-16 31 views
2

有沒有人知道如何從資源中請求一個特定的可繪製對象(例如,drawable-longdrawable-notlong)來確定Android系統將解析哪個文件夾?我想確保它正在按照我期望的方式加載資源(例如,要確保紋身真的是ldpi而不是mdpi,因爲它在邊界上是正確的)。有沒有什麼辦法可以告訴哪個文件夾可繪製資源被誇大?

我從資源中獲取繪圖後,可以隨時打印出繪圖的固有尺寸,然後檢查相應的圖片大小,但這有點痛苦。此外,我的公司允許其客戶在應用程序發佈之前對其應用程序進行皮膚處理,因此在皮膚被剝皮後,我將無法依賴該方法。

我試過使用Resources.getName(resId),但沒有給出文件夾名稱,據我所知你可以得到一個AssetFileDescriptor資源,但你不能得到一個實際的文件名。

UPDATE: 既然問這個問題,我發現,您可以通過ConfigurationDisplayMetrics類(都是通過getResources()訪問)訪問許多resource qualifier names的。 DisplayMetrics可以給你ldpi/mdpi/hdpi指定,並Configuration可以給你small/normal/large屏幕尺寸,long/notlong寬高比,語言環境,移動網絡代碼和其它硬件的信息。但是,如果您擁有複雜的資源集合,這仍不能確定您獲得了您期望的資源。它也不能保護你免受報告不正確值的錯誤的影響,例如DisplayMetrics報告錯誤的xdpiydpi(它報告96dpi,其中實際值更像是265dpi!可怕的錯誤)的摩托羅拉Droid錯誤。

+0

嗨,你有沒有找到正確的方法知道,哪個文件夾已被用於資源?或者你如何知道文件夾?我有同樣的問題。 – branoholy 2011-06-08 18:35:40

+0

不,根據我所知,沒有辦法知道。 – 2011-06-09 12:03:24

+0

@Iceman看到我的答案是一種獨立於大小的方式,只需要你有一組參考圖像(可以在不同的項目中重複使用)。 – ataulm 2012-12-06 12:44:08

回答

0

我知道,你寫道,你可以瀏覽所有的資源,並與位圖大小比較大小。但我不知道,如果你認爲它和我一樣,那麼這可能會幫助你或其他人。

所以這是我做到的。首先,我爲所有可繪製圖像加載大小(以字節爲單位)。

String defType = "drawable"; 
String drawableDirPrefix = "res/drawable"; 
SparseArray<SparseArray<String>> resourceDirs = new SparseArray<SparseArray<String>>(); 

ZipInputStream apk = null; 
try { 
    apk = new ZipInputStream(new FileInputStream(getPackageResourcePath())); 

    ZipEntry entry = null; 
    while ((entry = apk.getNextEntry()) != null) { 
     String resourcePath = entry.getName(); 
     if (resourcePath.startsWith(drawableDirPrefix)) { 
      int firstSlashPos = resourcePath.indexOf('/'); 
      int lastSlashPos = resourcePath.lastIndexOf('/'); 
      int dotPos = resourcePath.lastIndexOf('.'); 

      String resourceDir = resourcePath.substring(firstSlashPos + 1, lastSlashPos); 
      String resourceName = resourcePath.substring(lastSlashPos + 1, dotPos); 
      int resourceId = getResources().getIdentifier(resourceName, defType, getPackageName()); 
      int resourceSize = (int) entry.getSize(); 

      SparseArray<String> resourceInfo = resourceDirs.get(resourceId); 
      if (resourceInfo == null) { 
       resourceInfo = new SparseArray<String>(); 
       resourceInfo.append(resourceSize, resourceDir); 
       resourceDirs.append(resourceId, resourceInfo); 
      } else { 
       resourceInfo.append(resourceSize, resourceDir); 
      } 
     } 
    } 
} catch (IOException e) { 
    Log.e("tag", "Error", e); 
} finally { 
    if (apk != null) { 
     try { 
      apk.close(); 
     } catch (IOException e) { 
      Log.e("tag", "Error", e); 
     } 
    } 
} 

然後,當我想知道該文件夾時,我可以將位圖大小與加載的大小進行比較。

InputStream bitmapStream = null; 
try { 
    int bitmapId = R.drawable.icon; 
    bitmapStream = getResources().openRawResource(bitmapId); 
    int bitmapSize = bitmapStream.available(); 

    String bitmapDir = resourceDirs.get(bitmapId).get(bitmapSize); 
    Log.i("tag", bitmapDir); 
} catch (Exception e) { 
    Log.e("tag", "Error", e); 
} finally { 
    if (bitmapStream != null) { 
     try { 
      bitmapStream.close(); 
     } catch (IOException e) { 
      Log.e("tag", "Error", e); 
     } 
    } 
} 

嗯,這隻適用於圖像大小不同的情況。或者你可以比較其他東西,如寬度,高度等。

可能不是,你在找什麼,但至少它滿足了我的需求。

4

一種不同的方法是使用兩個不同的圖像,同名,一個資源文件夾中的紅色在另一個資源文件夾中爲藍色。當它膨脹時,你將能夠看到它來自哪一個。

如果你真的想瘋了,爲每個文件夾製作一個圖像,說「ldpi」或「xhdpi」等等,當你開始你的項目時,你可以注意到哪些設備想要顯式測試。


Mark Allison,同樣的想法,但對字符串包含它在桶的名稱值目錄 - 它比創建圖像更省力!

相關問題