2011-03-31 84 views
25

我嘗試了Android ScaleDrawable的Android scaledrawable似乎並不工作

但它似乎沒有工作...我創建的XML作爲文檔例子,我有一個logo.png在繪製文件夾

<?xml version="1.0" encoding="utf-8"?> 
<scale xmlns:android="http://schemas.android.com/apk/res/android" 
    android:drawable="@drawable/logo" 
    android:scaleGravity="center_vertical|center_horizontal" 
    android:scaleHeight="80%" 
    android:scaleWidth="80%" /> 

我救了本作中繪製文件夾logo2.xml然後我有一個ImageView的一個的LinearLayout和設置的ImageView的src爲「@繪製/ LOGO2」,但標誌不出現...我在這裏做錯了什麼?你怎麼實際使用scale元素?

回答

26

就在今天我面臨同樣的問題。 ScaleDrawable似乎不起作用。經過一番調查,我找到了解決辦法:

如果你看看documentation,你可以找到這樣一句話:「一個Drawable,根據它的當前級別值改變另一個Drawable的大小。」而已。

我發現onBoundsChange()函數使用奇怪的級別變量後變得很清楚。

爲你的代碼將是這樣的:

Resources res = getResources(); 
ScaleDrawable sd = (ScaleDrawable) res.getDrawable(R.drawable.logo2); 
Drawable d = sd.getDrawable(); 

d.setLevel(1); 

ImageView iv = new ImageView(this); 
iv.setImageDrawable(sd); 
iv.setAdjustViewBounds(true); 
iv.setLayoutParams(new Gallery.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 

setContentView(iv); 

更新:我覺得這個問題在draw()函數。因爲初始化後級變量0:

public void draw(Canvas canvas) { 
    if (mScaleState.mDrawable.getLevel() != 0) 
     mScaleState.mDrawable.draw(canvas); 
} 

更新:也許那麼這段代碼可以幫助你:

private void useScaledImage() { 
    Resources res = getResources(); 
    BitmapDrawable bd = (BitmapDrawable)res.getDrawable(R.drawable.sun); 
    Bitmap b = Bitmap.createScaledBitmap(bd.getBitmap(), 
         (int) (bd.getIntrinsicHeight() * 0.7), 
         (int) (bd.getIntrinsicWidth() * 0.7), 
         false); 

    LinearLayout l = new LinearLayout(this); 
    ImageView iv = new ImageView(this); 

    iv.setImageDrawable(new BitmapDrawable(b)); 
    iv.setLayoutParams(new Gallery.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 

    l.addView(iv); 

    setContentView(l); 
} 
+1

感謝您的回覆,好像那不是我從ScaleDrawable期待。我認爲有一個位圖(PNG/JPG/...),然後我可以在xml中向上/向下縮放此位圖,然後在差異佈局中使用它,而不是使用具有不同大小的多個位圖。任何建議,你可以在android中做到這一點? – stephenteh 2011-04-04 09:12:59

+0

@stephenteh至於我,我想從ScaleDrawable的縮略圖圖像。我爲你找到了一個有趣的解決方案。只是從源代碼中使用createScaledBitmap(我在整個答案中添加了示例代碼,這裏不適合)。您可以將0.7值更改爲整數資源(例如R.integer.myvalue)。 而且我發現了兩個有趣的功能:View類中的setScaleX(..)和setScaleY(..)。但他們來自11 API。 – m039 2011-04-04 19:20:59

+0

謝謝你,你是個紳士和學者。我們是否應該將此報告爲一個錯誤?看起來很不直觀,默認情況下會使Drawable *不可見*。 – phreakhead 2013-02-14 22:45:46

5

使用INSERT繪製的,而不是規模繪製

<?xml version="1.0" encoding="utf-8"?> 
<inset xmlns:android="http://schemas.android.com/apk/res/android" 
    android:drawable="@drawable/logo" 
    android:insetTop="2dp" 
    android:insetLeft="2dp" 
    android:insetRight="2dp" 
    android:insetBottom="2dp" 
    > 
+0

是的,這實際上適用於我,至少在一些初步測試中。 – 2015-03-11 00:34:16

0

爲了回答最初的問題,您只需在onCreate中用10 000初始化ScaleDrawable的Level。 您可以使用getIcon或getBackground(取決於將它設置爲源還是背景),然後調用setLevel來獲取ImageView,ImageButton的drawable。 對於菜單項,代碼如下:

editMenuItem = menu.findItem(R.id.action_edit); 
    menuItemEdit_ScaleDrawable = (ScaleDrawable) editMenuItem.getIcon(); 
    //when playing with scaleDrawable always initialize the level 
    menuItemEdit_ScaleDrawable.setLevel(10000); 

我正在運行的動畫,改變提拉的大小時使用ScaleDrawable。對於你的用例,我絕對喜歡管理組件的大小,而不是組件顯示的可繪製的。

0

ScaleDrawable不僅可以縮放drawable,還可以使用ScaleDrawable本身的setLevel控制縮放。 但是ScaleDrawable不會改變可繪製的內部寬度和高度正如@ m039指出的那樣,ScaleDrawable源實際上做了一件奇怪的事情:當原始drawable的level設置爲0時,scaleDrawable本身不會繪製。

要利用規模效應,你必須做這樣的事情:

ScaleDrawable scaleDrawable = (ScaleDrawable) imageView.getDrawable(); 
scaleDrawable.setLevel(10000); 
or 
scaleDrawable.setLevel(5000);