閒下來將工作中遇到的問題記錄下來,部落格並不是要寫什麼高深的東西,最主要的是將自己再專案中的東西記錄下來,加深自己的理解,積少成多。
最近大家都在討論原生開發是否已經逐漸被替代了,說實話,任何乙個產品都是建立在乙個平台上,不管用什麼開發,無非是將產品最優化,所以不必要擔心原生是否被替代,好了,進入正題,今天將自己在專案中的簡單自定義進度條記錄下來,方便自己理解。
我們知道自定義view在安卓開發中占有很重要的地位,,而自定義view涉及到的重要知識點我想都知道三個最重要的函式,onmeasure(),onlayout(),ondraw(),這三個函式構建了乙個view的最基本元素。首先看圖
public doublegetmaxprogress()我想這個就是必備了,好了,初始化完成後,下面我們要分步驟來進行了,首先,我們將圓環分成外圓和內圓,1,先畫外圓,再畫內援,構成乙個圓環,在畫圓之前我們需要規定圓的區域,public voidsetmaxprogress(doublemaxprogress)
public doublegetcurrentprogress()
public voidsetcurrentprogress(doublecurrentprogress)
mpaint.setstyle(paint.style.stroke);//設定不填充
canvas.drawcolor(color.transparent);
mpaint.setantialias(true);//設定抗鋸齒
mpaint.setcolor(color.parsecolor("#d7d7d7"));canvas.drawarc(mrect,0,360,false,mpaint);//外圓
mpaint.setcolor(color.parsecolor("#259b24"));
canvas.drawarc(mrect,180, (float) ((currentprogress/maxprogress)*360),false,mpaint);//內圓
一開始這個地方我直接傳入的是int的當前進度和最大進度,發現圓弧怎麼也顯示不出來,後來發現出現了嚴重的粗心,我們看下面,
currentprogress/maxprogress)*360,這個如果是整型的話,例如12/42的話,那麼這個值就為0了,所以當時也是懵逼了一下,**還是不能大意,
public void drawarc(rectf oval,floatstartangle,
floatsweepangle,
booleanusecenter, paint paint)
這是繪製圓弧原始碼,第乙個引數代表所在區域,第二個代表圓弧開始角度,第****結束角度,第四個代表是否連線圓心,第五個代表
畫筆了,這一步基本圖形畫完了,接下來設定字型了,
mpaint.setstrokewidth(textstrokewidth);string text1 = integer.parseint(newdecimalformat("0").format(currentprogress))+"";
string text2 ="/"+integer.parseint(newdecimalformat("0").format(maxprogress));
inttext1hight = hight/4;
inttext2hight = hight/4;
mpaint.settextsize(text1hight);
mpaint.setcolor(color.parsecolor("#428631"));
inttext1width = (int)mpaint.measuretext(text1,0,text1.length());
mpaint.setstyle(paint.style.fill);
canvas.drawtext(text1,width*5/12-text1width,hight/3+text1hight,mpaint);
mpaint.settextsize(text2hight);
mpaint.setcolor(color.parsecolor("#aaaaaa"));
inttext2width = (int)mpaint.measuretext(text2,0,text2.length());
mpaint.setstyle(paint.style.fill);
canvas.drawtext(text2,width*6/7-text2width,hight/3+text2hight,mpaint);
字型的位置根據自己需要計算。好了整體畫出來了,如果你認為這個是完美的,引入到xml檔案中去,你會發現什麼?對,高度會佔據整個螢幕,為什麼呢?這就我之前說的,三個函式中onmeasure()方法在作怪,因為onmeasure()方法為為我們提供了三種模式,
measurespec.exactly 精確模式,這個代表我們在xml中設定寬高為定值,例如layout_width = 50dp,measurespec.at_most這個代表不超過父布局大小,對應xml檔案中match,
measurespec.
unspecified 這個代表未定義的,一般這個很少有,我們暫時不管,
measurespec這個類包含了乙個view的大小和模式,是乙個32位的整型數,最高兩位表示模式,低30位表示大小,
回到剛剛問題,為什麼會一直佔據整個螢幕呢,原因就是我們沒有測量區域大小,系統預設是充滿父布局的,所以這個時候我們需要去測量
@override寫到這裡,算是全部寫完了,引入到**中,完美!!!!!!protected voidonmeasure(intwidthmeasurespec,intheightmeasurespec)else if(widthmode == measurespec.at_most)else
if(heightmode == measurespec.exactly)else if(widthmode == measurespec.at_most)else
setmeasureddimension(width,height);
}
Android自定義View 自定義元件
自繪控制項也分兩種,自定義元件和自定義容器,自定義元件是繼承view類,自定義容器時繼承viewgrounp 今天主要分析下自定義元件 還是舉個例子來的實際些,假如我們要畫乙個最簡單的textview,首先想到的就是canvas.drawtext 方法,怎麼畫了?還是得一步一步來 1 寫乙個myte...
自定義view之自定義屬性
1.首先在res的values檔案下新建乙個名為attrs.xml檔案 在該xml檔案中編寫我們需要的屬性 declare styleable後面的name必須要與接下來要自定義的view名一致。attr 後面的name表示需要自定義的屬性,format表示這些屬性的型別 2.新建乙個類繼承text...
自定義view 二
自定義view的最重要的乙個部分是自定義它的外觀。根據你的程式的需求,通過ondraw方法實現繪製。在ondraw中,會傳遞給你乙個canvas。canvas封裝了繪製圖形的方法。還需要自定義乙個 paint去定義顏色樣式的填充 簡單來說 canvas定義你在螢幕上畫的圖形,而paint定義顏色,樣...