android爱好者 落木沙 原创,转载请注明源地址http://blog.csdn.net/luomusha/article/details/41245591。谢谢。

在android中,我们有两种情况可以设置字体大小。一种是在xml页面中,另一种是在java代码中。 

    

其中android:textSize字段就是设置字体大小。谷歌官方推荐在设置字体大小时候,用sp为单位。

在android中系统预设了3种默认字体样式供选择,即大、中、小号字体,默认的为小号字体。

            

另一种是在java代码中设置。

TextView tv;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);tv = (TextView) this.findViewById(R.id.hello_word);tv.setTextSize(12);}
在代码中设置的时候需要注意一下,setTextSize方法中的参数,默认单位是px(像素)。但是在android设备中,各种型号的屏幕,适配器来就成了问题。因此android提供了第二种设置字体大小的方法。

tv.setTextSize(TypedValue.COMPLEX_UNIT_SP, 12);

但是在一些工具api中,比如在Achartengine中,提供设置字体的方法都是像素为单位的。并没有提供设置单位的方法来设置。

renderer.setAxisTitleTextSize(12);renderer.setChartTitleTextSize(16);renderer.setLabelsTextSize(10);renderer.setLegendTextSize(12);

   这就需要我们自己进行转换。我们仿照android方法,看看大神们是如何实现的   

    @android.view.RemotableViewMethod    public void setTextSize(float size) {        setTextSize(TypedValue.COMPLEX_UNIT_SP, size);    }
我们看到,其实setTextSize(int size)方法就是调用了setTextSize(int unit,int size)方法。默认单位是sp。再接着看下去:
  public void setTextSize(int unit, float size) {        Context c = getContext();        Resources r;        if (c == null)            r = Resources.getSystem();        else            r = c.getResources();        setRawTextSize(TypedValue.applyDimension(            unit, size, r.getDisplayMetrics()));    }
系统是先通过Context拿到了Resources,在通过Resources拿到了DisplayMetrics,DisplayMetrics是一个对象,官方解释是The resource's current display metrics. 保存屏幕的一些数据。

TypedValue.applyDimension(unit, size, r.getDisplayMetrics())
又是什么呢?我们进去看看
    public static float applyDimension(int unit, float value,                                       DisplayMetrics metrics)    {        switch (unit) {        case COMPLEX_UNIT_PX:            return value;        case COMPLEX_UNIT_DIP:            return value * metrics.density;        case COMPLEX_UNIT_SP:            return value * metrics.scaledDensity;        case COMPLEX_UNIT_PT:            return value * metrics.xdpi * (1.0f/72);        case COMPLEX_UNIT_IN:            return value * metrics.xdpi;        case COMPLEX_UNIT_MM:            return value * metrics.xdpi * (1.0f/25.4f);        }        return 0;    }
我们可以理解为,TypedValue中有个静态方法,功能是能把一个float数值,转化成相对应屏幕上显示的px,dip,sp,pt,in,mm相应的长度返回。所以可以仿照代码,我们自己写一个转换方法
renderer.setAxisTitleTextSize(changeTextSize(12));renderer.setChartTitleTextSize(changeTextSize(16));renderer.setLabelsTextSize(changeTextSize(10));renderer.setLegendTextSize(changeTextSize(12));

private int changeTextSize(int size) {Resources r = getResources();return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP,size, r.getDisplayMetrics());}

这样就可以做到在设备上字体大小保持一直啦。么么哒。




更多相关文章

  1. adb通过wifi连接android设备的方法
  2. 在 android 上运行 python 的方法
  3. 饭后Android 第一餐-NavigationView+Toolbar(NavigationView使用
  4. Android jni 常用方法备忘
  5. Android SQLite使用方法
  6. 用VS2010开发Android应用的配置方法
  7. Activity对象的onCreate方法真是Android程序的入口吗?
  8. Android实现无标题栏全屏的方法
  9. Android中EditText 设置 imeOptions 无效问题的解决方法

随机推荐

  1. Android 深入研究SQLite实例(二)
  2. Fragment的使用简介【Android】
  3. Android创建快捷方式(shortcut)
  4. Android操作系统11种传感器介绍
  5. android write file
  6. Android平台上的Gphone 图像演示
  7. 网页链接拉起Unity Android和iOS APP
  8. android用intent打开各种文件
  9. 【转】Android studio2.2.3 支持Java8
  10. android 解决onTouch捕获不了up事件问题