【问题标题】:XML drawable scale when drawing on canvas在画布上绘图时的 XML 可绘制比例
【发布时间】:2015-12-08 10:47:06
【问题描述】:

我正在尝试制作一个看起来像带阴影的圆圈的可绘制对象。它需要缩放到不同的大小,并且需要在画布上绘制。我使用 setBounds 来设置坐标和比例。

我的可绘制对象:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:bottom="0dp"
        android:left="5dp"
        android:right="5dp"
        android:top="10dp">
        <shape android:shape="oval">
            <size
                android:width="115dp"
                android:height="115dp" />
            <solid android:color="@color/level_button_dark" />
        </shape>
    </item>
    <item
        android:bottom="5dp"
        android:left="5dp"
        android:right="5dp"
        android:top="5dp">
        <shape android:shape="oval">
            <size
                android:width="115dp"
                android:height="115dp" />
            <solid android:color="@color/level_button" />
        </shape>
    </item>
</layer-list>

我的绘图代码

mButtonDrawable.setBounds(20, 20, 220, 220);
mButtonDrawable.draw(canvas);
mButtonDrawable.setBounds(270, 20, 370, 120);
mButtonDrawable.draw(canvas);
mButtonDrawable.setBounds(420, 20, 470, 70);
mButtonDrawable.draw(canvas);

结果:

我想为所有尺度实现一致的外观。 在模拟器 api 18 上测试。

【问题讨论】:

    标签: android canvas drawable android-drawable xml-drawable


    【解决方案1】:

    虽然@RexSplode 方法有效,但我找到了一种使用可绘制对象的方法。您只是不应该调用setBounds() 并使用画布进行操作。

    请参阅下面的示例。

    mButtonDrawable.setBounds(0, 0, mButtonDrawable.getIntrinsicWidth(), mButtonDrawable.getIntrinsicHeight());
    
    canvas.save();
    canvas.translate(20, 20);
    canvas.scale(1, 1);
    mButtonDrawable.draw(canvas);
    canvas.restore();
    
    canvas.save();
    canvas.translate(420, 20);
    canvas.scale(0.5f, 0.5f);
    mButtonDrawable.draw(canvas);
    canvas.restore();
    
    canvas.save();
    canvas.translate(620, 20);
    canvas.scale(0.25f, 0.25f);
    mButtonDrawable.draw(canvas);
    canvas.restore();
    

    结果:

    我从ImageView source那里得到了一个想法。

    【讨论】:

      【解决方案2】:

      问题是您的圈子绑定到相同的坐标。所以当你打电话时

      public void setBounds (int left, int top, int right, int bottom)
      

      它改变了要绘制两个圆的坐标,但是它们之间的距离也应该变小。所以我猜一个drawable不会做。每个圆圈需要两个单独的可绘制对象。并独立改变他们的界限。这样才能达到预期的效果。

      【讨论】:

      • 感谢您的回答,我刚刚找到了一个更好的解决方案。请检查我的答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-14
      • 1970-01-01
      • 2013-03-25
      • 2020-06-24
      相关资源
      最近更新 更多