Android的设备很多,适配起来比较难。所以才有了dp、sp这样的尺寸单位来适应不同的屏幕密度。他们之间的换算也并不复杂。
然而问题来了,UI那边提交来的设计图一般都是标的px。(他们并不太可能知道需要多少的dp或者sp,是吧。)咱不能每次都给他算一遍再标成dp或者sp啊。方便起见,我们需要一个自动换算的TextView,我们只需要传入设计图标注的屏幕大小和字体大小就可以适配不同设备了。
1.首先,我们需要一个自定义的属性来代替原先的字体大小属性
通常设计图不会给你标注各种屏幕下的不同数值。接下来我们就要传入设计图的屏幕大小来让字体按比例显示。
在values中创建一个attrs.xml文件,创建textSizePx的属性和baseScreenHeight属性(其实用宽度也是可以的,这不重要):
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="ScaleTextView">
<attr name="baseScreenHeight" format="integer"/><!--屏幕高度-->
<attr name="textSizePx" format="integer" /><!--字体大小-->
</declare-styleable>
</resources>
2.接下来我们定义自己的TextView
public class ScaleTextView extends TextView {
private int baseScreenHeight;
public ScaleTextView(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray type = context.obtainStyledAttributes(attrs,R.styleable.ScaleTextView);//获得属性值
int i = type.getInteger(R.styleable.ScaleTextView_textSizePx, 25);
baseScreenHeight = type.getInteger(R.styleable.ScaleTextView_baseScreenHeight, 720);
setTextSize(TypedValue.COMPLEX_UNIT_PX, getFontSize(i));
}
/**
* 获取当前手机屏幕分辨率,然后根据和设计图的比例对照换算实际字体大小
* @param textSize
* @return
*/
private int getFontSize(int textSize) {
DisplayMetrics dm = new DisplayMetrics();
WindowManager windowManager = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
windowManager.getDefaultDisplay().getMetrics(dm);
int screenHeight = dm.heightPixels;
Log.d("LOGCAT","baseScreenHeight"+baseScreenHeight);
int rate = (int) (textSize * (float) screenHeight / baseScreenHeight);
return rate;
}
}
3.布局文件里使用这个view代替原来的TextView
修改一下布局的属性,baseScreenHeight和textSizePx的值就是设计图上标注的屏幕高度和字体大小:
<util.ScaleTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="New World!"
app:baseScreenHeight="1280"
app:textSizePx="100"/>
这样就可以了,照抄设计图的尺寸去填写就可以,我们不仅可以自定义TextView,还可以自定义Button、EditText等不同的控件,快去动手尝试一下吧