android ShapeDrawable实例

android ShapeDrawable实例

[java]  view plain copy
  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 plain copy
  1. 其他的一些可以看注释,所有的都在这个文件中就传工程了。  

[java]  view plain copy
  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. }  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值