上篇文章通過繼承view定義了乙個圓形控制項,在介面上繪製乙個圓形,並且根據不同的測量模式設定了不同的大小:自定義控制項(一) 。但是我們定義的圓形在介面設計時半徑、顏色都已經固定了,本文主要總結如何像原生控制項一樣,通過在xml檔案中設定屬性來控制圓形的半徑以及顏色,並在圓形中心顯示一段文字
首先要定義控制項的屬性名稱,在values資料夾中新建attrs.xml檔案,宣告屬性的名稱和型別:
<?xml version="1.0" encoding="utf-8"?>
這裡定義了文字、文字顏色、半徑、圓形顏色、文字大小等屬性, format用來指定屬性的型別。
系統提供了typedarray資料結構來獲取自定義屬性值,通過typedarray物件的getstring()、getcolor()等方法就可以獲得xml中設定的屬性值,需要注意的是獲取完屬性值後需要呼叫typedarray的recycle方法來完成資源的**:
typedarray ta = context.obtainstyledattributes(attrs,r.styleable.myview);
mcircletext = ta.getstring(r.styleable.myview_text);
mcirclecolor = ta.getcolor(r.styleable.myview_circlecolor,0);
mtextcolor = ta.getcolor(r.styleable.myview_textcolor,0);
radius = ta.getdimension(r.styleable.myview_radius,50);
mtextsize = ta.getdimension(r.styleable.myview_textsize,15);
ta.recycle();
獲取到屬性之後,通過paint 的setcolor、settextsize等函式定義畫筆,就可以在螢幕上進行繪製了,我們要實現在圓形繪製一段文字,所以在ondraw中繪製完圓形後,通過呼叫drawtext方法繪製文字,使用這個方法時需要注意引數的含義:
canvas.drawtext(text,x,y,paint)
(1)text: 表示要繪製的文字內容
(2)x:表示對齊位置,通過呼叫paint的settextalign(align align)方法,設定文字的對齊標準,paint.align.center:以中心對齊,paint.align.left以左邊界對齊,paint.align.right以右邊界對齊。
(3)y:表示字元baseline 的位置,這裡需要特別注意,y不表示文字中心的高度,而表示文字基線的高度,基線是位於文字下方的,就像在直線上寫英文本母一樣,那條橫線叫做基線。
(2)paint:是繪製的畫筆
我們在以圓心位置對齊,繪製文字,所以x以中心對齊,設定寬對齊位置為圓心的位置,若要使文字的中心和圓心重合,需要使文字的基線在圓心下方text.height()/2的高度才能保證,通過獲取問題的外接矩形就可以方便的知道文字的高,從而設定y的大小:
@override
protected void ondraw(canvas canvas)
這樣就可以通過xml設定屬性,來改變控制項的大小、顏色以及文字,但是在設定前,一定要記得引用第三方空間的名字空間,在布局檔案中可以看到:
xmlns:android="
xmlns即xml namespace,指定命名空間為android,所以在使用系統屬性的時候可以使用android:來引用系統的屬性,自定義的屬性就需要建立自己的命名空間,as中使用如下**引入命名空間:
xmlns:custom=""
將第三方名字空間取名為custom,然後使用自定義屬性:
效果圖如下:
myview原始碼:
public class myview extends view
public myview(context context, attributeset attrs, int defstyleattr)
public myview(context context, attributeset attrs)
private void init(context context)
@override
protected void ondraw(canvas canvas)
@override
protected void onmeasure(int widthmeasurespec, int heightmeasurespec)
private int measureheight(int measurespec)else
}return result;
}private int measurewidth(int measurespec)else
}return result;}}
Android自定義控制項 二
onmeasure int widthmeasurespec,int heightmeasurespec 用於獲取和制定測量規則的。widthmeasurespec和heightmeasurespec是由mode size兩部分組成的,它是由父布局和子view共同決定的。其中mode的值可以分為三類...
Android 自定義控制項
幹android也有一段的時間了,自定義這塊的東西覺得還是很有比較複習一下基礎的東西。自定義控制項和自定義元件基本上的使用都是在專案中基本的android控制項滿足不了需求的時候使用的。所以,如果要高出特別炫的特效,或者比較特殊的控制項排列方式,例如瀑布流,那麼就要好好學學自定義咯。首先,先簡單的介...
android自定義控制項
android自定義控制項 二 入門,繼承view 說說android 兩種為自定義元件新增屬性的使用方法和區別 自定義控制項的屬性 自定義控制項 今天花了3,4個小時看了自定義控制項,看 懂了,還沒有實踐,因為時間不夠,日後實踐。總結下 自定義控制項有3種方式 繼承已有控制項 繼承乙個容器控制項,...