android.graphics包-核心渲染包(繪圖)

來源:互聯網
上載者:User


android.graphics包是核心渲染包,它提供了一些初級圖形工具,諸如畫布、顏色過濾器、畫筆等,可以讓你直接在螢幕上進行影像處理。這個包中提供了很多類,下面我們就看一下這個包中主要的幾個類。一、Canvas類android.graphics.CanvasCanvas類好比手機中的畫紙,我們可以在Canvas上畫圖形或者映像。一般我們用android來繪畫的時候,需要四個組成部分:1、位元影像:包含像素2、Canvas畫板:包含繪畫內容,寫入位元影像3、初始圖形:如Rect、Bitmap、text等4、Paint:用來描述上面初始圖形的顏色和類型等Canvas類提供了三個構造方法:Public Canvas();構造一個預設無參的Canvas對象Public Canvas(Bitmap bitmap);根據一個Bitmap構造一個Canvas對象Public Canvas(GL gl);根據一個GL來構造一個對象下面我們來瞭解一下Canvas類提供的方法:在Canvas類提供的方法中比較多經常用的是以draw開頭的方法,draw開頭的方法很容易理解就是向畫板中畫圖形,比如可以向Canvas中畫位元影像,給圖形填滿顏色等。比如方法:drawArc(RectF oval, float startAngle, float sweepAngle, boolean useCenter, Paint paint)畫弧形drawCircle(float cx, float cy, float radius, Paint paint)畫圓形Canvas類提供的方法比較多,在此我們不一一贅述,在後面的內容中,我將給大家舉幾個實際的應用程式例子來示範Canvas類的使用方法。 二、Paint類android.graphics.PaintPaint類包含有用來畫幾何圖形、文本、位元影像的類型和顏色等資訊,如果把Canvas類看作是畫板,那我們可以把Paint類看做是畫筆,可以根據需要畫出不同顏色和樣式的圖形、文本等內容。Paint類有三個構造方法:Public Paint()構造一個預設的Paint對象Public  Paint(int flags);根據指定的flags來構造一個Paint對象,建立之後可以用setFlags()方法來更改Public Paint(Paint paint)根據指定的paint對象來構造一個Paint對象Paint類提供了很多方法來設定和擷取Paint對象的屬性,比如:public int getColor ()獲得Paint對象的顏色值public ColorFilter getColorFilter ()獲得顏色過濾器public float getTextSize ()獲得字型大小數值public void setStyle (Paint.Style style)設定paint的類型 三Color類android.graphics.Color此類定義了一些方法來建立和轉換顏色值。顏色被表示為封裝的數值,這個數值由四個位元組組成,分別是:alpha、red、green、blue,這些值是非自左乘的,也就是說任何透明性只儲存在alpha部分,而不是在顏色組成部分。每一部分按照如下的順序儲存:(alpha<<24)|(red<<16)|<green<<8)|blue.每一部分的取值範圍在0-255之間,0意味著這部分不起作用,255表示100%的起作用。因此不透明的黑色應該是0xFF000000,不透明的白色應該是0xFFFFFFFF 。Color類提供了12個常量值來代表不同的顏色值,我們在開發工程中可以直接調用這些常量值來設定我們所要修飾的文本、圖形等對象。Color類提供了一個無參的構造方法Color()Color類提供了一些方法來進行顏色值的建立和轉換如下:其中三個方法是用來返回一個顏色常量值的紅綠藍分色,數值分別在0-255之間,如下:Public static red(int color);Public static green(int color);Public static blue(int color);其中Public static int rgb(int red,int green,int blue);輸入紅綠藍三色,返回一個RGB顏色值。下面幾個方法大家可以參考Android API來瞭解:Public static int HSVToColor(int alpha,float[] hsv);Public static int HSVToColor(float[] hsv);Public static void RGBToHSV(int red,int green,int blue,float[] hsv);Public static int alpha(int color);Public static int argb(int alpha,int red,int green,int blue);Public static colorToHSV(int color,float[] hsv);Public static parseColor(String colorString);四.Typeface類android.graphics.TypefaceTypeface類定義字型和字型內在的類型。這個類被用在畫筆Paint設定的時候,比如用textSize,textSkewX和textScale設定來指定text在畫的時候如何來顯示和測量。Typeface提供了一些常量值來表示自身的一些屬性,比如BOLD,BOLD_ITALIC,ITALIC等,開發人員可以用defaultFrOPhone SDNtyle(int style)獲得內在的Typeface對象。讀者可以參考詳細的API文檔再這裡就不再贅述了。下面我們來看一下Typeface的主要方法。Typeface類沒有構造方法,通常如果一個類沒有建構函式就無法通過構造來產生一個對象實體,此時一般會有特定的靜態方法來取得這個類的實體。Typeface就提供了四個靜態方法間接來得到Typeface實體分別如下:Public static Typeface create(Typeface family,int style);此方法返回一個與已經存在的Typeface字形體系相匹配且類型是指定類型的Typeface。如果你想得到一個與已經存在的Typeface字形體系相類似,但是樣式不一樣的Typeface時可以調用此方法。其中family參數可以為null,如果為空白則表示從預設的Typeface字形體系中選擇。Public static Typefaxe create(String familyname,int style);此方法通過給定的字形體系的名稱familyname和指定的類型返回一個Typeface對象。如果給定字形體系的名稱為null,我們可以通過getStyle()方法來獲得返回Typeface對象的真正的屬性。Public static Typeface createFromAsset(AssetManager mgr,String path);此方法通過規定的字型資料來返回一個Typeface對象。第一個參數為資源管理員,第二個參數是指定字型類型。Public static Typeface defaultFrOPhone SDNtyle(int style);此方法返回一個指定類型的Typeface對象Typeface還提供了另外三個方法:Public int getStyle();此方法返回Typeface內在的類型屬性Public final Boolean isBold();如果getStyle()有BOLD位組將返回truePublic final Boolean isItalic();如果getStyle()有ITALIC位組將返回true五、Path類android.graphics.PathPath類(一組地區)的描畫,類囊括多種幾何圖形比如直線線段、二次曲線、三次曲線等,調用Canvas.drawPath()方法可以將Path以所定義的paint的方式來畫到畫板上或者填出圖形,也可以用paint所指定方式來畫圖形。 六、RectF類android.graphics.RectF和Rect類android.graphics.RectRectF這個類包含一個矩形的四個單精確度浮點座標。矩形通過上下左右4個邊的座標來表示一個矩形。這些座標值屬性可以被直接存取,用width()和height()方法可以擷取矩形的寬和高。注意:大多數方法不會檢查這些座標分類是否錯誤(也就是left<=right和top<=bottom).RectF一共有四個構造方法:RectF()構造一個無參的矩形RectF(float left,float top,float right,float bottom)構造一個指定了4個參數的矩形RectF(Rect F r)根據指定的RectF對象來構造一個RectF對象(對象的左邊座標不變)RectF(Rect r)根據給定的Rect對象來構造一個RectF對象RectF提供了很多方法,下面介紹幾個方法:Public Boolean contain(RectF r);判斷一個矩形是否在此矩形內,如果在這個矩形內或者和這個矩形等價則返回true,同樣類似的方法還有public Boolean contain(float left,float top,float right,float bottom)和public Boolean contain(float x,float y)。Public void union(float x,float y)更新這個矩形,使它包含矩形自己和(x,y)這個點。RectF類提供的方法都比較簡單,容易理解,再此就不再一一贅述Android.graphics.Rect類,這個類同android.graphics.RectF很相似,不同的地方是Rect類的座標是用整形表示的,而RectF的座標是用單精確度浮點型表示的。 七、Point類android.graphics.Point    這個類從字面意思就可以看出它跟點有關係,是點的一個對象類。這個類有兩個屬性,分別是:X座標和y座標。建構函式有三個:Point(),Point(int x,int y),Point(Point p)主要方法有:Public void set(x,y);重新設定一下x,y的座標Public final void offset(int dx,int dy);給座標一個補償值,值可以使正的也可以是負的。Public final void negate();否定座標值。Point類和android.graphics.PointF類似,不同點是前者座標值的類型是int型,而後者的座標值是float型。除此之外PointF類多加了幾個方法,比如:Public final float length();返回(0,0)點到該點的距離。Public static float length(float x,float y);返回(0,0)點到(x,y)點的距離。下面的例子能讓大家很好的瞭解以上幾個類的用法:@Overrideprotected void onDraw(Canvas canvas) {     Paint paint = new Paint();     paint.setColor(Color.argb(255, 255, 255, 255));          Rect rect = new Rect(10, 20, 30, 40);     canvas.drawRect(rect, paint);          RectF rectF = new RectF(40.5f, 20.5f, 60.5f, 40.5f);     canvas.drawRect(rectF, paint);          paint.setStyle(Style.STROKE);     canvas.drawRect(10, 50, 30, 80, paint); } 另外我們可以通過Canvas畫圖的方法輕鬆的畫一個圖片,啟動並執行效果和原代碼如下:這個比較簡單,直接看代碼吧.package p.com;import android.app.Activity;import android.content.Context;import android.content.res.Resources;import android.graphics.Bitmap;import android.graphics.Canvas;import android.graphics.Paint;import android.graphics.drawable.Drawable;import android.os.Bundle;import android.view.View;public class PActivity extends Activity {        public void onCreate(Bundle savedInstanceState) {                super.onCreate(savedInstanceState);                MyView myView = new MyView(this);                myView.loadLogo();                setContentView(myView);        }        private class MyView extends View {                public MyView(Context context) {                        super(context);                }                Bitmap bLogo;                private final Paint mPaint = new Paint();                /**                 * 裝在logo                 */                public void loadLogo() {                        Resources r = this.getContext().getResources();                        Drawable logo = r.getDrawable(R.drawable.omslogo);                        Bitmap bitmap = Bitmap.createBitmap(200, 100,                                        Bitmap.Config.ARGB_8888);                        Canvas canvas = new Canvas(bitmap);                        logo.setBounds(0, 0, 200, 100);                        logo.draw(canvas);                        bLogo = bitmap;                }                protected void onDraw(Canvas canvas) {                        if(bLogo != null){                                canvas.drawBitmap(bLogo, 0, 0, mPaint);                        }                }        }} 繪製幾何圖形:使用android.graphics類

