android ShapeDrawable例項

yangxi_001發表於2013-12-26

android ShapeDrawable例項

[java] view plaincopy
  1. 關於ShapeDrawable的使用,分為兩個部分  
  2.  一、是使用已經存在的ShapeDrawable子類  
  3. 1)首先宣告ShapeDrawable物件,有子類例項化。  
  4. 2)設定ShapeDrawable物件的Color或者Shader,Shader是一個渲染圖形的類  
  5. 3)在View中的onDraw()方法中,利用ShapeDrawable.setBounds()方法設定繪圖區域,ShapeDrawable.draw(Canvas)把ShapeDrawable物件畫到畫布的指定位置  
  6. 二、重新構造自己的ShapeDrawable子類  
  7.  必須重寫onDraw()方法。其他的如上  
[java] view plaincopy
  1. 其他的一些可以看註釋,所有的都在這個檔案中就傳工程了。  

[java] view plaincopy
  1. package com.example.test;  
  2. import android.app.Activity;  
  3. import android.content.Context;  
  4. import android.graphics.Bitmap;  
  5. import android.graphics.BitmapShader;  
  6. import android.graphics.Canvas;  
  7. import android.graphics.ComposePathEffect;  
  8. import android.graphics.CornerPathEffect;  
  9. import android.graphics.DiscretePathEffect;  
  10. import android.graphics.LinearGradient;  
  11. import android.graphics.Paint;  
  12. import android.graphics.Path;  
  13. import android.graphics.PathEffect;  
  14. import android.graphics.RectF;  
  15. import android.graphics.Shader;  
  16. import android.graphics.SweepGradient;  
  17. import android.graphics.drawable.Drawable;  
  18. import android.graphics.drawable.ShapeDrawable;  
  19. import android.graphics.drawable.shapes.ArcShape;  
  20. import android.graphics.drawable.shapes.OvalShape;  
  21. import android.graphics.drawable.shapes.PathShape;  
  22. import android.graphics.drawable.shapes.RectShape;  
  23. import android.graphics.drawable.shapes.RoundRectShape;  
  24. import android.graphics.drawable.shapes.Shape;  
  25. import android.os.Bundle;  
  26. import android.view.View;  
  27.   
  28. /* 
  29.  * 關於ShapeDrawable的使用,分為兩個部分 
  30.  * 一、是使用已經存在的ShapeDrawable子類 
  31.  * (1)首先宣告ShapeDrawable物件,有子類例項化。 
  32.  * (2)設定ShapeDrawable物件的Color或者Shader,Shader是一個渲染圖形的類 
  33.  * (3)在View中的onDraw()方法中,利用ShapeDrawable.setBounds()方法設定繪圖區域 
  34.  * ShapeDrawable.draw(Canvas)把ShapeDrawable物件畫到畫布的指定位置 
  35.  * 二、重新構造自己的ShapeDrawable子類 
  36.  * 必須重寫onDraw()方法。其他的如上 
  37.  */  
  38. public class ShapeDrawble1 extends Activity {  
  39.    
  40.   
  41.  @Override  
  42.  protected void onCreate(Bundle savedInstanceState) {  
  43.   super.onCreate(savedInstanceState);  
  44.   setContentView(new SampleView(this));  
  45.  }  
  46.   
  47.  private static class SampleView extends View {  
  48.   private ShapeDrawable[] mDrawables;  
  49.   
  50.   private static Shader makeSweep() {  
  51.      
  52.    return new SweepGradient(15025new int[] { 0xFFFF0000,  
  53.      0xFF00FF000xFF0000FF0xFFFF0000 }, null);// null 表示均衡變化  
  54.   }  
  55.   
  56.   private static Shader makeLinear() {  
  57.    // 顏色按照直線線性變化的著色器  
  58.    return new LinearGradient(005050new int[] { 0xFFFF0000,  
  59.      0xFF00FF000xFF0000FF }, null, Shader.TileMode.MIRROR);  
  60.   }  
  61.   
  62.   private static Shader makeTiling() {  
  63.    int[] pixels = new int[] { 0xFFFF00000xFF00FF000xFF0000FF0 };  
  64.    Bitmap bm = Bitmap.createBitmap(pixels, 22,  
  65.      Bitmap.Config.ARGB_8888);  
  66.      
  67.    return new BitmapShader(bm, Shader.TileMode.REPEAT,  
  68.      Shader.TileMode.REPEAT);  
  69.   }  
  70.   
  71.     
  72.   private static class MyShapeDrawable extends ShapeDrawable {  
  73.    // Paint.ANTI_ALIAS_FLAG代表這個畫筆的圖形是光滑的  
  74.    private Paint mStrokePaint = new Paint(Paint.ANTI_ALIAS_FLAG);  
  75.   
  76.    public MyShapeDrawable(Shape s) {  
  77.     super(s);  
  78.     mStrokePaint.setStyle(Paint.Style.STROKE);  
  79.    }  
  80.   
  81.    public Paint getStrokePaint() {  
  82.     return mStrokePaint;  
  83.    }  
  84.   
  85.    @Override  
  86.    protected void onDraw(Shape s, Canvas c, Paint p) {  
  87.     // 繪製填充效果的圖形  
  88.     s.draw(c, p);  
  89.     // 繪製黑邊  
  90.     s.draw(c, mStrokePaint);  
  91.    }  
  92.   }  
  93.   
  94.   public SampleView(Context context) {  
  95.    super(context);  
  96.    setFocusable(true);  
  97.    // 外部圓角矩形的圓角圓半徑,上面倆個角是圓  
  98.    float[] outerR = new float[] { 121212120000 };  
  99.    // 內部矩形,用於設定外部的矩形和內部矩形之間的距離,第一個引數設定左邊  
  100.    //第二個引數設定上邊,第三個設定右邊,第四個引數設定下邊  
  101.    RectF inset = new RectF(666,6);  
  102.    // 內部圓角矩形的圓角是圓半徑,左上角和右下角是圓角矩形  
  103.    float[] innerR = new float[] { 121200121200 };  
  104.    // 繪製一個頂點為下列四個點的稜形  
  105.    Path path = new Path();  
  106.    path.moveTo(500);  
  107.    path.lineTo(050);  
  108.    path.lineTo(50100);  
  109.    path.lineTo(10050);  
  110.    // 封閉前面點所繪製的路徑  
  111.    path.close();  
  112.   
  113.    mDrawables = new ShapeDrawable[7];  
  114.    // 繪製矩形  
  115.    mDrawables[0] = new ShapeDrawable(new RectShape());  
  116.    // 繪製橢圓  
  117.    mDrawables[1] = new ShapeDrawable(new OvalShape());  
  118.    // 繪製上面倆個角是圓角的矩形  
  119.    mDrawables[2] = new ShapeDrawable(new RoundRectShape(outerR, null,  
  120.      null));  
  121.    // 繪製上面倆角是圓角,並且有一個內嵌的矩形  
  122.    mDrawables[3] = new ShapeDrawable(new RoundRectShape(outerR, inset,  
  123.      null));  
  124.    // //繪製上面倆角是圓角,並且有一個內嵌的矩形且左上角和右下角是圓形矩形環  
  125.    mDrawables[4] = new ShapeDrawable(new RoundRectShape(outerR, inset,  
  126.      innerR));  
  127.    // 繪製指定路徑的集合體  
  128.    mDrawables[5] = new ShapeDrawable(new PathShape(path, 100100));  
  129.    // 用自定的ShapDrawble繪製開始弧度45掃過弧度-270的橢圓  
  130.    mDrawables[6] = new MyShapeDrawable(new ArcShape(45, -270));  
  131.   
  132.    mDrawables[0].getPaint().setColor(0xFFFF0000);  
  133.    mDrawables[1].getPaint().setColor(0xFF00FF00);  
  134.    mDrawables[2].getPaint().setColor(0xFF0000FF);  
  135.    mDrawables[3].getPaint().setShader(makeSweep());  
  136.    mDrawables[4].getPaint().setShader(makeLinear());  
  137.    mDrawables[5].getPaint().setShader(makeTiling());  
  138.    mDrawables[6].getPaint().setColor(0x88FF8844);  
  139.    // DiscretePathEffect是一個折線路徑效果,分割長度是10,偏差時4  
  140.    PathEffect pe = new DiscretePathEffect(104);  
  141.    // CornerPathEffect是將2個路徑效果合併後的路徑效果  
  142.    PathEffect pe2 = new CornerPathEffect(4);  
  143.    mDrawables[3].getPaint().setPathEffect(  
  144.     new ComposePathEffect(pe2, pe));  
  145.   
  146.    MyShapeDrawable msd = (MyShapeDrawable) mDrawables[6];  
  147.    // 設定筆畫寬度等於4  
  148.    msd.getStrokePaint().setStrokeWidth(4);  
  149.   }  
  150.   
  151.   @Override  
  152.   protected void onDraw(Canvas canvas) {  
  153.   
  154.    int x = 10;  
  155.    int y = 10;  
  156.    int width = 300;  
  157.    int height = 50;  
  158.    // 迴圈繪製  
  159.    for (Drawable dr : mDrawables) {  
  160.     dr.setBounds(x, y, x + width, y + height);  
  161.     dr.draw(canvas);  
  162.     y += height + 5;  
  163.    }  
  164.   }  
  165.  }  
  166. }  

相關文章