/*
* 这篇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);
}
}
}
}
07-22
07-22
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交