为了提高自己的开发水平,就想系统地学习一下Android自定义控件。首先呢就要从Paint和canvas学起了,与本文主题相关的有关于canvas的画线:
canvas.drawLine(300, 300, 500, 600, mPaint);
canvas的位移:
canvas.translate(100,500);
canvas的旋转:
canvas.rotate(36);
设计思路呢也很简单,五角星的每个尖角都是36°,所以呢通过画一条水平线,通过位移和旋转的位置变化,重复画出五条线,这五条线恰好能够组成一个五角星。效果图:
下面看一下具体的代码实现:
public class SloopView extends View{
//创建画笔
private Paint mPaint = new Paint();
private Paint mPaint2 = new Paint();
public SloopView(Context context) {
this(context,null,0);
}
public SloopView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs,0);
}
public SloopView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initPaint();
}
private void initPaint() {
mPaint.setColor(Color.BLACK);
mPaint.setStyle(Paint.Style.FILL);
mPaint.setStrokeWidth(10f);
mPaint2.setColor(Color.YELLOW);
mPaint2.setStyle(Paint.Style.FILL);
mPaint2.setStrokeWidth(10f);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int widthsize = MeasureSpec.getSize(widthMeasureSpec); //取出宽度的确切数值
int widthmode = MeasureSpec.getMode(widthMeasureSpec); //取出宽度的测量模式
int heightsize = MeasureSpec.getSize(heightMeasureSpec); //取出高度的确切数值
int heightmode = MeasureSpec.getMode(heightMeasureSpec); //取出高度的测量模式
int height = 0;
switch (heightmode){
case MeasureSpec.AT_MOST:
break;
case MeasureSpec.EXACTLY:
case MeasureSpec.UNSPECIFIED:
break;
}
setMeasuredDimension(widthsize, heightsize);
}
@Override
protected void onDraw(Canvas canvas) {
//画点
// canvas.drawPoint(200, 200, mPaint);
// canvas.drawPoints(new float[]{
// 500,500,500,600,500,700
// },mPaint);
//画线
// canvas.drawLine(300, 300, 500, 600, mPaint);
// canvas.drawLines(new float[]{
// 100,200,110,200,
// 120,200,130,200,
// 140,200,150,200,
// 160,200,170,200,
// 180,200,190,200,
// 200,200,210,200
// },mPaint);
//画矩形,三种画法
// canvas.drawRect(100,100,800,400,mPaint);
//
// Rect rect = new Rect(100,500,800,800);
// canvas.drawRect(rect,mPaint);
//
// RectF rectF = new RectF(100,900,800,1200);
// canvas.drawRect(rectF,mPaint);
//画圆角矩形
// RectF rectF = new RectF(100, 100, 800, 400);
// canvas.drawRoundRect(rectF, 30, 30, mPaint);
//
// if (Build.VERSION.SDK_INT>=21){
// canvas.drawRoundRect(100,500,800,800,30,30,mPaint);
// }
//画椭圆
// RectF rectF = new RectF(100,100,800,400);
// canvas.drawRect(rectF,mPaint2);
// canvas.drawOval(rectF,mPaint);
//
// if (Build.VERSION.SDK_INT>=21) {
// canvas.drawOval(100, 500, 800, 800, mPaint);
// }
//画圆
// canvas.drawCircle(500, 500, 400, mPaint);
// //画圆弧(非正圆)
// RectF rectF = new RectF(100, 100, 800, 400);
// //绘制背影矩形
// canvas.drawRect(rectF,mPaint2);
//
// //绘制圆弧,不使用中心点
// mPaint.setColor(Color.BLUE);
// canvas.drawArc(rectF, 0, 90, false, mPaint);
//
// //绘制圆弧,并使用中心点
// RectF rectF1 = new RectF(100,600,800,900);
// //绘制矩形背景
// canvas.drawRect(rectF1,mPaint2);
//
// //绘制圆弧
// canvas.drawArc(rectF1, 0, 90, true, mPaint);
//画圆弧(正圆)
// RectF rectF = new RectF(100, 100, 400, 400);
// //绘制背影矩形
// canvas.drawRect(rectF,mPaint2);
//
// //绘制圆弧,不使用中心点
// mPaint.setColor(Color.BLUE);
// canvas.drawArc(rectF, 0, 90, false, mPaint);
//
// //绘制圆弧,并使用中心点
// RectF rectF1 = new RectF(100, 600, 400, 900);
// //绘制矩形背景
// canvas.drawRect(rectF1,mPaint2);
//
// //绘制圆弧
// canvas.drawArc(rectF1, 0, 90, true, mPaint);
//绘制五角星图案
canvas.drawLine(100, 500, 700, 500, mPaint);
canvas.translate(100,500);
canvas.rotate(36);
canvas.drawLine(0, 0, 600, 0, mPaint);
canvas.translate(600,0);
canvas.rotate(36);
canvas.drawLine(0, 0, -600, 0, mPaint);
canvas.translate(-600, 0);
canvas.rotate(36);
canvas.drawLine(0, 0, 600, 0, mPaint);
canvas.translate(600, 0);
canvas.rotate(36);
canvas.drawLine(0, 0, -600, 0, mPaint);
}
}
这个也是通过自定义view的形式实现的,具体的源码请点这里。
转载本文请注明出处;