您的位置:首页 > 移动开发 > Android开发

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

2015-09-20 15:14 501 查看
/*
* 这篇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);
}
}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: