android自定義View的開篇,實現(xiàn)簡單的TextView

一、簡述

隨著android的不斷演習(xí)辆布,必然不可免的接觸到了自定義View,自定義View顯然也是android知識中的重大重組部分,本篇將帶領(lǐng)大家走進(jìn)第一個自定義的View控件的實現(xiàn)饭望,TextView作為基礎(chǔ)控件之一,相信大家都很熟悉了形庭,現(xiàn)在我們就來簡單的實現(xiàn)一個TextView杰妓。

沒有基礎(chǔ)的同學(xué)可以先看這自定義View簡介

二、現(xiàn)在我們來實現(xiàn)TextView

1碘勉、先在values新建一個attrs.xml,然后配置自定義View的屬性桩卵,

    <declare-styleable name="ViewText">
        <attr name="mtext"  format="string"/>
        <attr name="mTextSize"  format="dimension"/>
        <attr name="mTextColor" format="color"/>
    </declare-styleable>

分別定義了文本验靡,大小倍宾,跟顏色,屬性命名盡量不要跟原生的重復(fù)胜嗓,否則可能會報錯

2高职、新建ViewText繼承View,實現(xiàn)其構(gòu)造方法,三個構(gòu)造方法調(diào)用時機(jī)分別時辞州,在代碼中怔锌、在布局中、布局中引用style屬性時

public class MyTextView extends View {

    public MyTextView(Context context) {
        super(context);
    }

    public MyTextView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public MyTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }
}

我們在自定義View時也可以這樣寫

public class MyTextView extends View {

    public MyTextView(Context context) {
        super(context,null);
    }

    public MyTextView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs,0);
    }

    public MyTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }
}

讓他層層調(diào)用变过,這樣最終都會執(zhí)行第三個構(gòu)造方法

3埃元、在布局中使用自定義的View


    <com.example.mystudy.MyTextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:mtext="這是自定義的View"
        app:mTextColor="@color/colorAccent"
        app:mSize="15dp"
        />

4、獲取屬性

        TypedArray typedArray = context.obtainStyledAttributes(attrs,R.styleable.MyTextView);
        mText = typedArray.getString(R.styleable.MyTextView_mtext);
        mTextColor = typedArray.getColor(R.styleable.MyTextView_mtext,mTextColor);
        mTextSize = typedArray.getDimensionPixelSize(R.styleable.MyTextView_mtext,mTextSize);
        typedArray.recycle();

到了這媚狰,我們就完成了自定義View的屬性設(shè)置到獲取了

5岛杀、現(xiàn)在到了,自定義View都會接觸到的方法onMeasure崭孤、 onDraw类嗤,在onMeasure方法中我們需要自己實現(xiàn)控件的寬高的測量

        //獲得測量模式
        int widthMode = MeasureSpec.getMode(widthMeasureSpec);
        int heightMode = MeasureSpec.getMode(heightMeasureSpec);
        //獲得測量的大小
        int width = MeasureSpec.getSize(widthMeasureSpec);
        int height = MeasureSpec.getSize(heightMeasureSpec);
        //如果寬高設(shè)置為wrap_content,則需要自行測量
        if(widthMode == MeasureSpec.AT_MOST){
            //矩形
            Rect rect = new Rect();
            //測量大小
            paint.getTextBounds(mText,0,mText.length(),rect);
            width = rect.width();
        }

        if(heightMode == MeasureSpec.AT_MOST){
            Rect rect = new Rect();
            paint.getTextBounds(mText,0,mText.length(),rect);
            height = rect.height();
        }

        setMeasuredDimension(width,height);

后面我們就來到onDraw方法,繪制文本還涉及到一個基線的問題辨宠,已給出計算基線方式

        Paint.FontMetricsInt f =paint.getFontMetricsInt();
        int dy = (f.top-f.bottom)/2 - f.top;
        int BaseLine = getHeight()/2+dy;
        canvas.drawText(mText,0,BaseLine,paint);

