先来个截图:
在来看看自定义的TextView:
1 public class MyTextView extends TextView 2 { 3 4 public MyTextView(Context context, AttributeSet attrs) 5 { 6 super(context, attrs); 7 TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MyTextView); 8 float textSize = a.getDimension(R.styleable.MyTextView_myTextSize, 36); 9 int size = DisplayUtil.px2dip(textSize); 10 this.setTextSize(size); 11 a.recycle(); 12 13 } 14 }
解释一下代码:
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MyTextView); 这个是获取自定义属性的集合。float textSize = a.getDimension(R.styleable.MyTextView_myTextSize, 36); 这个是获取上面集合里面的某一个属性,有一个默认值,防止别人忘写.
int size = DisplayUtil.px2dip(textSize); 通过工具类把px转换成sp。
上DisplayUtil的代码:
1 public class DisplayUtil 2 { 3 public static int dip2px(float dipValue) 4 { 5 final float scale = MyApplication.context.getResources().getDisplayMetrics().density; 6 return (int) (dipValue * (scale + 0.5f)); 7 } 8 public static int px2dip(float pxValue) 9 { 10 final float scale = MyApplication.context.getResources().getDisplayMetrics().density; 11 return (int) (pxValue / (scale + 0.5f)); 12 } 13 }
配置自定义属性 需要在values下面创建一个attrs的xml
1 <?xml version="1.0" encoding="utf-8"?> 2 <resources> 3 <declare-styleable name="MyTextView"> 4 <attr name="myTextSize" format="dimension" /> 5 </declare-styleable> 6 </resources>
最后mainActivity的布局:
1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:mytextview="http://schemas.android.com/apk/res/com.example.mytextview" 3 xmlns:tools="http://schemas.android.com/tools" 4 android:layout_width="match_parent" 5 android:layout_height="match_parent" 6 tools:context=".MainActivity" > 7 <com.example.mytextview.MyTextView 8 android:layout_width="wrap_content" 9 android:layout_height="wrap_content" 10 mytextview:myTextSize="45px" 11 android:text="我是自适应的文字" /> 12 13 <TextView android:layout_width="wrap_content" 14 android:layout_height="wrap_content" 15 android:textSize="30sp" 16 android:text="我是普通的文字" /> 17 </LinearLayout>
第2行很关键的
xmlns:mytextview 自己可以随意定义 下面引用要用的
com.example.mytextview 这个是自已包的名字