對於自定義View的記錄

2021-08-16 22:47:13 字數 4609 閱讀 2323

閒下來將工作中遇到的問題記錄下來,部落格並不是要寫什麼高深的東西,最主要的是將自己再專案中的東西記錄下來,加深自己的理解,積少成多。

最近大家都在討論原生開發是否已經逐漸被替代了,說實話,任何乙個產品都是建立在乙個平台上,不管用什麼開發,無非是將產品最優化,所以不必要擔心原生是否被替代,好了,進入正題,今天將自己在專案中的簡單自定義進度條記錄下來,方便自己理解。

我們知道自定義view在安卓開發中占有很重要的地位,,而自定義view涉及到的重要知識點我想都知道三個最重要的函式,onmeasure(),onlayout(),ondraw(),這三個函式構建了乙個view的最基本元素。首先看圖

public doublegetmaxprogress() 

public voidsetmaxprogress(doublemaxprogress)

public doublegetcurrentprogress()

public voidsetcurrentprogress(doublecurrentprogress)

我想這個就是必備了,好了,初始化完成後,下面我們要分步驟來進行了,首先,我們將圓環分成外圓和內圓,1,先畫外圓,再畫內援,構成乙個圓環,在畫圓之前我們需要規定圓的區域,

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定義顏色,樣...