TextView_第一節_改變內容和字號

阿彌陀佛:
要有定力哦 ! ! !

學完這個個系列,自定義View就So Easy...
主要是逐步分析TextView源碼,分析完成后,你就能夠徹底了解TextView,想怎么玩就怎么玩。。。

實現的主要內容:
繼承View,實現基本TextView功能:更改內容和字體大小。
步驟1: 定義atts.xml文件:
  <?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="TextViewAppearance">
        <!-- Base text color, typeface, size, and style. -->
        <attr name="textAppearance" />
    </declare-styleable>

    <attr name="textAppearance" format="reference" />
    <attr name="textViewStyle" format="reference" />


    <declare-styleable name="TextView">
        <attr name="text" format="string" localization="suggested" />
        <!-- Hint text to display when the text is empty. -->
        <attr name="hint" format="string" />
    </declare-styleable>
</resources>
步驟2:解析屬性文件
    //TypedArray:一組容器用來保存屬性的數組
    TypedArray a = theme.obtainStyledAttributes(attrs,
            R.styleable.TextViewAppearance, defStyleAttr, defStyleRes);
    TypedArray appearance = null;
    int ap = a.getResourceId(
            R.styleable.TextViewAppearance_textAppearance, -1);
    a.recycle();
    if (ap != -1) {
        appearance = theme.obtainStyledAttributes(
                ap, R.styleable.TextAppearance);
    }
    if (appearance != null) {
        int n = appearance.getIndexCount();
        for (int i = 0; i < n; i++) {
            int attr = appearance.getIndex(i);
            switch (attr) {
                case R.styleable.TextView_text:
                    text = a.getText(attr);
                    break;
            }
        }
    }
步驟3:初始化TextPaint
//TextPaint主要用來存儲字體大小、顏色等屬性
private TextPaint mPaint;
mPaint = new TextPaint();
mPaint.setColor(getResources().getColor(R.color.red));
mPaint.setTextSize(DensityUtil.dip2px(getContext(), textSize));
步驟4:調用onDraw繪制文字
canvas.drawText(text.toString(), getWidth() / 2, getHeight() / 2, mPaint);
步驟5:定義改變內容和字體大小的方法:
public CharSequence getText() {
    return text;
}

public void setText(CharSequence text) {
    this.text = text;
    invalidate();
}

public int getTextSize() {
    return textSize;

}

public void setTextSize(int textSize) {
    this.textSize = textSize;
    mPaint.setTextSize(DensityUtil.dip2px(getContext(),textSize));
    invalidate();
}
自定義TextView完整代碼:
    public class LincolnTextView extends View {
    private CharSequence text;
    private TextPaint mPaint;
    private int textSize = 30;


    public LincolnTextView(Context context) {
        this(context, null);
    }

    public LincolnTextView(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs, R.attr.textViewStyle);
    }

    public LincolnTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        this(context, attrs, defStyleAttr, 0);
    }

    public LincolnTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        CharSequence text = "AAAA";
        final Resources.Theme theme = context.getTheme();


        TypedArray a = theme.obtainStyledAttributes(attrs,
                R.styleable.TextViewAppearance, defStyleAttr, defStyleRes);
        TypedArray appearance = null;
        int ap = a.getResourceId(
                R.styleable.TextViewAppearance_textAppearance, -1);
        a.recycle();
        if (ap != -1) {
            appearance = theme.obtainStyledAttributes(
                    ap, R.styleable.TextAppearance);
        }
        if (appearance != null) {
            int n = appearance.getIndexCount();
            for (int i = 0; i < n; i++) {
                int attr = appearance.getIndex(i);
                switch (attr) {
                    case R.styleable.TextView_text:
                        text = a.getText(attr);
                        break;
                }
            }
        }
        mPaint = new TextPaint();
        mPaint.setColor(getResources().getColor(R.color.red));
        mPaint.setTextSize(DensityUtil.dip2px(getContext(), textSize));
        setText(text);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        canvas.drawText(text.toString(), getWidth() / 2, getHeight() / 2, mPaint);

    }

    public CharSequence getText() {
        return text;
    }

    public void setText(CharSequence text) {
        this.text = text;
        invalidate();
    }

    public int getTextSize() {
        return textSize;

    }

    public void setTextSize(int textSize) {
        this.textSize = textSize;
        mPaint.setTextSize(DensityUtil.dip2px(getContext(),textSize));
        invalidate();
    }
}
步驟6:定義布局文件:
 <?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="sz6636.view_2_textview.MainActivity">

    <sz6636.view_2_textview.view.LincolnTextView
        android:id="@+id/lincolnTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        />

    <Button
        android:id="@+id/button"
        android:layout_width="288dp"
        android:layout_height="wrap_content"
        android:text="改變內容"
        tools:layout_editor_absoluteY="0dp"
        tools:layout_editor_absoluteX="32dp" />

</android.support.constraint.ConstraintLayout>
步驟7:改變字號和內容:
    textView = (LincolnTextView) findViewById(R.id.lincolnTextView);
    button = (Button)findViewById(R.id.button);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            textView.setText("BBBB");
            textView.setTextSize(20);
        }
    });
Github源碼:

View_2_TextView
------------------第一節到此結束,敬請期待下一節分析---------------------

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容