图片和图形之Drawables(2)

原文

Drawables

两种方法来定义和实例化:

  1. 充满保存在项目中的图像资源(位图文件)。
  2. 充满定义可绘制属性的XML资源。

    从资源图像创建绘图


支持的文件类型有PNG(首选),JPG(可接受)和GIF(不鼓励)。应用程序图标,徽标和其他图形(如游戏中使用的图形)非常适合此技术

  • 注意:
  • 在构建过程中res/drawable/,aapt工具中的图像资源 可以通过工具进行无损图像压缩来自动优化。例如,不需要超过256色的真彩色PNG可以通过调色板转换为8位PNG。这会产生相同质量的图像,但需要更少的内存。因此,放置在此目录中的图像二进制文件可能会在构建时发生更改。如果您计划将图像作为比特流进行读取以将其转换为位图,请将图像放在 res/raw/文件夹中,而不是在该aapt工具不修改它们的位置。
  • 无论您为其实例化多少个不同的对象,项目中的每个独特资源都只能维护一个状态。例如,如果您Drawable从同一图像资源实例化两个对象并更改一个对象的属性(如alpha),那么它也会影响另一个对象。在处理图像资源的多个实例时,不应直接转换Drawable对象,而应执行 补间动画。

ShapeDrawable


ShapeDrawable是的一个子类Drawable。出于这个原因,您可以使用预期的 ShapeDrawable任何地方Drawable。例如,您可以通过将ShapeDrawable对象传递给视图的setBackgroundDrawable()方法来使用对象来设置视图的背景。您还可以将自己的形状绘制为自己的自定义视图,并将其添加到应用中的布局中。

由于ShapeDrawable有自己的draw()方法,因此可以创建 在事件期间View绘制ShapeDrawable对象的子类onDraw(),如以下代码示例所示:

public class CustomDrawableView extends View {
  private ShapeDrawable mDrawable;

  public CustomDrawableView(Context context) {
    super(context);

    int x = 10;
    int y = 10;
    int width = 300;
    int height = 50;

    mDrawable = new ShapeDrawable(new OvalShape());
    // If the color isn't set, the shape uses black as the default.
    mDrawable.getPaint().setColor(0xff74AC23);
    // If the bounds aren't set, the shape can't be drawn.
    mDrawable.setBounds(x, y, x + width, y + height);
  }

  protected void onDraw(Canvas canvas) {
    mDrawable.draw(canvas);
  }
}

您可以以编程方式将其添加到应用中的活动,如以下示例所示:

CustomDrawableView mCustomDrawableView;

protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  mCustomDrawableView = new CustomDrawableView(this);

  setContentView(mCustomDrawableView);
}

如果您想要在XML布局中使用自定义视图,那么 CustomDrawableView该类必须重写View(Context, AttributeSet)构造函数,该类在从XML充气时调用。以下示例显示如何CustomDrawableView在XML布局中声明 :

<com.example.shapedrawable.CustomDrawableView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        />

在ShapeDrawable类,像许多其他类型绘制的android.graphics.drawable包,允许您使用公共方法来定义对象的各种属性。您可能想要调整的一些示例属性包括Alpha透明度,滤色器,抖动,不透明度和颜色

NinePatch drawables


NinePatchDrawable图形是可以作为视图的背景上使用具有伸缩性的位图图像。Android会自动调整图形的大小以适应视图的内容。NinePatch图像的一个使用示例是标准Android按钮使用的背景 - 按钮必须伸展以适应各种长度的字符串。NinePatch图形是包含额外1像素边框的标准PNG图像。它必须与9.png扩展名一起保存在 res/drawable/项目目录中。

使用边框定义图像的可拉伸区域和静态区域。您通过在边框的左侧和顶部绘制一条(或多条)1像素宽的黑色线条(其他边框像素应完全透明或白色)来指示可拉伸部分。你可以拥有任意数量的可拉伸部分。可拉伸部分的相对尺寸保持不变,所以最大部分始终保持最大。

您还可以通过在右侧绘制一条线和在底部绘制一条线来定义图像的可选绘图部分(实际上是填充线)。如果一个 View对象将NinePatch图形设置为它的背景,然后指定视图的文本,它将自行伸展,以便所有文本仅占用右侧和底部行(如果包含)所指定的区域。如果不包含填充线,则Android会使用左侧和顶部线来定义此可绘制区域。

为了阐明线条之间的区别,左边线和上边线定义图像的哪些像素被允许被复制以便拉伸图像。底部和右侧线定义了图像内允许占用视图内容的相对区域。

自定义drawables


当你想创建一些自定义图纸时,可以通过扩展Drawable类(或其任何子类)来实现。

实施最重要的方法是draw(Canvas) 因为它提供了Canvas必须用来提供绘图说明的对象。

下面的代码显示了一个简单的Drawable 绘制一个圆圈的子类:

public class MyDrawable extends Drawable {
    private final Paint mRedPaint;

    public MyDrawable() {
        // Set up color and text size
        mRedPaint = new Paint();
        mRedPaint.setARGB(255, 255, 0, 0);
    }

    @Override
    public void draw(Canvas canvas) {
        // Get the drawable's bounds
        int width = getBounds().width();
        int height = getBounds().height();
        float radius = Math.min(width, height) / 2;

        // Draw a red circle in the center
        canvas.drawCircle(width/2, height/2, radius, mRedPaint);
    }

    @Override
    public void setAlpha(int alpha) {
        // This method is required
    }

    @Override
    public void setColorFilter(ColorFilter colorFilter) {
        // This method is required
    }

    @Override
    public int getOpacity() {
        // Must be PixelFormat.UNKNOWN, TRANSLUCENT, TRANSPARENT, or OPAQUE
        return PixelFormat.OPAQUE;
    }
}

然后,您可以随意添加您的drawable, ImageView如下所示:

MyDrawable mydrawing = new MyDrawable();
ImageView image = findViewById(R.id.imageView);
image.setImageDrawable(mydrawing);

在Androd 7.0(API级别24)及更高版本上,您还可以通过以下方式使用XML定义自定义绘图的实例:
使用完全限定的类名称作为XML元素名称。对于这种方法,自定义可绘制类必须是公共顶级类:

<com.myapp.MyDrawable xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="#ffff0000" />

使用drawable的XML标记名称,并指定由类属性的完全合格的类名。这种方法可以用于公共顶级类和公共静态内部类:

<drawable xmlns:android="http://schemas.android.com/apk/res/android"
    class="com.myapp.MyTopLevelClass$MyDrawable"
    android:color="#ffff0000" />

为绘图添加色调


在Android 5.0(API级别21)及以上版本中,您可以将位图和9个补丁定义为alpha蒙版。您可以使用色彩资源或解析为色彩资源的主题属性(例如,?android:attr/colorPrimary)对它们着色。通常,您只创建一次这些资源并自动为它们着色以匹配您的主题。

您可以将色彩来BitmapDrawable,NinePatchDrawable或者VectorDrawable 对象与setTint()方法。您还可以使用android:tint和 android:tintMode属性在布局中设置色调颜色和模式。

从图像中提取突出的颜色


Android支持库包含Palette该类,可让您从图像中提取突出的颜色。您可以将您的绘图作为一个加载Bitmap并传递给它Palette以访问它的颜色。有关更多信息,请阅读
使用Palette API选择颜色。(原文

联系我

QQ:94297366
微信打赏:https://pan.baidu.com/s/1dSBXk3eFZu3mAMkw3xu9KQ

公众号推荐:

图片和图形之Drawables(2)

猜你喜欢

转载自blog.51cto.com/4789781/2120422
今日推荐