使用系統控制項時,如layout_height/width引數這種,都是有兩種值的
一種是列舉型wrap_content和match_parent/fill_parent,另一種則是具體的值200dp這樣的
則自定義引數的申明則需要將兩者結合起來
比如我們可以在自定義控制項的寬高控制裡加這麼乙個引數,equal_textsize,使用時保證drawable大小和文字一樣
具體如下,在以前基礎上新增enum子項,支援列舉值,value為了保證不和dimension衝突取負數~
自定義寬高屬性中都可以新增乙個enum
<
attr
name= "drawablewidth"
format ="dimension"
>
<
enum
name ="equal_textsize"
value="-2"
/>
attr
>
對應類**如下
public
class
drawabletextview extends
textview
public
drawabletextview(context context, attributeset attrs)
public
drawabletextview(context context, attributeset attrs, int
defstyle)
}
// textsize用的是 sp作為size,而我們希望高度和文字部分一樣,用的是 dp作為單位,
// 兩者轉為px的比例有時候是不同的(大部分情況下是一樣的)
// 比如我用的平板, sp對應的scaleddensity為1.15, 而 dp對應的density為1.0,所以需要轉換一下
context c = getcontext();
resources r = c == null
? resources. getsystem() : c.getresources();
displaymetrics metrics = r.getdisplaymetrics();
float
scale = metrics. scaleddensity / metrics. density;
float
tvsize = gettextsize();
// 如果是特殊列舉值equal_textsize,則計算 textsize對應的所需畫素值
if(widthpx == equal_textsize)
// 如果是特殊列舉值equal_textsize,則計算 textsize對應的所需畫素值
if(heightpx == equal_textsize)
// 根據獲取到的寬高設定,達到對 drawable大小的控制
if(widthpx > 0 && heightpx > 0)
// 將改好的設定回去
setcompounddrawables(drawables[0], drawables[1], drawables[2],
drawables[3]);
ta.recycle();
}
private
intgetintordimen
(typedarray a, int
index, int
defvalue)
return
v; }
}
核心**為getintordimen,通過peekvalue方法判斷控制項引數值型別,然後再利用對應方法獲取到值,
統一轉為int型返回,判斷如果是特殊的-2則進行相關處理
自定義控制項的用法
效果圖 圓角頭像就是個自定義控制項,它是個繼承自imageview的類,使用方法是在xml裡寫完整的包名,類名 構造方法過載方法二 public roundimageview context context,attributeset attrs 構造方法過載方法三 public roundimage...
使用者自定義控制項(UserControl)用法大全
type myusertype uc.gettype 首先,在一aspx頁面中包含一使用者控制項 raisecontrol.ascx 該使用者控制項內含有一伺服器端控制項。在該使用者控制項的後台 中宣告事件委託 定義事件成員並新增一事件監視函式。如下 宣告事件委託 public delegate v...
自定義控制項 自定義鐘錶
private context mcontext 畫筆 private paint mpaint 控制項的寬 private int mwidth x方向的圓心座標 private int center 鐘錶的半徑 private int mradio 圓環的寬 private int stroke...