學習日誌 自定義控制項

2021-06-18 04:32:10 字數 4188 閱讀 9169

最簡單的自定義控制項,不帶全名空間。直接就在某個view的構造方法裡寫這些個資料,構造方法的上部分其實就是讀取這些個配置資料的大小,然後在最後呼叫某個布局,把剛剛讀取到值給設定進去。

package cn.eoe.widget;

import android.content.context;

import android.util.attributeset;

import android.view.layoutinflater;

import android.widget.linearlayout;

import android.widget.textview;

import cn.eoe.label.edittext.r;

public class labeledittext extends linearlayout

// 獲得labelfontsize屬性的資源id

resourceid = attrs.getattributeresourcevalue(null, "labelfontsize", 0);

// 繼續讀取labelfontsize屬性的值,如果未設定該屬性,將屬性值設為14

if (resourceid == 0)

labelfontsize = attrs.getattributeintvalue(null, "labelfontsize",

14);

// 從資源檔案中獲得labelfontsize屬性的值

else

labelfontsize = getresources().getinteger(resourceid);

// 獲得labelposition屬性的資源id

resourceid = attrs.getattributeresourcevalue(null, "labelposition", 0);

// 繼續讀取labelposition屬性的值

if (resourceid == 0)

labelposition = attrs.getattributevalue(null, "labelposition");

// 從資源檔案中獲得labelposition屬性的值

else

labelposition = getresources().getstring(resourceid);

// 如果未設定labelposition屬性值,將該屬性值設為left

if (labelposition == null)

labelposition = "left";

string infservice = context.layout_inflater_service;

layoutinflater li;

// 獲得layout_inflater_service服務

li = (layoutinflater) context.getsystemservice(infservice);

linearlayout linearlayout = null;

// 根據labelposition屬性的值裝載不同的布局檔案

if("left".equals(labelposition))

linearlayout = (linearlayout)li.inflate(r.layout.labeledittext_horizontal, this);

else if("top".equals(labelposition))

linearlayout = (linearlayout)li.inflate(r.layout.labeledittext_vertical, this);

else

throw new runtimeexception("labelposition屬性的值只能是left或top.");

// 下面的**從相應的布局檔案中獲得了textview物件,並根據labeltextview的屬性值設定textview的屬性

textview = (textview) findviewbyid(r.id.textview);

textview.settextsize(labelfontsize);

textview.settext(labeltext);

}}

這個是通過重寫ondraw來實現的,上個是繼承 了linearlayout不用再重寫ondraw方法,這個是繼承 了textview方法,重寫了ondraw方法。

而且用到了命名空間

package cn.eoe.widget;

import android.r.anim;

import android.content.context;

import android.graphics.bitmap;

import android.graphics.bitmapfactory;

import android.graphics.canvas;

import android.graphics.rect;

import android.util.attributeset;

import android.widget.textview;

public class icontextview extends textview

/** * 這個效果其實也可以通過上個方法繼承linearlayout來實現,上個是用自己的ondraw因為布局本來就是寫好的,所以不用重寫ondraw

* ,而這個其實是直接畫出來的。

*/ @override

protected void ondraw(canvas canvas)

super.ondraw(canvas);

}}

<?xml version="1.0" encoding="utf-8"?>

另外一種實現方法用typearray.

package cn.eoe.widget;

import android.content.context;

import android.content.res.typedarray;

import android.graphics.bitmap;

import android.graphics.bitmapfactory;

import android.graphics.canvas;

import android.graphics.rect;

import android.util.attributeset;

import android.widget.textview;

import cn.eoe.icon.textview.ext.r;

public class icontextview extends textview

@override

protected void ondraw(canvas canvas)

target.left = left;

// 計算影象複製到目錄區域的縱座標。由於textview中文字內容並不是從最頂端開始繪製的,因此,需要重新計算繪製影象的縱座標

target.top = (int) ((getmeasuredheight() - gettextsize()) / 2) + 1;

target.bottom = target.top + textheight;

// 為了保證影象不變形,需要根據影象高度重新計算影象的寬度

target.right = left

+ (int) (textheight * (bitmap.getwidth() / (float) bitmap

.getheight()));

// 開始繪製影象

canvas.drawbitmap(bitmap, src, target, getpaint());

// 將textview中的文字向右移動一定的距離(在本例中移動了影象寬度加2個象素點的位置)

if (iconposition == 0)

canvas.translate(target.right + 2, 0);

} super.ondraw(canvas);

}}

學習自定義控制項

今天晚上在宿舍狠狠得看了一點關乎自定義控制項與gdi 相結合的例子,終於看得懂一點了.原來每個控制項的細節外觀都是一點點畫出來的,也許這需要對色彩有較強的敏感度,但沒事,我有時間慢慢測試。現在不僅要自定義按鈕,同時還要自定義窗體和選單的外觀,有點計畫去模仿qq2009的效果,嘿嘿 不過在自定義控制項...

自定義控制項 自定義鐘錶

private context mcontext 畫筆 private paint mpaint 控制項的寬 private int mwidth x方向的圓心座標 private int center 鐘錶的半徑 private int mradio 圓環的寬 private int stroke...

自定義控制項

首先是以下這幾項,attribute defaultproperty指定元件的預設屬性,toolboxdata指定當從ide工具中的 工具箱中拖動自定義控制項時為它生成的預設標記 defaultproperty text toolboxdata mycontrol runat server 上面這些...