

李明杰(MJ)高級講師
多年軟件開發(fā)經驗和教學經驗,尤其精通Android和iOS平臺的開發(fā),還開發(fā)了2個iOS的流行開源框架(MJRefresh、MJExtension), 目前在國內的使用率非常高。
李老師曾負責主導開發(fā)過裝飾ERP系統(tǒng)手機端、服裝連鎖管理系統(tǒng)手機及平板客戶端、自動雞尾酒調酒機系統(tǒng)、網絡斗地主RPG、游戲 引擎等。曾以架構師及技術總監(jiān)的角色幫客戶成功獲得多家風投,并上了中央電視臺《給你一個億》節(jié)目。除了Android和iOS平臺,李老師也深入研究 HTML5、phoneGap、Sencha-Touch、Less、Bootstrap、AngularJS、NodeJS等前端利器。
2015年8月 CCTV發(fā)現(xiàn)之旅《華商論見》欄目特約嘉賓,受邀參加節(jié)目《互聯(lián)網 浪潮下的創(chuàng)業(yè)之道》,接受央視著名主持人水均益采 訪。2015年10月 曾受邀加入中國經貿代表團隨總理出訪韓國,參與總理訪韓午餐會以及中日韓工商峰會。2015年12月 榮獲中國經濟新模 式創(chuàng)新與發(fā)展峰會“2015中國IT教育培訓行業(yè)**具創(chuàng)新人物”獎。
李老師不但具有豐富的軟件開發(fā)經驗,并且懂得如何把自己掌握的知識及技能傳授給他人,曾給多家企業(yè)提供Android/iOS技術培訓 、技術支持、技術咨詢等服務。李老師的授課視頻深得學生們的喜愛,已培養(yǎng)出好幾千名iOS程序員。
現(xiàn)在學習Java還有前途嗎?
在互聯(lián)網行業(yè),Java工程師是一個技術含量非常高的崗位,支撐了互聯(lián)網行 業(yè)的半壁江山,全世界有一千萬Java程序員,目前還在有更多的計算機愛好者向Java的大門奔來。Java發(fā)展了20多年,關于Java的悲觀論調也不時出現(xiàn) ,現(xiàn)在學Java還有前途嗎?是否已經過了紅利期了呢?
Java作為所有編程語言中熱門技術,可以說它無處不在,目前全球有著數(shù)十 億的設備正在運行著Java,很多服務器程序都是用Java編寫,用以處理每天超過數(shù)以千萬的數(shù)據(jù)。
無論是手機軟件、手機Java游戲還是電腦軟件,每一次購物到每一筆支付成 功,都離不開Java,越來越多的企業(yè)也正采用Java語言開發(fā)網站,而在所有程序員中,Java開發(fā)工程師就占據(jù)了20%的比例。
從國內排名靠前網站的主要開發(fā)語言,也可以看出Java在各大開發(fā)語言中的 地位。淘寶、搜狐、網易等一線互聯(lián)網公司,都在使用Java開發(fā)語言。
這也不難理解,為什么Java現(xiàn)在這么火爆,吸引越來越多的人學習,根本原 因,還是因為企業(yè)對Java的認可和應用。
Java有沒有前途,需要我們認清自己今后應該怎么走自己的路線,是走技術 ,還是走管理。走技術路線:從初級、中級、高級再到軟件架構師。如果說走管理路線:項目經理、部門經理、技術總監(jiān)。只有清楚了自己要走的路線 后,再往決定的那一方面去努力,學習。除此以外,還有一些人學了這一專業(yè)后,從事銷售顧問、培訓講師、自己創(chuàng)業(yè)的都有,關鍵是自己要認識自己 ,自己更適何哪一條路。
所以,先認清“正確的結果”,根據(jù)正確的結果去設計你的過程。當一個人 具有明確的職業(yè)目標時,就會對有助于實現(xiàn)目標的蛛絲馬跡都特別敏感,做事情相應也就會很有目的性,而不是稀里糊涂的。所以,就容易到達自己的 目的。如果沒有職業(yè)目標,腳踩西瓜皮滑到哪里是哪里,學什么技術都沒前途。
在未來的幾年,Java工程師人才的需求還在不斷的加大,由于人才的緊缺, 這個崗位相對于其它專業(yè)薪資待遇還是不錯的,而且Java工程師的待遇是與工作經驗直接掛勾的,當你有了豐富的經驗以后,你在這個行業(yè)里就比較搶 手了,而且企業(yè)所出的薪酬也是相當高的,到時只有你選擇他們了。
Java課程介紹 :
Java企 業(yè)級應用
“就業(yè)班”
一階段 Java語言核心
第二階段 數(shù)據(jù)庫及Web前端技術
第三階段 Java Web開發(fā)及服務端 框架
第四階段 綜合項目實踐
Java課程介紹
Java企業(yè)級應用
“就業(yè)班”
一階段 Java語言核心
二階段 數(shù)據(jù)庫及Web前端技術
三階段 Java Web開發(fā)及服務端框架
四階段 綜合項目實踐
Java互聯(lián)網開發(fā)
“培優(yōu)班”
一階段 Java語言核心
二階段 Java Web服務端技術
三階段 Java Web框架及互聯(lián)網架構
四階段 Java互聯(lián)網架構
職場華麗轉身
“才高班”
大數(shù)據(jù) 互聯(lián)網大牛班
6大實訓項目
“愛逛網”電商后端數(shù)據(jù)平臺
培訓經驗=就業(yè)經驗
“培優(yōu)班”
一階段 Java語言核心
第二階段 Java Web服務端技術
第三階段 Java Web框架及互聯(lián)網架構
第四階段 Java互聯(lián)網架構
職場華麗轉身
“才高班”
大數(shù)據(jù) 互聯(lián)網大牛班
6大實訓項目
“愛逛網”電商后端數(shù)據(jù)平臺
培訓經驗=就業(yè)經驗
duilib各種布局的作用,相對布局與絕對布局的的意義與用法
>
我使用duilib快3個月了,總體感覺duilib的使用還是較為簡單的,只是剛入門時可能有些摸不清頭腦。今天寫一篇關于duilib的入門日志,大致說一下duilib中的各個布局的作用,以及很關鍵的相對布局與絕對布局的意義與用法。希望可以幫到使用duilib的新手朋友們。duilib高手就可以直接省略這篇文章了!
我剛使用duilib的時候非常依賴duilib自帶的設計器,用他可以拖拉控件,可視化的做出自己想要的界面??墒怯靡欢螘r間就會發(fā)現(xiàn)原帶的設計器有很多bug,時不時會崩潰,支持的控件數(shù)量有限,屬性數(shù)量也有限,導出的代碼冗余。當時問了幾個高手,大家建議不要使用設計器而應該自己手寫xml代碼。起初手寫時感覺特別麻煩,可是用幾天后你會發(fā)現(xiàn)手寫要比使用設計器好得多:你可以更加了解duilib,熟悉每個控件的各個屬性,對控件的控制也更加方便。而如果想稱心如意的脫離設計器去編寫xml文件,有非常有必要弄明白各個布局的用法和布局技巧。我現(xiàn)在可以完全靠手寫xml來做出一個程序的界面,相信用了一段duilib的朋友也是這樣。
在這里提醒一下新手朋友,在duilib的根目錄有一個屬性列表.xml的文件,他包含了絕大多數(shù)控件的絕大多數(shù)屬性的介紹,有不懂的屬性記得時常翻看他,同時不得不說這個文件包含的屬性的確是不全面的,想要知道**全面的屬性信息,可以看每個控件的源代碼,在SetAttribute函數(shù)中可以看到**全面的屬性信息!
要想手寫xml,當然必須有一個編寫工具,原則上只要是可以編寫文本的工具都可以,大家根據(jù)習慣自己挑選適合的工具,我目前在使用的是sublime這款工具,感覺編寫xml非常方便,使用界面也不錯。
6大布局的作用:
duilib的Layout目錄專門放置布局相關的容器控件,這6個布局分別為:Container、VerticalLayout、HorizaontalLayout、TileLayout、TabLayout、ChildLayout。容器之間可以任意相互嵌套,我分別說明他們的用法。
首先我要說明一下,下面介紹的時候,我都默認認為每個控件的float屬性為false,也就是不使用絕對定位,這個屬性會打破各個布局的作用。
Container:
Container布局是其他所有布局以及含有容器特性(如CList、CListContainerElement)的控件的基類,而實際上開發(fā)過程中很少使用這個布局,只用他來做其他更高級的布局的基類。因為Container布局中的所有控件都會自動填充滿整個布局,所有的控件都疊到了一起,假如恰好有什么需求要讓子控件都覆蓋起來,而且可以隨著容器的改變而自適應填充的話,Container就是不二之選。而除了這個效果之外,一般我們不使用它。
VerticalLayout、HorizaontalLayout:
VerticalLayout與HorizaontalLayout布局無疑是duilib中**常使用的兩個布局,巧妙的使用這兩個布局可以滿足大多數(shù)的布局需求。從單詞的意思上不難看出VerticalLayout是縱向布局,HorizaontalLayout是橫向布局。這門兩個直接繼承自Container布局。
VerticalLayout布局會讓他包含的元素都縱向排列開,HorizaontalLayout布局會讓給他包含的元素都橫向排列開:如圖
我故意沒讓控件填滿整個容器,為了說明這兩個布局不會強行讓子元素的總和去填滿容器,縱向布局會從上到下根據(jù)每個控件的高度讓他們排到一起,橫向布局會從左到右根據(jù)每個控件的寬度讓他們排到一起。另外可以看到,縱向布局只關心子元素的高度,而不會強行讓子元素的寬度等于容器的寬度,這點從圖片可以看到,橫向布局同理也是只關心子元素的寬度。而這兩個布局經常會嵌套使用,如下效果:
可以看到我**外層使用了一個縱向布局,他包含了橫縱橫三個布局(分別為紅綠藍顏色),每個橫向布局里又分別包含了幾個按鈕。我們在編寫界面時經常用到這個方法!以下是這個布局效果圖對應的xml代碼:
TileLayout:
TileLayout布局是用來做類似360工具箱的效果:
在前面的文章里,我寫的《duilib中ListCtrl控件的實現(xiàn)》和《仿酷狗音樂播放器開發(fā)日志十三——左側功能塊的完善》正是使用了這個布局完成的。這個布局有有兩個關鍵屬性:
columns和itemsize屬性,這兩個屬性不能一起用,應該只是用其中的一個。使用columns屬性可以來設置每行中包含的列數(shù),他會自動把包含的元素從左到右從上到下按照columns屬性的設置排列起來,他把每行的列數(shù)固定死了。而itemsize有兩個字段,**我讀源碼,發(fā)現(xiàn)第二個字段是無效的,我們只要使用**個字段就行了,他會設置每個元素所占的區(qū)域,比如容器的寬度是500,給itemsize設置為 100 x 10,那個每行就會容納5個元素,當我們拉伸了窗體讓容器寬度變?yōu)?00,那么每行就會自動容納7個元素,這意味著使用這個屬性會讓每行容納的元素個數(shù)是自動可變的!這在很多情況下是很有用的屬性。注意itemsize并不是直接設置了子控件的大小,而只是限制了子控件的**大區(qū)域。比如itemsize為100x100,而子控件設置為50x50,那么 **終的子控件大小為50x50,而子控件的位置會按照100x100來計算。這個希望讀者自己實踐一下來理解這個效果!
TabLayout:
TabLayout布局同樣常用,他就像MFC的選項卡CTabCtrl控件,如圖:
但是在duilib中TabLayout只是下面的布局界面,而不包含頂端的選項卡按鈕,所以經常用Option控件配合他一起使用,使用他時他會把他包含的下一級元素作為一個頁面,所以我們通常在他里面放入橫縱向布局來作為一個頁面,在橫縱向布局里再規(guī)劃每個頁面的外觀。
這個控件的詳細使用方法大家可以看duilib自帶的360demo,我就不贅述了!
ChildLayout:
ChildLayout布局比較少用,因為他的功能可以用其他布局來代替,他的作用就是從一個xml文件中加載布局來嵌入到ChildLayout布局所在的地方,使用這個布局一般只需要指定xmlfile屬性來設置xml文件位置就可以了。他的意義在于可以把繁雜的大量xml代碼分隔開。比如他和TabLayout布局結合,讓TabLayout布局包含5個ChildLayout布局,而每個ChildLayout布局分別從5個xml文件加載自己的布局文件,這樣就可以分塊化的編寫布局代碼。
實際上有個比他更好用的標簽,就是Include標簽,Include不屬于布局,但他的作用在布局方面非常類似ChildLayout,指定他的Source屬性到某個xml文件就可以了。相對ChildLayout,Include的優(yōu)點是可以自動識別自定義控件,而ChildLayout不可以!
在這里要提一下360Demo的自定義控件,這個demo的自定義控件做法誤導了很多人,里面使用了自定義控件的方法,把一個xml布局文件嵌入到界面里,這種做法完全沒必要,直接使用Include標簽,一句xml代碼可以完全代替自定義控件。
這里給出一個Include的用法:
其中source屬性指定xml文件的路徑,count指定解析的次數(shù)。
絕對布局的意義與用法:
在知道了6大布局的用法之后,知道了各種樣式的界面外觀的大致布局方法,而這還遠不夠讓我們寫出漂亮的布局外觀,只有配合相對布局與絕對布局才可以更好的控制界面的元素。值得一提的是,我這里說的相對布局和絕對布局并不是一個容器或者控件,這只是一種技巧和使用方法,用在容器布局所包含的控件上,常用到橫縱向布局中。
我先來介紹絕對布局,籠統(tǒng)上說絕對布局和相對布局其實只有一個差別,也就是我在前面提到的float屬性,容器中包含的控件float屬性為真就是絕對布局,為假就是相對布局。不要小看這一個屬性,他帶來的效果可以天壤之別!
給控件的float屬性設為真后,就使用了絕對布局,故名意思,絕對布局就是讓控件的坐標絕對化,這樣這個控件就不受他的容器的束縛而可以自己隨意設置自己的位置!比如在橫縱向布局中給他們包含的子控件設置float屬性,這個控件就不會被自動橫縱向排列。而我的建議是,能不用絕對布局就別用絕對布局!原因有三個:
1)絕對布局破壞了各個容器的特性,而不受容器的束縛。
2)絕對布局讓控件的坐標固定,不利于控件自動調節(jié)位置。
3)后面提到的相對布局幾乎可以完成絕對布局的所有特性。
那么為什么要用絕對布局,因為他的一個功能是相對布局無法完成的,就是讓控件或者布局重疊或者相交!有的時候我們必須這樣做來讓控件組合起來達到一些效果。我可以明確的說,我在做仿酷狗播放器的過程中,整個xml布局代碼只用了2個絕對布局,一個是編寫搜索欄《仿酷狗音樂播放器開發(fā)日志二——搜索欄的編寫》,一個是編寫電臺控件。如圖:
另外一個非常經典的使用絕對布局的例子就是我前幾天寫的《用duilib制作仿QQ2013動態(tài)背景登錄器》,這些例子都是因為要讓控件重疊起來組合出新的控件才使用了絕對布局,如果不讓控件重疊或者沒有特殊需求,**好別用絕對布局。
雖然不建議使用,但我也得說一下絕對布局相關的屬性和使用技巧。
1)把float屬性設置為真。
2)設置pos屬性,這個屬性在float為真時才有效,他包含四個字段,分別以為了控件的左上右下下個坐標的位置,但是建議只指定前兩個字段來設置控件的左上角的坐標,控件的寬度用width和height屬性來控制,這樣做的好處是避免了計算右下角坐標的繁瑣!以后修改的時候也很清晰!
舉出一個例子:
不得不提一個很有用的屬性,那就是relativepos屬性,屬性列表沒有列出這個屬性,這是我自己總結的
用了這個屬性,就可以讓控件擁有相對布局的一部分特性,那就是根據(jù)容器的大小,自己可以調整位置和大??!這個特點我在《仿酷狗音樂播放器開發(fā)日志二——搜索欄的編寫》用到了,是為了讓搜索按鈕可以自己移動。這個屬性的前兩個字段表示橫縱向的位移值,后兩個字段表示縮放值,具體效果大家應該自己實踐一下!另外這個屬性默認是有嚴重bug的,就是窗體**小化再恢復后有這個屬性的控件會自動無規(guī)律偏移,這個bug我修復了,詳見《仿酷狗音樂播放器開發(fā)日志二——搜索欄的編寫》。
這樣就介紹完了絕對布局,然后就是整片文章的**重要部分,相對布局!
相對布局的意義與用法:
我把相對布局的介紹放到**后,因為它很重要!
在容器內部使用控件或者容器時,float屬性設置為flase(duilib默認為false)就是相對布局了。這是我非常推薦使用的,前面我也說了我在寫仿酷狗的整個布局中,上百個控件中我只給兩個控件使用了絕對布局,其余都是相對布局。他的優(yōu)點如下:
1)布局和控件是可以根據(jù)窗體的大小改變而自動調整位置的,這點很重要
2)不需要絕對布局那樣麻煩的計算各個控件的位置
3)在容器中調整前一個控件的位置,后面的控件都會自動調整坐標
其實總得來說使用相對布局意義就是使用布局控件的自動排列特性!
使用了相對布局后,就不用設置float屬性和pos屬性,一般只設置甚至不設置width和height屬性。這點很重要,如果你的控件或者布局的大小是固定的,那么就設置width和height屬性,如果想讓控件或者布局根據(jù)窗體的大小而自動調整大小和位置,就不設置這兩個屬性。如果只設置了一個屬性,比如width設置為100,而height不設置,那么他的高度是自動調整的而寬度是固定的。父容器會自動安排他包含的元素,讓含有width和height屬性的控件占據(jù)相應的大小,把剩下的空間都分配給沒有設置wieth和height屬性的容器或者控件里??聪旅嬉粋€例子:
可以看到窗體的大小為300x300,而**外層的是一個名為Fahter的縱向容器,包含三個子容器。而Father沒有指定width和height,所以當我改變了窗體的大小時,F(xiàn)ather會自動調整自己的大小到和窗體大小相同,而三個子容器我都眉頭指定width屬性,所以三個子容器的寬度和Father是一樣,也就是他們的寬度都是和窗體寬度一樣,并且會自動調整。Sub1和Sub3的高度設置為50,所以他們的高度就固定了,而Sbu2的高度也沒有指定,那他會自動占據(jù)了除了Sub1和Sub2的所有空間!其實這個例子的布局是非常常見的界面布局例子,比如說酷狗,sub1和sub3分別表示標題欄和狀態(tài)欄,sub2為程序的主界面:
關于酷狗的更加詳細的布局分析可以看我前面寫的博客《仿酷狗音樂播放器開發(fā)日志——整體框架分析》,幾乎每開發(fā)酷狗的一部分,我都會把布局分析一下寫出來。
把這些知識綜合起來,現(xiàn)在就可以寫出一個自動調整大小的大致布局了,但是還沒法精確控制每個控件的位置。
利用上面介紹的自動占位的特性,我這里舉一個標題欄編寫的例子:
這個例子是我的仿酷狗播放器的換膚窗體的標題欄。他的外層是一個橫向布局,高度為30,寬度隨窗體調整。讓標題文字居于左側,關閉按鈕在**右側,如果讓窗體調整寬度后文字和關閉按鈕自動調整位置,就需要把中間的空位占滿。這時我們就需要一個占位控件,不給他設置width和height屬性,這樣子他就會自動占據(jù)剩余的空間!就達到了相對布局的自動調整位置的效果。這個使用方法是相對布局里非常常用的!而這個占位控件在沒有什么其他要求時建議像我給出的例子那樣,使用Control控件,因為他是所有控件和容器的祖先基類,代碼和屬性相對是**少的,這樣有利于提高程序的效率!
在充分理解了占位的技巧后,再配合一些微調屬性,就可以完美控制各個控件了,這幾個微調屬性分別是inset、padding、childpadding,這幾個屬性的介紹如下:
inset屬性
這是給容器控件使用的,使用后他所包含的所有使用相對布局的元素,都會被限制在設置的范圍內,適合對容器內所用元素進行整體的坐標控制。比如在前面提到的做360工具箱時,我們使用TileLayout容器來存放每一個工具,我們首先設置inset屬性,就可以讓所有的工具項限制在一定范圍內,例子如下:
**設置inset屬性,讓所有元素限制在一定范圍內而不用重復設置每個元素的屬性。
childpadding屬性:
childpadding屬性設置容器內每個元素之間的間距,這個比較容易理解,上面的例子中也用到了childpadding屬性。這個屬性在不同容器中代表不同意思,在橫向布局中代表子控件之間的橫向間隔,在縱向布局中代表子控件之間的縱向間隔,在TileLayout容器中代碼行與行之間的間隔!
padding屬性:
padding屬性是相對布局中**常用的屬性!用來設置相對于前一個控件的位置,這個屬性的控件位置微調的關鍵。一般只用他的前兩個字段,設置左邊距和上邊距,后兩個字段是無效的,或者說存在問題(為什么會有問題?請看源碼)。不過使用這兩個字段就夠了。這是我的仿酷狗播放器的狀態(tài)的布局代碼:
使用padding屬性,這是底部這四個按鈕的相對位置。如果我想整體讓這四個控件向右位移10像素,那么我只要設置**個按鈕的padding屬性為padding="10,0,0,0",就可以了,其他布局完全不需要修改!
結束語
體驗課預約試聽
倒計時
課程熱線:
客服在線時間:早上9點~下午6點,其他時間請在線預約報名或留言,謝謝!