一段可以自适应宽高的简易棋盘(五条横线,五条纵线)代码;
public class CheckerBoard extends GridView
{
//声明棋盘控件宽度
private int mBoardWidth;
//声明棋盘中线的间距
private float mLineSpace;
//声明棋盘中线的个数
private int MAX_LINE=5;
//声明绘制棋盘的笔
private Paint mPaint=new Paint();
//声明棋盘中棋子的大小比例
private float ratioPieceOfHeight=3*1.0f/4;
//声明棋子宽度
private int pieceWidth;
public CheckerBoard(Context context)
{
super(context);
}
public CheckerBoard(Context context, AttributeSet attrs)
{
super(context, attrs);
init();
}
//初始化操作
private void init()
{
//设置画笔属性
mPaint.setColor(0X88000000);
mPaint.setAntiAlias(true);
mPaint.setDither(true);
mPaint.setStyle(Paint.Style.STROKE);
}
public CheckerBoard(Context context, AttributeSet attrs, int defStyle)
{
super(context, attrs, defStyle);
setBackgroundColor(0x44ff0000);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
//获得当前控件宽高(xml文件中定义的宽高皆为match)
int widthSize=MeasureSpec.getSize(widthMeasureSpec);
int heightSize=MeasureSpec.getSize(heightMeasureSpec);
//获得控件宽高模式
int widthMode=MeasureSpec.getMode(widthMeasureSpec);
int heightMode=MeasureSpec.getMode(heightMeasureSpec);
//取得宽高最小值
int width=Math.min(widthSize, heightSize);
//如果原宽度未规定设定宽度为
if (widthMode==MeasureSpec.UNSPECIFIED)
{
width=widthSize;
}
else if (heightMode==MeasureSpec.UNSPECIFIED)
{
width=heightSize;
}
//为控件设置宽和高
setMeasuredDimension(width, width);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
mBoardWidth=w;
mLineSpace=mBoardWidth*1.0f/MAX_LINE;
//得到棋子宽度
pieceWidth=(int) (mLineSpace*ratioPieceOfHeight);
setNumColumns(MAX_LINE);
}
//构建一个可以得到棋子宽度的方法
public int getPieceWdth(){
return pieceWidth;
}
@Override
protected void onDraw(Canvas canvas)
{
super.onDraw(canvas);
//绘制棋盘的方法
drawBoard(canvas);
}
private void drawBoard(Canvas canvas) {
int width=mBoardWidth;
float lineSpace=mLineSpace;
for (int i = 0; i < MAX_LINE; i++) {
//获得横线横坐标起点终点(纵线起点终点)
int startX=(int)(lineSpace/2);
int stopX=(int)(width-lineSpace/2);
//获得横线纵坐标(纵线横坐标)
int y=(int)((0.5+i)*lineSpace);
//绘制棋盘横线
canvas.drawLine(startX, y, stopX, y, mPaint);
//绘制棋盘纵线
canvas.drawLine(y, startX, y, stopX, mPaint);
}
}
}