//关键字:Shader ,ShapeDrawable package com.example.android.apis.graphics; import com.example.android.apis.R; import android.app.Activity; import android.content.Context; import android.graphics.*; import android.graphics.drawable.Drawable; import android.graphics.drawable.ShapeDrawable; import android.graphics.drawable.shapes.*; import android.os.Bundle; import android.view.KeyEvent; import android.view.*; public class ShapeDrawable1 extends GraphicsActivity { @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); } 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 { 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));//菱形,后两个参数分别对应标准宽高,缩放时以他们为标准等比缩放。 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); PathEffect pe = new DiscretePathEffect(10, 4);//路径特效 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 (Drawable dr : mDrawables) { dr.setBounds(x, y, x + width, y + height); dr.draw(canvas); y += height + 5; } } } }