對于像我一樣的新手,我們習慣用android自帶的控件和傳統(tǒng)的布局方式。
但對于高手,布局卻是如下:
<?xml version="1.0" encoding="utf-8"?>
其中A extends LinerLayout, B extends TextView.
上面的話引用自:http://blog.csdn.net/Android_Tutor/article/details/5499731
ok,不說廢話。
首先,我們來認識一下android自帶的控件構成。
比如button,我們知道,要添加一個button,我們首先應該在XML文件中聲明一個button,然后在下面定義它的id,文本大小,顏色,背景等屬性。之后我們要在java程序中引用這個button,就像下面:
1 2 3 4 5 6 |
public class MainActivity extends Activity { private Button button; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); button=(Button)this.findViewById(R.id.button1); |
所以,對于我們的自定義控件來說,我們要做的有這么兩點:
1.我們需要一個屬性集,里面定義了一系列的屬性,比如顏色,字體大小之類。
2.需要一個類繼承View并覆寫它的一些方法,尤其是構造函數(shù)。
對于第一條,我們要在res/values目錄下新建一個文件,名字為attrs.xml,里面定義一些屬性,如下:
1 2 3 4 5 6 7 |
<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="MyView"> <attr name="textColor" format="color" /> <attr name="textSize" format="dimension" /> </declare-styleable> </resources> |
說明:name="MyView"的意思是我們這個屬性集的名字為MyView。
attr name="textColor" format="color"的意思是有一個名為textColor的屬性,格式為color。(android有很多格式,自行百度吧)。后一句同理。
對于第二條,看代碼:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
public class Sss extends View { private Paint mPaint; private Context mContext; private int textColor; private float textSize; private static final String mString = "http://my./754060"; public Sss(Context context) { super(context); mPaint = new Paint(); } public Sss(Context context,AttributeSet attr) { super(context,attr); mPaint = new Paint(); //從myview這個屬性集(之前定義的名字)中取得屬性列表 TypedArray a = context.obtainStyledAttributes(attr, R.styleable.MyView); /*從屬性集中獲得顏色 ,getcolor的兩個參數(shù)的含義是:當我們引用這個控件的XML文件中沒有給出這個值的話,就使用第二個參數(shù)(默認值),就比如我們button控件,如果我們在XML文件中沒有給出button的text屬性值的話就默認為"text1"。R.stytle.textcolor在attrs.xml定義之后自動生成。*/ textColor = a.getColor(R.styleable.MyView_textColor, 0XFFFFFFFF); textSize = a.getDimension(R.styleable.MyView_textSize, 36); //Give back a previously retrieved StyledAttributes, for later re-use. a.recycle(); } @Override protected void onDraw(Canvas canvas) { // TODO Auto-generated method stub super.onDraw(canvas); mPaint = new Paint(); //設置填充 mPaint.setStyle(Style.FILL); mPaint.setColor(textColor); mPaint.setTextSize(textSize); //畫一個矩形,前兩個是矩形左上角坐標,后兩個是右下角坐標 canvas.drawRect(new Rect(10, 10, 100, 100), mPaint); //繪制文字 canvas.drawText(mString, 10, 120, mPaint); } |
到此我們的自定義控件算完成了,那怎么使用呢?
兩步,
1.在XML中聲明
2.java中引用這個控件
首先,看XML代碼:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas./apk/res/android" xmlns:asd="http://schemas./apk/res/com.example.test_1" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <com.example.test_1.Sss android:id="@+id/sds" android:layout_width="fill_parent" android:layout_height="fill_parent" asd:textColor="#FFF" asd:textSize="50px" /> </LinearLayout> |
說明:xmlns:asd="http://schemas./apk/res/com.example.test_1xmlns:asd為命名空間,asd隨便娶個名字,方便后面調用(asd:textColor="#FFF"中 asd:textSize="50px")
com.example.test_1.Sss為包名+類名
然后在java程序中與普通的控件一樣引用,只不過Button換成Sss,button1換成sds,你懂的~