阿彌陀佛:
要有定力哦 ! ! !
學完這個個系列,自定義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
------------------第一節到此結束,敬請期待下一節分析---------------------