安卓五子棋繪制

直接上圖,看結(jié)果,很簡(jiǎn)潔,一個(gè)棋盤(pán)和若干的黑白子。

首先我們要建立我們的棋盤(pán)和棋子,這就需要我們自己建立我們的棋盤(pán)View。
如果有人不理解什么是自定義VIew的話(huà),點(diǎn)這里。
好,我么來(lái)分析一下這個(gè)自定義View中的需要什么吧,首先是一個(gè)棋盤(pán),多少乘多少的看個(gè)人愛(ài)好,然后就是棋子,黑子,白子。很簡(jiǎn)單的兩部分。
要自定義View就是實(shí)現(xiàn)onDraw()方法。實(shí)現(xiàn)ondraw()就需要有畫(huà)筆。
我們?cè)?構(gòu)造函數(shù)里 構(gòu)造出我們的畫(huà)筆。
// 設(shè)置畫(huà)筆的屬性
mPaint = new Paint();
mPaint.setStrokeWidth(5);
mPaint.setStyle(Style.STROKE);
mPaint.setAntiAlias(true);
有了畫(huà)筆那就開(kāi)始畫(huà)吧,有人會(huì)問(wèn),從來(lái)哪里開(kāi)始畫(huà)啊,我們就開(kāi)始畫(huà)橫線(xiàn)和豎線(xiàn),這一步很簡(jiǎn)單吧,canvas.drawLine()方法想畫(huà)多少就畫(huà)多少。下面是準(zhǔn)備工作:
1、獲取屏幕的寬和高。private int screen_width, screen_height;
2、設(shè)定我們棋盤(pán)的單個(gè)單元格的寬度(正方形) 屏幕寬/單元格行數(shù) 即 lineWidth = screen_width / lineNum;
3、設(shè)定棋子的大小 piece_width = lineWidth / 4 * 3; 比棋單元格略小
這樣我們就可以以(lineWidth,lineWidth)為坐標(biāo)原點(diǎn)去畫(huà)我們棋盤(pán)
畫(huà)行
for (int i = 0; i < lineNum - 1; i++) {
canvas.drawLine(lineWidth, lineWidth * (i + 1), screen_width- lineWidth, lineWidth * (i + 1), mPaint);
}
畫(huà)列
for (int i = 0; i < lineNum - 1; i++) {
canvas.drawLine(lineWidth * (i + 1), lineWidth,
lineWidth * (i + 1), screen_width - lineWidth, mPaint);
}
這樣我們就把棋盤(pán)畫(huà)好了。
畫(huà)好棋盤(pán)接下來(lái)就是棋子了
重寫(xiě)onTouchEvent(MotionEvent event)方法我們可以獲取手指點(diǎn)擊的坐標(biāo)即(event.getX(),event.getY())。我們先不要考略落下的點(diǎn)是否在棋盤(pán)的兩線(xiàn)之間,把每一次手指的落點(diǎn)作為棋子的落點(diǎn),那么我們可以這么寫(xiě)
float x = event.getX();
float y = event.getY();
canvas.drawBitmap(bitmap_piece, x,y, mPaint);
接下來(lái)就是我們棋子的落點(diǎn)必須是正規(guī)的,不能隨便向往那里落,就往哪里落。那么我們就要對(duì)我們的落點(diǎn)就行計(jì)算了。
落點(diǎn) (x,y)x/lineWidth 這就得到是(單元格寬)列寬的幾倍,0,1,2,3·····同理y也是,這樣我們就得到了棋子的真正要落下的點(diǎn)數(shù)。如果為(0,0)那么他就會(huì)以(lineWidth,n
*lineWidth)為原點(diǎn)去畫(huà)這個(gè)棋子,可是我們需要的棋子的圓心落在兩條線(xiàn)的交點(diǎn)處,那么我們就讓棋子左移棋子的半徑上移他的半徑,這樣就正好落到了交點(diǎn)。
這樣我們的棋子棋盤(pán)就繪畫(huà)完成。只是沒(méi)有規(guī)則。規(guī)則控制我們放在下一篇。
接下來(lái)直接上代碼

