首先介绍Paint和Canvas类的用法:
Paint:就是一个画笔,使用之前首先要调整好画笔,然后就可以在画布上绘图了,这样就可以显示在手机屏幕上。
主要方法有:setColor() 设置画笔的颜色
setTextSize() 设置字体大小
setStyle() 设置画笔的风格,空心还是实心
setStrokWidth() 设置空心的边框宽度
setTextAlign() 设置文字的对齐方式
setTypeface() 设置字体,如粗细、倾斜
在设置画笔颜色的时候,使用到了Color类,这个类定义了一些颜色常量和颜色转换。如Color.RED、Color.GRENN等,还可以通过Color类的静态方法rgb(int,int,int)
来定一个颜色,这三个参数的的值范围是0~255。
Canvas:是一个画布,可以在上面画我们想要的任何东西,我们也可以设置画布的一些的属性,比如背景颜色,尺寸等。Canvas提供了一下一些方法:
方法:Canvas(),创建一个空的画布,可以使用setBitmap()方法来设置绘制的具体画布;
Canvas(Bitmap bitmap),以bitmap对象创建一个画布,此时则将内容绘制在bitmap上,bitmap不得为null.
drawColor(),设置画布的背景颜色。
drawRect(left,top,right,bottom,paint);画矩形,前四个是float,后一个是Paint类型。
drawLine(startX,startY,stopX,stopY,paint),画线,前四个参数是float,后一个是Paint类型。
drawText(text,x,y,paint);在画布上画指定的文本,x,y两个参数是float,后一个是Paint类型。
*********************************看下面的代码****************************************
/*空矩形*/
Paint paintRect = new Paint();
paintRect.setColor(Color.rgb(79, 129, 189));
paintRect.setStrokeWidth(2);
paintRect.setStyle(Style.STROKE);
canvas.drawRect(20.0,20.0,100.0,100.0, paintRect);
/*实矩形*/
Paint paintRect = new Paint();
paintRect.setColor(Color.rgb(79, 129, 189));
paintRect.setStrokeWidth(2);
paintRect.setStyle(Style.STROKE);
canvas.drawRect(20.0,20.0,100.0,100.0, paintRect);
/*画直线*/
Paint paintRect = new Paint();
paintRect.setColor(Color.rgb(79, 129, 189));
paintRect.setStrokeWidth(1);
paintRect.setStyle(Style.STROKE);
canvas.drawLine(10.0,80.0,100.0,80.0, paintRect);
/*画字*/
Paint paint = new Paint();
paint.setColor(Color.rgb(79, 129, 189));
paint.setStyle(Style.STROKE);
paint.setTextAlign(Align.CENTER);//字水平居中
// FontMetrics fontMetrics = paint.getFontMetrics();计算字的高度
canvas.drawText(text ,20.0,40.0, paint);
***********画表格******************
public class TableView extends View {
// 表格的行数和列数
private int row, col;
// 表格定位的左上角X和右上角Y
private final static int STARTX = 25;
private final static int STARTY = 25;
// 表格的宽度
private static float gridWidth;
private static float gridHeight;
public TableView(Context context, int row, int col) {
super(context);
this.row = row;
this.col = col;
if (this.row == 0 || this.col == 0) {
assert false : "行数和列数为0,不符合";
}
this.setFocusable(true);
this.setFocusableInTouchMode(true);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
gridWidth = (w - 50) / (this.col * 1.0f);
if (this.row > this.col) {
gridHeight = (h - 100) / (this.row * 1.0f);
} else {
gridHeight = gridWidth;
}
super.onSizeChanged(w, h, oldw, oldh);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 填充表格颜色
Paint paintColor = new Paint();
paintColor.setStyle(Style.FILL);
paintColor.setColor(Color.rgb(235, 241, 221));
canvas.drawRect(STARTX, STARTY, STARTX + gridWidth * this.col, STARTY
+ gridHeight * this.row, paintColor);
paintColor.setColor(Color.rgb(219, 238, 243));
for (int i = 0; i < this.row; i++) {
if ((i + 1) % 2 == 1) {
canvas.drawRect(STARTX, i * gridHeight + STARTY, STARTX
+ this.col * gridWidth, STARTY + (i + 1) * gridHeight,
paintColor);
}
}
// 画表格最外层边框
Paint paintRect = new Paint();
paintRect.setColor(Color.rgb(79, 129, 189));
paintRect.setStrokeWidth(2);
paintRect.setStyle(Style.STROKE);
canvas.drawRect(STARTX, STARTY, STARTX + gridWidth * this.col, STARTY
+ gridHeight * this.row, paintRect);
// 画表格的行和列,先画行后画列
paintRect.setStrokeWidth(1);
for (int i = 0; i < this.row - 1; i++) {
canvas.drawLine(STARTX, STARTY + (i + 1) * gridHeight, STARTX
+ this.col * gridWidth, STARTY + (i + 1) * gridHeight,
paintRect);
}
for (int j = 0; j < this.col - 1; j++) {
canvas.drawLine(STARTX + (j + 1) * gridWidth, STARTY, STARTX
+ (j + 1) * gridWidth, STARTY + this.row * gridHeight,
paintRect);
}
// 在单元格填充数字—如果行数大于60并且列数大于30,就不显示数字;大于10,就改变字大小
if (this.row <= 50 && this.col <= 30) {
Paint paint = new Paint();
paint.setColor(Color.rgb(79, 129, 189));
paint.setStyle(Style.STROKE);
paint.setTextAlign(Align.CENTER);
if (this.row > 40 || this.col > 25) {
paint.setTextSize(7);
} else if (this.row > 30 || this.col > 20) {
paint.setTextSize(8);
} else if (this.row > 20 || this.col > 15) {
paint.setTextSize(9);
} else if (this.row > 10 || this.col > 10) {
paint.setTextSize(10);
}
FontMetrics fontMetrics = paint.getFontMetrics();
float fontHeight = fontMetrics.bottom - fontMetrics.top;
int text = 0;
for (int i = 0; i < this.row; i++) {
for (int j = 0; j < this.col; j++) {
float mLeft = j * gridWidth + STARTX;
float mTop = i * gridHeight + STARTY;
float mRight = mLeft + gridWidth;
text++;
float textBaseY = (int) (gridHeight + fontHeight) >> 1;
canvas.drawText(text + "", (int) (mLeft + mRight) >> 1,
textBaseY + mTop, paint);
}
}
}
}
}
-----------------------------------------------------------------------------------------------------------------
在写以上代码的时候,出现了代码执行效率的问题。比如上面代码中,除法运算如果不使用移位运算而使用BigDecimal大数字运算,那么生成表格的速度就非常的慢,
而使用移位运算速度就快了好几倍。所以在写代码的时候,不仅仅是代码写出来了达到这个效果就可以了,还要考虑效率问题,让我们写的代码在执行的时候,用的时间最短。