完整代碼:

public class MyTextView extends View {
    public MyTextView(Context context) {
        this(context,null);
    }

    private String mText;
    private int  textSize = 15;
    private int   mColor = Color.BLACK;
    private Paint paint;
    public MyTextView(Context context, @Nullable AttributeSet attrs) {
        this (context, attrs,0);

    }

    public MyTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);

        TypedArray tppeArray = context.obtainStyledAttributes(attrs,R.styleable.MyTextView);
        mText = tppeArray.getString(R.styleable.MyTextView_mtext);
        textSize = tppeArray.getDimensionPixelSize(R.styleable.MyTextView_mTextSize,15);
        mColor = tppeArray.getColor(R.styleable.MyTextView_mTextColor,mColor);
        tppeArray.recycle();
        paint = new Paint();
        paint.setColor(mColor);
        paint.setTextSize(textSize);
        paint.setAntiAlias(true);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        //獲得測量模式
        int widthMode = MeasureSpec.getMode(widthMeasureSpec);
        int heightMode = MeasureSpec.getMode(heightMeasureSpec);
        //獲得測量的大小
        int width = MeasureSpec.getSize(widthMeasureSpec);
        int height = MeasureSpec.getSize(heightMeasureSpec);
        //如果寬高設(shè)置為wrap_content,則需要自行測量
        if(widthMode == MeasureSpec.AT_MOST){
            //矩形
            Rect rect = new Rect();
            //測量大小
            paint.getTextBounds(mText,0,mText.length(),rect);
            width = rect.width();
        }

        if(heightMode == MeasureSpec.AT_MOST){
            Rect rect = new Rect();
            paint.getTextBounds(mText,0,mText.length(),rect);
            height = rect.height();
        }

        setMeasuredDimension(width,height);
    }



    @Override
    protected void onDraw(Canvas canvas) {
        Paint.FontMetricsInt f =paint.getFontMetricsInt();
        int dy = (f.top-f.bottom)/2 - f.top;
        int BaseLine = getHeight()/2+dy;
        canvas.drawText(mText,0,BaseLine,paint);
    }
}

CSDN地址:android自定義View的開篇,實現(xiàn)簡單的TextView

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末遗锣,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子嗤形,更是在濱河造成了極大的恐慌精偿,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件派殷,死亡現(xiàn)場離奇詭異还最,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)毡惜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進(jìn)店門拓轻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人经伙,你說我怎么就攤上這事扶叉。” “怎么了帕膜?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵枣氧,是天一觀的道長。 經(jīng)常有香客問我垮刹,道長达吞,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任荒典,我火速辦了婚禮酪劫,結(jié)果婚禮上吞鸭,老公的妹妹穿的比我還像新娘。我一直安慰自己覆糟,他們只是感情好刻剥,可當(dāng)我...
    茶點故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著滩字,像睡著了一般造虏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上麦箍,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天漓藕,我揣著相機(jī)與錄音,去河邊找鬼内列。 笑死撵术,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的话瞧。 我是一名探鬼主播嫩与,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼交排!你這毒婦竟也來了划滋?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤埃篓,失蹤者是張志新(化名)和其女友劉穎处坪,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體架专,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡同窘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了部脚。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片想邦。...
    茶點故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖委刘,靈堂內(nèi)的尸體忽然破棺而出丧没,到底是詐尸還是另有隱情,我是刑警寧澤锡移,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布呕童,位于F島的核電站,受9級特大地震影響淆珊,放射性物質(zhì)發(fā)生泄漏夺饲。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望往声。 院中可真熱鬧茫蛹,春花似錦、人聲如沸烁挟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽撼嗓。三九已至,卻和暖如春欢唾,著一層夾襖步出監(jiān)牢的瞬間且警,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工礁遣, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留斑芜,地道東北人。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓祟霍,卻偏偏與公主長得像杏头,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子沸呐,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,947評論 2 355