圖片和圖形之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)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章