【问题标题】:Android scaledrawable doesn't seems to workAndroid scaledrawable 似乎不起作用
【发布时间】:2011-07-27 07:47:37
【问题描述】:

我正在试用安卓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 设置为“@drawable/logo2”,但徽标没有出现......我在做什么这里错了吗?你是如何实际使用比例元素的?

【问题讨论】:

    标签: android


    【解决方案1】:

    使用 inset drawable 而不是 scale 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"
        >
    

    【讨论】:

    • 是的,这实际上对我有用,至少在一些初步测试中是这样。
    • insertinset?
    【解决方案2】:

    您需要在 xml 中添加级别。

    android:level="1"
    

    【讨论】:

    • 请注意这在 API >=24 上可用
    【解决方案3】:

    ScaleDrawable 不仅允许您缩放drawable,还允许您使用ScaleDrawable 本身的setLevel 来控制缩放。 但是 ScaleDrawable 不会改变可绘制对象的固有宽度和高度 正如@m039 指出的,ScaleDrawable 源实际上做了一件奇怪的事情:当原始drawable 的级别设置为0 时,scaleDrawable 本身不会绘制。

    要使比例生效,您必须执行以下操作:

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

    【讨论】:

      【解决方案4】:

      要回答最初的问题,您只需在 onCreate 中将 ScaleDrawable 的关卡初始化为 10 000。 您使用 getIcon 或 getBackground 获得 ImageView、ImageButton 的可绘制对象(取决于您将其设置为源还是背景),然后在其上调用 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);
      

      我在运行改变可绘制对象大小的动画时使用 ScaleDrawable。对于您的用例,我绝对更喜欢管理组件的大小而不是组件显示的可绘制对象。

      【讨论】:

        【解决方案5】:

        就在今天,我遇到了同样的问题。 ScaleDrawable 似乎不起作用。经过一番调查,我找到了解决方案:

        如果您查看documentation,您会发现这句话:“一个可根据当前级别值更改另一个可绘制对象大小的可绘制对象。”就是这样。

        我发现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()函数的问题。因为在初始化之后 level 变量为 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);
        }
        

        【讨论】:

        • 感谢您的回复,看来这不是我对 ScaleDrawable 的期望。我想有一个位图(png/jpg/...),然后我可以在 xml 中向上/向下缩放这个位图,然后在不同的布局中使用它,而不是拥有多个不同大小的位图。有什么建议可以在 android 中做到这一点?
        • @stephenteh 至于我,我想要 ScaleDrawable 中的缩略图。我为您找到了一个有趣的解决方案。只是从源代码中使用 createScaledBitmap (我在整个答案中添加了示例代码。这里不适合。)。您可以将 0.7 值更改为整数资源中的一个(例如 R.integer.myvalue)。而且我发现了两个有趣的函数:来自 View 类的 setScaleX(..) 和 setScaleY(..)。但它们来自 11 API。
        • 谢谢您,您是一位绅士和一位学者。我们应该将此报告为错误吗?默认情况下使 Drawable invisible 似乎不直观。
        • @phreakhead 谢谢,也许最好的解决方案是在文档中添加注释。我认为写这段代码的人有他自己的意图,但最好把它正确地记录下来,因为很多人发现它并不明显。
        • 是否有任何仅限 xml 的解决方法?我正在使用的库提供了一个将可绘制对象作为属性的视图,并且不提供对代码中可绘制对象的访问。无论如何感谢您的回答。
        猜你喜欢
        • 1970-01-01
        • 2012-08-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-12
        • 1970-01-01
        • 1970-01-01
        • 2016-11-29
        相关资源
        最近更新 更多