android中的圖形映像-訪問圖片drawable

來源:互聯網
上載者:User

一、如何擷取 res 中的資源
資料包package:android.content.res
主要類:Resources
其主要介面按照功能,劃分為以下三部分:

getXXXX()

例如:

int getColor(int id)

Drawable getDrawable(int id)

String getString(int id)  直接擷取res中存放的資源

InputStream openRawResource(int id)  擷取資源的資料流,讀取資源資料

void parseBundleExtras(XmlResourceParser parser, Bundle outBundle)  從XML檔案中擷取資料

Resource為每種資源提供了相應的介面來擷取這種資源,除了可以直接擷取資源外,還額外提供了以資料流的方式擷取資源,這在以後的應用程式開發中會經常使用,那麼如何擷取Resources了,如下:Resources r = this.getContext().getResources();

 

二、如何擷取資源中的畫圖對象
資料包package:android.graphics.drawable
主要類:Drawable
Drawable是個virtual class,具體如何畫圖,需要具體分析Drawable的子類,例如:BitmapDrawable
其主要介面如下:

BitmapDrawable()

BitmapDrawable(Bitmap bitmap)

BitmapDrawable(String filepath)

BitmapDrawable(InputStream is)

void draw(Canvas canvas)

final Bitmap getBitmap()

final Paint getPaint()

Drawable是個抽象類別,在BitmapDrawable中我們就看到位元影像的具體操作,在仔細看下BitmapDrawable的建構函式,我們就會發現與Resource中的openRawResource()介面是相對應的,就可以通過以下方法來擷取位元影像:
Resources r = this.getContext().getResources();
Inputstream is = r.openRawResource(R.drawable.my_background_image);
BitmapDrawable  bmpDraw = new BitmapDrawable(is);
Bitmap bmp = bmpDraw.getBitmap();

Paint

資料包package:android.graphics

Android SDK中的簡介:The Paint class holds the style and color information about how to draw geometries, text and bitmaps. 主要就是定義:畫刷的樣式,畫筆的大小/顏色等。

Typeface
資料包 package:android.graphics
Android SDK中的簡介:The Typeface class specifies the typeface and intrinsic style of a font. 主要就是定義:字型。

核心類顯示資源
資料包package:android.graphics
主要類:Canvas
Android SDK中的簡介:The Canvas class holds the “draw” calls. To draw something, you need 4 basic components: A Bitmap to hold the pixels, a Canvas to host the draw calls (writing into the bitmap), a drawing primitive (e.g. Rect, Path, text, Bitmap), and a paint (to describe the colors and styles for the drawing).
按照結構的功能,將主要介面分為以下3部分:

boolean clipXXXX() Region地區操作:DIFFERENCE INTERSECT REPLACE REVERSE_DIFFERENCE UNION XOR

void drawXXXX()畫圖函數

void rotate()  void scale()  void skew() void translate() 畫布操作函數

Region在這裡需要特殊說明下:Region就是一個地區,也就是畫布(Canvas)中的有效地區,在無效地區上draw,對畫布沒有任何改變。

Drawable類
Drawable是一個通用的抽象類別,它的目的是告訴你什麼東西是可以畫的。你會發現基於Drawable類擴充出各種繪圖的類,見下面的表格,當然你可以繼承它來建立你自己的繪圖類.

 

有三種方法可以定義和執行個體化一個Drawable:儲存一個圖片到你工程資源中,使用XML檔案來描述Drawable屬性或者用一個正常的類去構造。下面我們將討論兩種技術(對一個有開發經驗的開發人員來說構造並不是最新的技術)。

從資源影像檔中建立
一個比較簡單的方法是添加一個圖片到你的程式中,然後通過資源檔引用這個檔案,支援的檔案類型有PNG(首選的) JPG(可接受的)GIF(不建議),顯然這種對於顯示應用程式的表徵圖跟來說是首選的方法,也可以用來顯示LOGO,其餘的圖片可以用在例如遊戲中。

把一個圖片資源,添加你的檔案到你工程中res/drawable/目錄中去,從這裡,你就可以引用它到你的代碼或你的XML布局中,也就是說,引用它也可以用資源編號,比如你選擇一個檔案只要去掉尾碼就可以了(例如:my_image.png 引用它是就是my_image)。

注意:SDK指出,為了縮小圖片的儲存空間,在Build的時候又可能對圖片進行壓縮,如果不想被壓縮,可以將圖片放在res/raw/目錄中。

SDK給出的例子:

LinearLayout mLinearLayout;

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Create a LinearLayout in which to add the ImageView
    mLinearLayout = new LinearLayout(this);

    // Instantiate an ImageView and define its properties
    ImageView i = new ImageView(this);
    i.setImageResource(R.drawable.my_image);
    i.setAdjustViewBounds(true); // set the ImageView bounds to match the Drawable's dimensions
    i.setLayoutParams(new Gallery.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

    // Add the ImageView to the layout and set the layout as the content view
    mLinearLayout.addView(i);
    setContentView(mLinearLayout);
}擷取Drawable對象:

