Android Api Demos登顶之路(七十六)Graphics-->ShapeDrawable

/*
 * 这篇demon演示了如何在代码中绘制图形,用到了ShapeDrawable类
 */
public class MainActivity extends Activity {

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

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

        /* shader类可以为画笔定制笔刷效果,可以是单色,可以是渐变,也可以是图片 */
        // 定制扫描渐变
        private Shader makeSweep() {
            return new SweepGradient(150, 25, new int[] { 0xffff0000,
                    0xff00ff00, 0xff0000ff }, null);
        }
        //线性渐变笔刷
        private Shader makeLine() {
            return new LinearGradient(0, 0, 50, 50, new int[] { 0xffff0000,
                    0xff00ff00, 0xff0000ff }, null, Shader.TileMode.MIRROR);
        }
        //图片效果笔刷
        private 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);
        }

        public SampleView(Context context) {
            super(context);
            setFocusable(true);
            //定义圆角矩形外边框四个边角的弧度,前两个参数表示左上,后面两个表示右上,接着左下、右下
            float[] outR=new float[]{12,12,12,12,0,0,0,0};
            //外部矩形与内部矩形四条边的间距。在一个矩形内部,再扣去一个矩形,得到一个矩形环的图形。
            //inset就定义了这个矩形环四个边的宽度
            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(outR, null, null));
            mDrawables[3]=new ShapeDrawable(new RoundRectShape(outR, inset, null));
            mDrawables[4]=new ShapeDrawable(new RoundRectShape(outR, inset, innerR));
            //mDrawables[5]=new ShapeDrawable(new OvalShape());
            mDrawables[5]=new ShapeDrawable(new PathShape(path, 100, 100));
            //绘制一个弧形
            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(makeLine());
            mDrawables[5].getPaint().setShader(makeTiling());
            mDrawables[6].getPaint().setColor(0x88ff8844);

            //定义路径(边框)的特效
            //打散Path的线段,使得在原来路径的基础上发生打散效果。第一个参数表示最大的段长,
            //第二个参数表示偏离量
            PathEffect pe=new DiscretePathEffect(10, 4);
            //将Path的各个连接线段之间的夹角用一种更平滑的方式连接,类似于圆弧与切线的效果。
            PathEffect pe2=new CornerPathEffect(4);
            mDrawables[3].getPaint().setPathEffect(new ComposePathEffect(pe2, pe));

            MyShapeDrawable msd=(MyShapeDrawable) mDrawables[6];
            msd.getStrokePaint().setStrokeWidth(4);
        }

        @Override
        protected void onDraw(Canvas canvas) {
            int x=10;
            int y=10;
            int width=300;
            int height=50;
            for(ShapeDrawable sd:mDrawables){
                sd.setBounds(x, y, x+width, y+height);
                sd.draw(canvas);
                y=y+height+5;
            }
        }

        //自定义一个ShapeDrawable
        private class MyShapeDrawable extends ShapeDrawable{
            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 shape, Canvas canvas, Paint paint) {
                //先画图形再描边
                shape.draw(canvas, paint);
                shape.draw(canvas, mStrokePaint);
            }
        }

    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值