Android scaledrawable似乎不工作

我正在尝试Android ScaleDrawable

但它似乎并没有工作…我创build了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设置为“@ drawable / logo2”,但是徽标没有出现…我在这里做错了什么? 你怎么实际使用比例元素?

Solutions Collecting From Web of "Android scaledrawable似乎不工作"

就在今天我面临同样的问题。 ScaleDrawable似乎不工作。 经过一番调查,我find了解决办法:

如果您查看文档,您可以find这个短语:“Drawable,根据当前级别值更改另一个Drawable的大小。 而已。

我发现onBoundsChange()函数使用奇怪的级别variables后变得清晰。

对于你的代码将是这样的:

 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()函数中的问题。 因为在初始化之后,级别variables是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); } 

使用插入drawable而不是可缩放比例

 <?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" > 

要回答最初的问题,你只需要在你的onCreate中用10 000初始化你的ScaleDrawable的Level。 您可以使用getIcon或getBackground(取决于将其设置为源还是背景)获取ImageView,ImageButton的drawable,然后调用setLevel。 对于MenuItem,代码如下所示:

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

运行改变drawable大小的animation时,我使用ScaleDrawable。 对于你的用例,我绝对喜欢pipe理组件的大小,而不是组件显示的可绘制的。

ScaleDrawable不仅可以缩放drawable,还可以使用ScaleDrawable本身的setLevel控制缩放。 但是ScaleDrawable并没有改变可绘制的As @ m039的内在宽度和高度,ScaleDrawable源实际上做了一个奇怪的事情:当原始绘制的级别设置为0时,scaleDrawable本身不会绘制。

为了生成规模,你必须做这样的事情:

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