android ShapeDrawable實例

原文:http://blog.sina.com.cn/s/blog_9f7feef1010155f4.html

android ShapeDrawable實例

  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()方法。其他的如上  
關於ShapeDrawable的使用,分爲兩個部分
 一、是使用已經存在的ShapeDrawable子類
(1)首先聲明ShapeDrawable對象,有子類實例化。
(2)設置ShapeDrawable對象的Color或者Shader,Shader是一個渲染圖形的類
(3)在View中的onDraw()方法中,利用ShapeDrawable.setBounds()方法設置繪圖區域,ShapeDrawable.draw(Canvas)把ShapeDrawable對象畫到畫布的指定位置
二、重新構造自己的ShapeDrawable子類
 必須重寫onDraw()方法。其他的如上
  1. 其他的一些可以看註釋,所有的都在這個文件中就傳工程了。  
其他的一些可以看註釋,所有的都在這個文件中就傳工程了。

  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. }  
package com.example.test;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.ComposePathEffect;
import android.graphics.CornerPathEffect;
import android.graphics.DiscretePathEffect;
import android.graphics.LinearGradient;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PathEffect;
import android.graphics.RectF;
import android.graphics.Shader;
import android.graphics.SweepGradient;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.ShapeDrawable;
import android.graphics.drawable.shapes.ArcShape;
import android.graphics.drawable.shapes.OvalShape;
import android.graphics.drawable.shapes.PathShape;
import android.graphics.drawable.shapes.RectShape;
import android.graphics.drawable.shapes.RoundRectShape;
import android.graphics.drawable.shapes.Shape;
import android.os.Bundle;
import android.view.View;

/*
 * 關於ShapeDrawable的使用,分爲兩個部分
 * 一、是使用已經存在的ShapeDrawable子類
 * (1)首先聲明ShapeDrawable對象,有子類實例化。
 * (2)設置ShapeDrawable對象的Color或者Shader,Shader是一個渲染圖形的類
 * (3)在View中的onDraw()方法中,利用ShapeDrawable.setBounds()方法設置繪圖區域
 * ShapeDrawable.draw(Canvas)把ShapeDrawable對象畫到畫布的指定位置
 * 二、重新構造自己的ShapeDrawable子類
 * 必須重寫onDraw()方法。其他的如上
 */
public class ShapeDrawble1 extends Activity {
 

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(new SampleView(this));
 }

 private static class SampleView extends View {
  private ShapeDrawable[] mDrawables;

  private static Shader makeSweep() {
   
   return new SweepGradient(150, 25, new int[] { 0xFFFF0000,
     0xFF00FF00, 0xFF0000FF, 0xFFFF0000 }, null);// null 表示均衡變化
  }

  private static Shader makeLinear() {
   // 顏色按照直線線性變化的着色器
   return new LinearGradient(0, 0, 50, 50, new int[] { 0xFFFF0000,
     0xFF00FF00, 0xFF0000FF }, null, Shader.TileMode.MIRROR);
  }

  private static Shader makeTiling() {
   int[] pixels = new int[] { 0xFFFF0000, 0xFF00FF00, 0xFF0000FF, 0 };
   Bitmap bm = Bitmap.createBitmap(pixels, 2, 2,
     Bitmap.Config.ARGB_8888);
   
   return new BitmapShader(bm, Shader.TileMode.REPEAT,
     Shader.TileMode.REPEAT);
  }

  
  private static class MyShapeDrawable extends ShapeDrawable {
   // Paint.ANTI_ALIAS_FLAG代表這個畫筆的圖形是光滑的
   private Paint mStrokePaint = new Paint(Paint.ANTI_ALIAS_FLAG);

   public MyShapeDrawable(Shape s) {
    super(s);
    mStrokePaint.setStyle(Paint.Style.STROKE);
   }

   public Paint getStrokePaint() {
    return mStrokePaint;
   }

   @Override
   protected void onDraw(Shape s, Canvas c, Paint p) {
    // 繪製填充效果的圖形
    s.draw(c, p);
    // 繪製黑邊
    s.draw(c, mStrokePaint);
   }
  }

  public SampleView(Context context) {
   super(context);
   setFocusable(true);
   // 外部圓角矩形的圓角圓半徑,上面倆個角是圓
   float[] outerR = new float[] { 12, 12, 12, 12, 0, 0, 0, 0 };
   // 內部矩形,用於設置外部的矩形和內部矩形之間的距離,第一個參數設置左邊
   //第二個參數設置上邊,第三個設置右邊,第四個參數設置下邊
   RectF inset = new RectF(6, 6, 6,6);
   // 內部圓角矩形的圓角是圓半徑,左上角和右下角是圓角矩形
   float[] innerR = new float[] { 12, 12, 0, 0, 12, 12, 0, 0 };
   // 繪製一個頂點爲下列四個點的棱形
   Path path = new Path();
   path.moveTo(50, 0);
   path.lineTo(0, 50);
   path.lineTo(50, 100);
   path.lineTo(100, 50);
   // 封閉前面點所繪製的路徑
   path.close();

   mDrawables = new ShapeDrawable[7];
   // 繪製矩形
   mDrawables[0] = new ShapeDrawable(new RectShape());
   // 繪製橢圓
   mDrawables[1] = new ShapeDrawable(new OvalShape());
   // 繪製上面倆個角是圓角的矩形
   mDrawables[2] = new ShapeDrawable(new RoundRectShape(outerR, null,
     null));
   // 繪製上面倆角是圓角,並且有一個內嵌的矩形
   mDrawables[3] = new ShapeDrawable(new RoundRectShape(outerR, inset,
     null));
   // //繪製上面倆角是圓角,並且有一個內嵌的矩形且左上角和右下角是圓形矩形環
   mDrawables[4] = new ShapeDrawable(new RoundRectShape(outerR, inset,
     innerR));
   // 繪製指定路徑的集合體
   mDrawables[5] = new ShapeDrawable(new PathShape(path, 100, 100));
   // 用自定的ShapDrawble繪製開始弧度45掃過弧度-270的橢圓
   mDrawables[6] = new MyShapeDrawable(new ArcShape(45, -270));

   mDrawables[0].getPaint().setColor(0xFFFF0000);
   mDrawables[1].getPaint().setColor(0xFF00FF00);
   mDrawables[2].getPaint().setColor(0xFF0000FF);
   mDrawables[3].getPaint().setShader(makeSweep());
   mDrawables[4].getPaint().setShader(makeLinear());
   mDrawables[5].getPaint().setShader(makeTiling());
   mDrawables[6].getPaint().setColor(0x88FF8844);
   // DiscretePathEffect是一個折線路徑效果,分割長度是10,偏差時4
   PathEffect pe = new DiscretePathEffect(10, 4);
   // CornerPathEffect是將2個路徑效果合併後的路徑效果
   PathEffect pe2 = new CornerPathEffect(4);
   mDrawables[3].getPaint().setPathEffect(
    new ComposePathEffect(pe2, pe));

   MyShapeDrawable msd = (MyShapeDrawable) mDrawables[6];
   // 設置筆畫寬度等於4
   msd.getStrokePaint().setStrokeWidth(4);
  }

  @Override
  protected void onDraw(Canvas canvas) {

   int x = 10;
   int y = 10;
   int width = 300;
   int height = 50;
   // 循環繪製
   for (Drawable dr : mDrawables) {
    dr.setBounds(x, y, x + width, y + height);
    dr.draw(canvas);
    y += height + 5;
   }
  }
 }
}



發佈了15 篇原創文章 · 獲贊 0 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章