在Android中自定義控件時,如果Android系統中已存在對應的控件,就應該擴充功能相近的系統控件,這樣既可以減少工作量,又可以避免處理複雜的繪圖邏輯。代碼複用是程式開發的一條重要原則,是以一定不要盲目的擴充View。
好了,先從一個擴充的TextView入手吧
public class CustomTextView extends TextView {
}
系統會提示我們建立構造函數,說一下這三個構造函數的不同。
- public CustomTextView(Context context):通常在代碼中使用,控件的所有屬性都使用預設值
- public CustomTextView(Context context, AttributeSet attrs):如果在xml布局中設定控件的屬性,這些屬性會存到attrs中然後傳遞給構造函數,這些屬性值會決定控件的最終效果
- public CustomTextView(Context context, AttributeSet attrs,int defStyle):如果需要在xml布局中為控件設定style屬性,defStyle會存儲style的id并将其傳遞給構造函數,然後控件會根據屬性style的屬性值設定自己的樣式
我們就設定一下字型加粗吧
/**
* 初始化畫筆
*/
private void initPaint() {
// 執行個體化畫筆
mPaint=getPaint();
// 設定字型加粗
mPaint.setFakeBoldText(true);
}
Paint的set方法可以設定畫筆的屬性,具體的可以看API的解釋
然後調用onDraw(canvas)方法,否則所有繪制效果都無法展示
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
Canvas是畫布的意思,Paint是畫筆,通過Canvas下的各類drawXXX方法繪制各種不同的東西,然後展示在畫布上
Canvas的相關drawXXX方法如下
在xml布局檔案中使用自定義控件時,控件的标簽必須使用控件的完整類名
activity_main.xml如下:
<RelativeLayout xmlns:android="
http://schemas.android.com/apk/res/android"
xmlns:tools="
http://schemas.android.com/toolsandroid:layout_width="match_parent"
android:layout_height="match_parent" >
<com.example.activity.CustomTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="這是自定義TextView"
android:textSize="20sp" />
</RelativeLayout>
好了,現在看一下效果吧,運作效果如下:
源代碼參考:
http://blog.csdn.net/aigestudio/article/details/41212583