代码是在W3cschool网站上安卓开发教程的最后部分摘抄的,原主也是在网上down下的代码。这篇文章主要是分析一下代码的实现过程。
链接:http://www.runoob.com/w3cnote/android-tutorial-drawable1.html
先上代码
代码中有做的标记。
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/*setContentView(R.layout.activity_main);
*这个是从前在xml里解析出view时的写法。*/
setContentView(new SampleView(this));
//SampleView是下面自己定义的写法。
}
//自定义的内容。
private static class SampleView extends View {
private ShapeDrawable[] mDrawables;
/*建立一个数组来存放图形*/
private static Shader makeSweep() {
return new SweepGradient(50, 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[] { 30, 30, 30, 30, 30, 30, 30, 30 };
RectF inset = new RectF(1, 1, 1, 1);
float[] innerR = new float[] { 12, 12, 12, 12, 0, 0, 0, 0 };
/*这三个数组时=是作为参数,传入创建矩形的方法里
下面可以看到*/
Path path = new Path();
path.moveTo(50, 0);
path.lineTo(0, 50);
path.lineTo(50, 100);
path.lineTo(100, 50);
path.close();
/*path也是参数,设置图6路径*/
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));
/* RoundRectShape画边框
* 其中三个参数在上面设置过分别用来
* 四个角内矩形 左上、右上、右下、左下 圆角半径 ,
* 内矩形距外矩形,左上角x,y距离, 右下角x,y距离
* 外矩形 左上、右上、右下、左下 圆角半径 */
mDrawables[4] = new ShapeDrawable(new RoundRectShape(outerR, inset,
innerR));
mDrawables[5] = new ShapeDrawable(new PathShape(path, 100, 100));
/*PathShape
以Path路径对象,来设定图形。
PathShape的构造函数:
PathShape(path, stdWidth, stdHeight);
stdWidth:标准宽度
stdHeight:标准高度*/
mDrawables[6] = new MyShapeDrawable(new ArcShape(45, -270));
/*ARCShape画出扇形 两个参数分别是起始和扫描角度*/
/*ShapeDrawable是对普通图形的包装*/
mDrawables[0].getPaint().setColor(0xFFFFFF00);
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());
//将6个图形进行包装成一个类,设置颜色,填充物等,传送到一个数组中。
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(5);
//最后一个图形:类型转换,然后setStrokeWidth设置边框宽度。
}
@Override protected void onDraw(Canvas canvas) {
/*这个函数用for循环来设置几个图形的长宽高和位置*/
int x = 100;
int y = 100;
int width = 100;
int height = 100;
for (Drawable dr : mDrawables) {
dr.setBounds(x , y, x + width, y + height);
dr.draw(canvas);
y += height + 5;
}
}
}
}
这就是这几个图形的最终效果