本範例將運用Paint對象(繪筆)的設定值不同,在Cavas(畫布)上繪製空心、實習及漸層色的多種幾何多形。

範例說明

  “如何在和機上繪製2D圖形呢?”這是許多android遊戲開發都是常提到的問題,在android SDK 當中,並沒有JavaGraphics2D的函數可以使用,而是使用android.graphics底下的類來繪製2D向量圖。這個package提供了許多在手機上繪製圖形的類與方法,其中Canvas上,而Paint(Android.graphics.Paint)類則像是彩色鉛筆,給予不同的調協,即可繪製不同顏色、不同種類效果的向量圖形。

  本範例將運用Paint對象(繪筆)的設定值不同,在Cavas(畫布)上繪製空心、實習及漸層色的多種幾何多形。

  運行結果如果

  範常式序

  主程式中繼承自Android.view.View的 MyView類,重寫 MyView的onDraw()方法,一開始就會運行繪製的工作,在onDraw()中以Paint將幾何圖形繪製在Canvas上,以 paint.setColor() 改變圖形顏色、以 paint.setStyle()的設定來控制畫出的的圖形是空心還是實心。程式的最後一段,就是直接在Canvas寫上文字,隨著Paint對象裡的屬性設定,也會有不同的面板模式。

package com.graphices; 
 
