Android畫布和圖形繪製—Canvas and Drawables(三)

來源:互聯網
上載者:User

本文譯自:http://developer.android.com/guide/topics/graphics/2d-graphics.html

圖形繪製

Android為繪製圖形和圖片提供了一個定製的2D圖形類庫。android.graphics.drawable包中能夠找到用於繪製二維圖形的共同的類。

本文討論使用Drawable對象來繪製圖形的基礎知識,以及如何使用Drawable類的子類。關於使用Drawable對象來繪製幀動畫的資訊,請看繪製動畫文檔(http://developer.android.com/guide/topics/graphics/drawable-animation.html)

Drawable對象是對圖形繪製的一般化抽象,你會發現很多用於繪製特殊類型圖形的Drawable類的子類,包括BitmapDrawable、ShapDrawable、PictureDrawable、LayerDrawable等。當然,你也可以繼承這些類,來定義自己的具有獨特行為的Drawable對象。

有三種方法來定義和初始化一個Drawable對象:1.使用儲存在項目資源中的一個圖片;2.使用定義Drawable對象屬性的XML檔案;3.使用普通的類構造器。以下我們將重點討論前兩種技術(使用構造器技術對於開發人員來說並不陌生)。

從資源圖片中建立一個Drawable對象

通過引用項目資源中的一個圖片檔案,把圖形添加到應用程式中是一種簡單的方法。支援的圖片格式包括:PNG(推薦格式)、JPG(可接受格式)、GIF(不推薦格式)。這種技術主要用於應用的表徵圖、Logo或遊戲中所使用的那些圖形。

要使用圖片資源,只需把圖片添加到項目的res/drawable/目錄中。應用程式代碼或XML布局會從那兒來引用這些圖片。無論在那兒使用圖片,都要使用該圖片資源的ID,這個ID是不帶檔案類型副檔名的檔案名稱(如:my_image指向了my_image.png檔案)。

注意:被放置在res/drawable/目錄下的圖片資源,在編譯期間,能夠被aapt工具自動的最佳化壓縮成無損的圖片。例如,一個不多於256色的真彩色PNG圖片,能夠被轉換成一個帶有調色盤的8位PNG圖片。這樣就獲得同等品質的圖片,但卻需要更少的記憶體。因此,要瞭解放置在這個目錄下的圖片,在編譯期間的這種改變。如果為了把圖片轉換成一個位元影像,而計劃用位流的形式來讀取一張圖片,就要把該圖片放到res/raw/檔案夾中,這個檔案夾中的圖片不會被最佳化。

範例程式碼

以下程式碼片段示範了如何建立一個使用繪製資源圖片的ImageView對象,並把該對象添加到布局中:

 
LinearLayout mLinearLayout;

  protectedvoid onCreate(Bundle
savedInstanceState){
  super.onCreate(savedInstanceState);

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

  // Instantiate an ImageView and define its properties
  ImageView i
=newImageView(this);
  i.setImageResource(R.drawable.my_image);
  i.setAdjustViewBounds(true);//
set the ImageView bounds to match the Drawable's dimensions
  i.setLayoutParams(newGallery.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對象來處理,就要像下面代碼這樣來建立一個Drawable對象:

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

注意:在項目中的每種資源只能保持一種狀態,不管執行個體化了多少該對象。例如:如果用同一個圖片資源來執行個體化了兩個Drawable對象,那麼只要改變了其中一個Drawable對象一個屬性(如,透明度),另一個也會受到影響。因此在處理一個圖片資源的多個執行個體時,要用補間動畫(tween animation)來替代直接的Drawable對象的傳遞。

樣本XML

以下XML片段顯示了如何把一個繪製資源添加到XML布局中的一個ImageView元素中:

     
<ImageView
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:tint="#55ff0000"
      android:src="@drawable/my_image"/>

關於使用項目資源的更多資訊,請看資源和資產文檔(http://developer.android.com/guide/topics/resources/index.html)

從資源XML中建立一個Drawable對象

現在,你應該已經熟悉了Android的使用者介面的開發原則。因此也就理解了定義XML中對象所帶來的強大功能和靈活性。這種方法從View對象到Drawable對象都適用。如果建立了一個Drawable對象,它初始並不依賴應用程式代碼或使用者介面中定義的一個變數,而是把它定義在一個XML中,這是一個好的選擇。即使是在使用者與應用程式互動期間要改變Drawable對象的屬性,也應該考慮把該對象定義在XML中,這樣一旦它被執行個體化,就可以隨時來修改它的屬性。

一旦用XML來定義Drawable對象,就要把該定義儲存在工程的res/drawable/目錄中,然後通過調用Resources.getDrawable()方法來擷取和執行個體化該對象。

任何提供了inflate()方法的Drawable子類都能夠被定義在XML中,並能夠被應用程式執行個體化。每個提供XML填充能力的Drawable對象,都採用了特殊的XML屬性來協助定義對象的屬性。有關每個Drawable子類如何在XML中定義的資訊,請看對應類文檔。

樣本

以下XML定義了一個TransitionDrawable對象:

     
<transitionxmlns:android="http://schemas.android.com/apk/res/android">
      <itemandroid:drawable="@drawable/image_expand">
      <itemandroid:drawable="@drawable/image_collapse">
      </transition>

這個XML要儲存在res/drawable/expand_collapse.xml檔案中,以下代碼會樣本化該TransitionDrawable對象,並把它作為ImageView對象的內容來設定:

     
Resources res
= mContext.getResources();
      TransitionDrawable transition
=(TransitionDrawable)
res.getDrawable(R.drawable.expand_collapse);
      ImageView image
=(ImageView) findViewById(R.id.toggle_image);
      image.setImageDrawable(transition);

然後,這個過渡效果能夠使用以下代碼來運行:

transition.startTransition(1000);

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.