public class MyView1 extends View {
/** * 默認(rèn) 如果先手 是 1 那么就是 黑子 先下 /
private int code = 1;
/
* * 畫(huà)筆 /private Paint mPaint;private int lineNum = 10;
/
* * 記錄 是否落子狀態(tài) /
private int[][] pieces_state;private int screen_width, screen_height;
private Context context;
/
* * 每行的寬度 /
private int lineWidth;
/
* * 棋子的寬度 /
private int piece_width;
/
* * 存儲(chǔ) 棋子的容器 */
private ArrayListlist_pieces;
Bitmap black_piece, white_piece, space_piece;
MyView1(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
this.context = context;
// 設(shè)置畫(huà)筆的屬性mPaint = new Paint();mPaint.setStrokeWidth(5);
mPaint.setStyle(Style.STROKE);
mPaint.setAntiAlias(true);screen_height = ScreenUtils.getScreenHeight(context);screen_width = ScreenUtils.getScreenWidth(context);
lineWidth = screen_width / lineNum;
piece_width = lineWidth / 4 * 3;list_pieces = new ArrayList();
black_piece = BitmapFactory.decodeResource(getResources(),
R.drawable.stone_b2);
space_piece = BitmapFactory.decodeResource(getResources(),
R.drawable.stone_space);
black_piece = Bitmap.createScaledBitmap(black_piece, piece_width,
piece_width, false);
white_piece = BitmapFactory.decodeResource(getResources(),
R.drawable.stone_w2);
white_piece = Bitmap.createScaledBitmap(white_piece, piece_width,
piece_width, false);
space_piece = Bitmap.createScaledBitmap(space_piece, piece_width,
piece_width, false);
pieces_state = new int[lineNum][lineNum];
}
public MyView1(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public MyView1(Context context) {
this(context, null);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 畫(huà)橫線(xiàn)
for (int i = 0; i < lineNum - 1; i++) {
canvas.drawLine(lineWidth, lineWidth * (i + 1), screen_width

  • lineWidth, lineWidth * (i + 1), mPaint);
    }
    // 畫(huà)豎線(xiàn)
    for (int i = 0; i < lineNum - 1; i++) {
    canvas.drawLine(lineWidth * (i + 1), lineWidth,
    lineWidth * (i + 1), screen_width - lineWidth, mPaint);
    }
    // 畫(huà)棋子 可以建一個(gè)線(xiàn)程專(zhuān)門(mén)用于 刷新
    for (int i = 0; i < list_pieces.size(); i++) {
    Piece piece = list_pieces.get(i);
    if (piece.code == -1) {
    canvas.drawBitmap(white_piece, piece.x * lineWidth
  • piece_width / 2, piece.y * lineWidth - piece_width
    / 2, mPaint);
    } else {
    canvas.drawBitmap(black_piece, piece.x * lineWidth
  • piece_width / 2, piece.y * lineWidth - piece_width
    / 2, mPaint);
    }
    }
    }
    @Override
    public boolean onTouchEvent(MotionEvent event) {
    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN:
    break;
    case MotionEvent.ACTION_UP:
    float x = event.getX();
    float y = event.getY();
    if (x < lineWidth || x > screen_width - lineWidth / 2
    || y < lineWidth || y > screen_width - lineWidth / 2) {
    } else {
    Piece point = getRealPoint(code, x, y);
    if (point == null) {
    } else {
    code = -code;
    list_pieces.add(point);
    }
    }
    Vibrator vib = (Vibrator) context
    .getSystemService(Service.VIBRATOR_SERVICE);
    vib.vibrate(50);
    break;
    }
    invalidate();
    return true;
    }
    public Piece getRealPoint(int code, float x, float y) {
    int p_x = (int) (x / lineWidth);
    int p_y = (int) (y / lineWidth);
    if (pieces_state[p_x][p_y] == 0) {
    pieces_state[p_x][p_y] = code;
    } else {
    return null;
    }
    Piece piece = new Piece(code, p_x, p_y);
    return piece;
    }
    public boolean isSucces() {
    return false;
    }
    @Override
    protected Parcelable onSaveInstanceState() {
    // TODO Auto-generated method stub
    return super.onSaveInstanceState();
    }
    @Override
    protected void onRestoreInstanceState(Parcelable state) {
    // TODO Auto-generated method stub
    super.onRestoreInstanceState(state);
    }
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    int widthSize = MeasureSpec.getSize(widthMeasureSpec);
    int heightSize = MeasureSpec.getSize(heightMeasureSpec);
    int width = Math.min(widthSize, heightSize);
    setMeasuredDimension(width, width);
    }
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容