Resources res = mContext.getResources();
Drawable myImage = res.getDrawable(R.drawable.my_image); 

注意:保持每個資源類型的一至,可以保證你項目狀態的一致性,就不用擔心有許多不同類型的對象來執行個體化它。例如:如果使用相同的映像資源來執行個體化兩個Drawable對象。然後修改一個Drawables的屬性(例如alpha),然後不幸得是這個效果也會出現在另一個對象上去。所以當處理同一個資源的多個執行個體對象時,不是直接轉換為Drawable,而是應該執行tween animation

如何添加資源到ImageView:
<ImageView  
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:tint="#55ff0000"
  android:src="@drawable/my_image"/> 從XML檔案中建立
到如今,你應該比較熟悉按Android的原則去開發一個使用者介面,因此,你也應該理解了定義一個XML檔案對於對象的作用與靈活的重要性。這個理念無數次用於Drawables.

如果你想建立一個Drawable對象,而這個對象並不依賴於變數或使用者的交換,把它定義到XML中去應該是一個不錯的方法。即使你期望在你的應用程式中改變其屬性來增加使用者體驗。你應該考慮把對象放入XML中,因為你可以隨時修改其屬性。

當你在你的XML中定義了一個Drawable,儲存這個XML檔案到你工程目錄下res/drawable目錄中,然後通過調用Resource.getDrawable()來檢索並執行個體化,傳遞給它XML檔案中的資源ID號。任何Drawable的子類都支援inflate這個方法,這個方法會通過XML來執行個體化你的程式。任何Drawable都支援XML的擴充來利用特殊的XML屬性來協助定義對象的屬性,可以查看任何Drawable子類文檔來看如何定義XML檔案。

如下定義了一個TransitionDrawable:An extension of LayerDrawables that is intended to cross-fade between the first and second layer. It can be defined in an XML file with the <transition> element. Each Drawable in the transition is defined in a nested <item>. 有關TransitionDrawable的詳細資料查看http://androidappdocs.appspot.com/reference/android/graphics/drawable/TransitionDrawable.html。

將其定義在res/drawable/expand_collapse.xml:

<?xml version="1.0" encoding="utf-8"?>
<transition xmlns:android="http://schemas.android.com/apk/res/android">
 <item android:drawable="@drawable/pic1"/>
   <item android:drawable="@drawable/pic2"/>
</transition>
下面執行個體化並處理:

public class MainActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        Resources res=getResources();
        TransitionDrawable trans=(TransitionDrawable )res.getDrawable(R.drawable.expand_collapse);
        ImageView image = (ImageView)findViewById(R.id.ImageView01);
        image.setImageDrawable(trans);
        trans.startTransition(3000);
    }
}ShapeDrawable
當你想去畫一些動態二維圖片,一個ShapeDrawable對象可能會對你有很大的協助。通過ShapeDrawable,你可以通過編程畫出任何你想到的映像與樣式。

ShapeDrawable繼承了Drawable, 所以你可以調用Drawable裡有的函數,比如視圖的背景,通過setBackgroundDrawable()設定。當然,你可以在自訂的視圖布局中畫你的圖形,因為ShapeDrawable有自己的draw()方法。你可以在View.OnDraw()方法期間建立一個視圖的子類去畫ShapeDrawable。

ShapeDrawable類(像很多其他Drawable類型在android.graphics.drawable包)允許你定義drawable公用方法的各種屬性。有些屬性你可以需要調整,包括透明度,顏色過濾,不透明度,顏色。

 

NinePatchDrawable

NinePatchDrawable 繪畫的是一個可以伸縮的位元影像映像,Android會自動調整大小來容納顯示的內容。一個例子就是NinePatch為背景,使用標準的Android按鈕,按鈕必須伸縮來容納長度變化的字元

NinePatchDrawable是一個標準的PNG映像,它包括額外的1個像素的邊界,你必須儲存它尾碼為.9.png,並且保持到工程的res/drawable目錄中。

這個邊界是用來確定映像的可伸縮和靜態地區。你可以在左邊和上邊的線上畫一個或多個黑色的1個像素指出可伸縮的部分(你可以需要很多可伸縮部分),它的相對位置在可伸縮部分相同,所以大的部分總是很大的。

你還有可以在映像的右邊和下邊畫一條可選的drawable地區(有效,內邊距線)。如果你的視圖對象設定NinePath為背景然後指定特殊的視圖字型,它將自行伸縮使所有的文本來適應根據右線與底部線設計好的地區(如果有的話),當然內邊距線不包括其中,Android可以使用左邊的線與上面的線來定義一個drawable地區。

我們來澄清一下這兩條不同的線,左邊跟頂部的線來定義哪些映像的像素允許在伸縮時被複製。底部與右邊的線用來定義一個相對位置內的映像,視圖的內容就放入其中。

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.