本次要練習的是自定義控制項,並不是數學邏輯 ,所以主要的目的就是繪製棋盤。養的貓咪跑丟了 鬱悶ing….
首先看看效果圖,然後分析一下。
首先,背景圖 這個交給父容器
然後棋盤,可以分為兩部分,第一是線、 第二是棋子。
分析:
想要知道長和寬當中最小的那一方,前提是知道長和寬,獲取長和寬的方法
那麼獲取寬高可以這樣:
onmeasure方法中:
int width_size = measurespec.getsize(widthmeasurespec);
int height_size = measurespec.getsize(heightmeasurespec);
log.e("asd", getmeasuredwidth() + "****" + getmeasuredheight());
log.e("asd", getwidth() + "++++" + getheight());
log.e("asd", width_size + "----" + height_size);
可是,這三個哪個是裝置寬高、哪個是獲取控制項寬高呢?於是我測了一下:
.myview2.myview
android:layout_width="100dp"
android:layout_height="100px" />
06-28
20:57:55.872
13720-13720/sunshine.myview2 e/asd: 0,0
06-28
20:57:55.872
13720-13720/sunshine.myview2 e/asd: 0,0
06-28
20:57:55.912
13720-13720/sunshine.myview2 e/asd: 0****0
06-28
20:57:55.912
13720-13720/sunshine.myview2 e/asd: 0++++0
06-28
20:57:55.912
13720-13720/sunshine.myview2 e/asd: 200----1118
06-28
20:57:55.912
13720-13720/sunshine.myview2 e/asd: 200****1118
06-28
20:57:55.912
13720-13720/sunshine.myview2 e/asd: 0++++0
06-28
20:57:55.912
13720-13720/sunshine.myview2 e/asd: 200----100
06-28
20:57:56.116
13720-13720/sunshine.myview2 e/asd: 200****100
06-28
20:57:56.116
13720-13720/sunshine.myview2 e/asd: 200++++100
06-28
20:57:56.116
13720-13720/sunshine.myview2 e/asd: 200----1118
06-28
20:57:56.116
13720-13720/sunshine.myview2 e/asd: 200****1118
06-28
20:57:56.116
13720-13720/sunshine.myview2 e/asd: 200++++100
06-28
20:57:56.116
13720-13720/sunshine.myview2 e/asd: 200----100
開啟程式時候控制項是會不斷測量的(都這麼說我也就當成定理了),應該看最後測量的結果。
getmeasuredwidth()獲取的是200,getmeasuredheight()獲取的是1118.
getwidth()獲取的是200,getheight()獲取的是100.
width_size是200,height_size是100.
獲取到100的肯定都是畫素了,獲取到200應該是由於螢幕密度的原因,由dp轉化為px時候是1:2的關係了,也就都是獲取本控制項的大小(px)。
1118是什麼鬼呢,為啥前面是200,後面是1118!!!???
上網查了一下資料 覺得這裡說的很好這裡就不費時間了,主要內容如下:
①getmeasuredwidth方法獲得的值是setmeasureddimension方法設定的值,它的值在measure方法執行後就會確定取兩者中最小的作為矩形的邊後(minwidth),我們發現還有個距離裝置邊框那邊距的問題(相對於控制項是margin),我們將邊距預留為乙份棋盤格仔的minwidth,左右各1/2minwidth,也就是說我們畫線的時候要預留1/2minwidth的邊距。②getwidth方法獲得是layout方法中傳遞的四個引數中的mright-mleft,它的值是在layout方法執行後確定的
③一般情況下在onlayout方法中使用getmeasuredwidth方法,而在除onlayout方法之外的地方用getwidth方法。
畫線**(注意線的起點和重點,重複了就畫不出來了 =.= 由於不熟練,折騰了一番才出來):
@override
protected
void
ondraw(canvas canvas)
}
費了一番力氣的效果圖(畫筆設定如下):
ok,下一步就是棋子了,要想顯示棋子首先得先載入棋子,載入時候要先設定棋子大小,棋子大小要在onsizechanged中設定(為什麼呢,看方法名就能理解差不多了吧 - . - ),設定大小是用bitmap.createscaledbitmap方法,一開始我寫錯成bitmap.createbitmap了
createscaledbitmap(bitmap src, int dstwidth, int dstheight,boolean filter)後來去看了下才知道bitmap.createscaledbitmap也是呼叫的bitmap.createbitmap方法。createbitmap(bitmap source, int x, int y, int width, int height,matrix m, boolean filter)
載入完之後就要顯示出來啊,那怎麼顯示出來呢,肯定是觸發了之後顯示,那怎麼觸發呢,肯定找我們ontouchevent(motionevent event)方法啊…..
@override
public boolean ontouchevent(motionevent event)
if (event.getaction() == motionevent.action_up)
return super.ontouchevent(event);
}
重繪後再ondraw中畫出棋子就ok了
for (int i = 0; i < points.size(); i++)
看下最後的「成果」
下五子棋的bot 五子棋演算法
include include include include include include jsoncpp json.h c 編譯時預設包含此庫 define n 7 每個節點的分支數 以下為各棋型的識別碼 權重 define win 1 4000 define lose 2 4000 defi...
窮舉五子棋
本想窮舉五子棋必勝點,可惜呀,這貨窮舉太不現實了,寫出來了,根本沒辦法執行出來結果 include include include define rl 17 char s 14 int five rl rl void init void void print void int cs int i,in...
普通 五子棋
五子棋 五子棋是世界智力運動會競技專案之一,是一種兩人對弈的純策略型棋類遊戲,是世界智力運動會競技專案之一,通常雙方分別使用黑白兩色的棋子,下在棋盤直線與橫線的交叉點上,先形成5子連線者獲勝。棋具與圍棋通用,起源於中國上古時代的傳統黑白棋種之一。主要流行於華人和漢字文化圈的國家以及歐美一些地區,是世...