import  android.app.Activity;
import android.os.Bundle;
import  android.view.View;
import android.content.Context;
import  android.graphics.Canvas;
import android.graphics.Color;
import  android.graphics.Paint;
import android.graphics.RectF;
import  android.graphics.Path;
import android.graphics.Shader;
import  android.graphics.LinearGradient;
public class GraphicesActivity  extends Activity {
    /** Called when the activity is first created.  */
    @Override
    public void onCreate(Bundle  savedInstanceState) {
        super.onCreate(savedInstanceState);
        /*設定ContentView為自訂的MyVieW*/
        MyView myView=new  MyView(this);
        setContentView(myView);
    }
    /* 自訂繼承View 的MyView*/
private class MyView extends View
{
     public  MyView(Context context){
        super(context) ;
     }
      /*重寫onDraw()*/
     @Override
     protected void onDraw(Canvas  canvas)
     {   
         super.onDraw(canvas);
         /*設定背景為白色*/
         canvas.drawColor(Color.WHITE);
          Paint  paint=new Paint();
          /*去鋸齒*/
           paint.setAntiAlias(true);
          /*設定paint的顏色*/
           paint.setColor(Color.RED);
          /*設定paint的 style 為STROKE:空心*/
          paint.setStyle(Paint.Style.STROKE);
          /*設定paint的外框寬度*/
          paint.setStrokeWidth(3);
          /*畫一個空心圓形*/
          canvas.drawCircle(40, 40, 30, paint);
          /*畫一個空心正方形*/
          canvas.drawRect(10, 90, 70, 150, paint);
          /*畫一個空心長方形*/
          canvas.drawRect(10, 170, 70,200, paint);
           /*畫一個空心橢圓形*/
          RectF re=new RectF(10,220,70,250);
          canvas.drawOval(re, paint);
          /*畫一個空心三角形*/
           Path path=new Path();
          path.moveTo(10, 330);
           path.lineTo(70,330);
          path.lineTo(40,270);
           path.close();
          canvas.drawPath(path, paint);
          /* 畫一個空心梯形*/
          Path path1=new Path();
           path1.moveTo(10, 410);
          path1.lineTo(70,410);
           path1.lineTo(55,350);
          path1.lineTo(25, 350);
           path1.close();
          canvas.drawPath(path1, paint);
          
          /*設定paint 的style為 FILL:實心*/
           paint.setStyle(Paint.Style.FILL);
          /*設定paint的顏色*/
          paint.setColor(Color.BLUE);
          /*畫一個實心圓*/
           canvas.drawCircle(120,40,30, paint);
          /*畫一個實心正方形*/
          canvas.drawRect(90, 90, 150, 150, paint);
          /*畫一個實心長方形*/
          canvas.drawRect(90, 170, 150,200, paint);
          /*畫一個實心橢圓*/
          RectF re2=new RectF(90,220,150,250);
           canvas.drawOval(re2, paint);
          /*畫一個實心三角形*/
          Path  path2=new Path();
          path2.moveTo(90, 330);
           path2.lineTo(150,330);
          path2.lineTo(120,270);
           path2.close();
          canvas.drawPath(path2, paint);
           /*畫一個實心梯形*/
          Path path3=new Path();
           path3.moveTo(90, 410);
          path3.lineTo(150,410);
           path3.lineTo(135,350);
          path3.lineTo(105, 350);
          path3.close();
          canvas.drawPath(path3, paint);
          /*設定漸層色*/
          Shader mShader=new LinearGradient(0,0,100,100,
                  new  int[]{Color.RED,Color.GREEN,Color.BLUE,Color.YELLOW},
                  null,Shader.TileMode.REPEAT);
          paint.setShader(mShader);
        
          /*畫一個漸層色圓*/
           canvas.drawCircle(200,40,30, paint);
          /*畫一個漸層色正方形*/
          canvas.drawRect(170, 90, 230, 150, paint);
          /*畫一個漸層色長方形*/
          canvas.drawRect(170, 170, 230,200, paint);
          /*畫一個漸層色橢圓*/
          RectF re3=new RectF(170,220,230,250);
          canvas.drawOval(re3, paint);
          /*畫一個漸層色三角形*/
          Path path4=new Path();
          path4.moveTo(170,330);
          path4.lineTo(230,330);
          path4.lineTo(200,270);
          path4.close();
          canvas.drawPath(path4, paint);
          /*畫一個漸層色梯形*/
          Path path5=new Path();
           path5.moveTo(170, 410);
          path5.lineTo(230,410);
          path5.lineTo(215,350);
          path5.lineTo(185, 350);
          path5.close();
          canvas.drawPath(path5, paint);
          
          /*寫字*/
          paint.setTextSize(24);
           canvas.drawText(getResources().getString(R.string.str_text1), 240, 50,  paint);
           canvas.drawText(getResources().getString(R.string.str_text2), 240, 120,  paint);
           canvas.drawText(getResources().getString(R.string.str_text3), 240, 190,  paint);
           canvas.drawText(getResources().getString(R.string.str_text4), 240, 250,  paint);
           canvas.drawText(getResources().getString(R.string.str_text5), 240, 320,  paint);
           canvas.drawText(getResources().getString(R.string.str_text6), 240, 390,  paint);  
     }
}
}

 

相關文章

聯繫我們

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