天天看點

[轉]Android自定義控件之TextView

[size=medium][/size]有時候Android自帶的控件無法滿足我們的某些要求,這時就需要我們自定義控件來實作這些功能。比如需要一個TextView裡的字傾斜一定的角度,就需要自定義TextView。

下面介紹怎麼自定義TextView。

首先建立一個繼承自TextView的類,取名為RotateTextView:

import android.content.Context;

import android.graphics.Canvas;

import android.util.AttributeSet;

import android.widget.TextView;

public class RotateTextView extends TextView {

private static final String NAMESPACE = “http://www.ywlx.net/apk/res/easymobi”;

private static final String ATTR_ROTATE = “rotate”;

private static final int DEFAULTVALUE_DEGREES = 0;

private int degrees ;

public RotateTextView(Context context, AttributeSet attrs) {

super(context, attrs);

degrees = attrs.getAttributeIntValue(NAMESPACE, ATTR_ROTATE, DEFAULTVALUE_DEGREES);

}

@Override

protected void onDraw(Canvas canvas) {

canvas.rotate(degrees,getMeasuredWidth()/2,getMeasuredHeight()/2);

super.onDraw(canvas);

}

}

一定要有帶Context和AttributeSet參數的構造函數,getAttributeIntValue()裡第一個參數是命名空間,類似于Android自帶的”http://schemas.android.com/apk/res/android”,這裡可以自己随便定義。第二個參數是傳入的參數的值,這裡是旋轉地角度。第三個參數是預設值,就是不定義該屬性時預設旋轉的角度,這裡是0度。然後重寫onDraw()方法,rotate()作用是以TextView的中心為中點把畫布旋轉degrees度,這樣就實作了字的旋轉。

下一步就是在布局檔案中使用自定義的TextView:

<cn.easymobi.application.memorytest.RotateTextView

android:layout_width=”wrap_content”

android:layout_height=”wrap_content”

android:padding=”8dip”

android:gravity=”center”

android:id=”@+id/tvBottom_color”

android:textSize=”15dip”

android:textColor=”@color/black”

easymobi:rotate=”10″

android:layout_marginTop=”468dip”

/>

其他屬性與普通的TextView相同, easymobi:rotate=”10″指定了旋轉10度,但是要注意在頭檔案加上xmlns:easymobi=”http://www.ywlx.net/apk/res/easymobi”,這個就是RotateTextView中的命名空間的作用。還有一點要注意的就是加上合适的padding,因為這種方法旋轉的是TextView裡面的字,而不是TextView本身,如果不加padding,有些字就會因為旋轉而跑到了TextView外面而不能顯示。

用類似的方法還可以實作各種各樣你想要的效果。