Android 自定義控件基礎-五子棋

??在這里說一下啊,我的所有文章都是根據(jù)看慕課上的視頻寫出來的眼滤,所以都不是原創(chuàng)的巴席,因為能力不夠。诅需。漾唉。。
??今天我在這里記一下诱担,五子棋的編寫方法毡证,歸根結底還是要到自定義View里面去。



??上面是一張我完成過后的截圖蔫仙,要完成這個功能料睛,必不可少的就是自定義控件。在此過程摇邦,我最主要的是要學習自定義控件的方法恤煞。

1.布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    tools:context="com.example.android_wuziqi.MainActivity">
    <com.example.android_wuziqi.WuziqiView
        android:id="@+id/id_wuziqiView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#44ff"
        />
</LinearLayout>

2.在自定義View當中,測量棋盤的大小

@Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        int widthSize = MeasureSpec.getSize(widthMeasureSpec);
        int widthMode = MeasureSpec.getMode(widthMeasureSpec);
        int heightSize = MeasureSpec.getSize(heightMeasureSpec);
        int heightMode = MeasureSpec.getMode(heightMeasureSpec);

        if (widthMode == MeasureSpec.UNSPECIFIED) {
            widthSize = heightSize;
        } else if (heightMeasureSpec == MeasureSpec.UNSPECIFIED) {
            heightSize = widthSize;
        }
        int width = Math.min(widthSize, heightSize);
        setMeasuredDimension(width, width);
    }

??上面的代碼要注意的是:當我們父布局使用ScrollView時施籍,會發(fā)現(xiàn)有時候子空間取不到寬或者是高居扒,那是因為子控件的測量模式是UNSPECIFIED,因此在測量的時候丑慎,我們要考慮到這個問題喜喂。

3.在onSizechanged方法里面取得棋盤上每兩條邊之間的距離

@Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        mLineHeight = (int) (w * 1.0f / MAX_LINE_COUNT);
        int scaleWidth = (int) (mLineHeight * mRadioPieceOfLineHeight);


        mBlackPiece = Bitmap.createScaledBitmap(mBlackPiece, scaleWidth, scaleWidth, false);
        mWhitePiece = Bitmap.createScaledBitmap(mWhitePiece, scaleWidth, scaleWidth, false);
    }

??Bitmap.createScaledBitmap主要是用來縮放bitmap的,因為棋子的大小由棋盤的邊之間的距離來決定竿裂。

4.繪制棋盤

private void drawBorad(Canvas canvas) {
        int width = getMeasuredWidth();
        for (int i = 0; i < MAX_LINE_COUNT; i++) {
            float startX = (mLineHeight * 1.0f / 2);
            float startY = (mLineHeight * 1.0f / 2) + mLineHeight * i;
            float endX = (width - mLineHeight * 1.0f / 2);
            float endY = mLineHeight / 2 + mLineHeight * i;

            canvas.drawLine(startX, startY, endX, endY, mPaintLine);
            canvas.drawLine(startY, startX, endY, endX, mPaintLine);
        }
    }

5.設置onTouchEvent事件

??在設置之前玉吁,先考慮一下,下棋的事件是定在DOWN還是UP里面腻异,具體原因我也不想去解釋进副,我在這里設置UP里面,因為教學視頻里面也是這樣的悔常,而我覺得挺不錯的影斑。

public boolean onTouchEvent(MotionEvent event) {
        if(mIsGameOver)
        {
            return  false;
        }
        switch (event.getAction()) {
            case MotionEvent.ACTION_UP: {
                int x = (int) event.getX();
                int y = (int) event.getY();
                Point point = getLeglaPoint(x, y);
                if (mBlackArray.contains(point) || mWhiteArray.contains(point)) {
                    return false;
                }
                if (mIsWhite) {
                    mWhiteArray.add(point);
                } else {
                    mBlackArray.add(point);
                }
                invalidate();
                mIsWhite = !mIsWhite;
                return true;
            }
        }
        return true;
    }
private Point getLeglaPoint(int x, int y) {
      return new Point(x / mLineHeight, y / mLineHeight);
}

??這里注意一點的就是:當我們在某一個地方已經(jīng)下了棋子了给赞,如果再次點擊一次的話,不能將前面的棋子覆蓋了矫户。因此我們在這里必須有一個判斷片迅,那就是我們點擊的地方的是否有棋子。這里不是直接通過x和y來判斷的皆辽,因為每次點擊同一個地方障涯,x和y有一定的偏差。我們這里使用有x和y來整除邊之間的距離膳汪,這樣即使有偏差唯蝶,也是被忽略的。

6.畫棋子

private void drawPiece(Canvas canvas) {
        for (int i = 0; i < mBlackArray.size(); i++) {
            Point point = mBlackArray.get(i);
            canvas.drawBitmap(mBlackPiece, (point.x + (1 - mRadioPieceOfLineHeight) / 2) * mLineHeight, (point.y + (1 - mRadioPieceOfLineHeight) / 2) * mLineHeight, mPaintBitmap);
        }
        for (int i = 0; i < mWhiteArray.size(); i++) {
            Point point = mWhiteArray.get(i);
            canvas.drawBitmap(mWhitePiece, (point.x + (1 - mRadioPieceOfLineHeight) / 2) * mLineHeight, (point.y + (1 - mRadioPieceOfLineHeight) / 2) * mLineHeight, mPaintBitmap);
        }
    }
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末遗嗽,一起剝皮案震驚了整個濱河市粘我,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌痹换,老刑警劉巖征字,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異娇豫,居然都是意外死亡匙姜,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進店門冯痢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來氮昧,“玉大人,你說我怎么就攤上這事浦楣⌒浞剩” “怎么了?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵振劳,是天一觀的道長椎组。 經(jīng)常有香客問我,道長历恐,這世上最難降的妖魔是什么寸癌? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮弱贼,結果婚禮上蒸苇,老公的妹妹穿的比我還像新娘。我一直安慰自己哮洽,他們只是感情好填渠,可當我...
    茶點故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布弦聂。 她就那樣靜靜地躺著鸟辅,像睡著了一般氛什。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上匪凉,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天枪眉,我揣著相機與錄音,去河邊找鬼再层。 笑死贸铜,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的聂受。 我是一名探鬼主播蒿秦,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蛋济!你這毒婦竟也來了棍鳖?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤碗旅,失蹤者是張志新(化名)和其女友劉穎渡处,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體祟辟,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡医瘫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了旧困。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片醇份。...
    茶點故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖吼具,靈堂內(nèi)的尸體忽然破棺而出被芳,到底是詐尸還是另有隱情,我是刑警寧澤馍悟,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布畔濒,位于F島的核電站,受9級特大地震影響锣咒,放射性物質發(fā)生泄漏侵状。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一毅整、第九天 我趴在偏房一處隱蔽的房頂上張望趣兄。 院中可真熱鬧,春花似錦悼嫉、人聲如沸艇潭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蹋凝。三九已至鲁纠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鳍寂,已是汗流浹背改含。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留迄汛,地道東北人捍壤。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像鞍爱,于是被迫代替她去往敵國和親鹃觉。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,440評論 2 359

推薦閱讀更多精彩內(nèi)容