Android面试题-解决字体适配

源码分析相关面试题

  • Volley源码分析
  • 注解框架实现原理
  • okhttp3.0源码分析
  • onSaveInstanceState源码分析

Activity相关面试题

  • 保存Activity的状态
  • activity的启动模式原理(一)
  • activity的启动模式原理(二)
  • activity的启动模式原理(三)
  • ActivityRecord TaskRecord和ProcessRecord之间的关系
  • service里面startActivity抛异常?activity不会
  • 如何退出Activity?如何安全退出已调用多个Activity的Application?

Service相关面试题

  • IntentService源码分析
  • Service是否在main thread中执行, service里面是否能执行耗时的操作
  • service被kill之后怎么让它重启

与XMPP相关面试题

  • 与XMPP相关试题一
  • 与XMPP相关试题二

与性能优化相关面试题

  • 与性能优化相关面试题一
  • 与性能优化相关面试题二
  • 与性能优化相关面试题三
  • 与性能优化相关面试题四
  • 与性能优化相关面试题五
  • 与性能优化相关面试题六
  • 与IPC机制相关面试题

与登录相关面试题

  • oauth认证协议原理
  • token产生的意义
  • 微信扫一扫实现原理

与开发相关面试题

  • 迭代开发的时候如何向前兼容新旧接口
  • 手把手教你如何解决as jar包冲突
  • context的原理分析
  • 解决ViewPager.setCurrentItem中间很多页面切换方案
  • 创建虚拟机时报错 Please file a bug against Android Studio
  • 字体适配
  • 键盘弹起挡住输入框
  • 机型适配之痛,例如三星、小米、华为、魅族等

与人事相关面试题

  • 人事面试宝典

场景一:

开发中经常会遇到这样的情况,某天你心情正好的时候,产品拿着某台设备跑过来告诉你,快看这里的文字显示不下了,开发会说:擦,你这个字太长了啊,当然就显示不下了。然后产品会说:你看iOS是好的,看起来当文字太多的时候,字体变小了。之后Android开发就跑去问iOS开发你这个是怎么做到的,答曰:系统自带的功能,当显示不下时会自动缩小字号。Android开发表示心好累啊,如图:
Android面试题-解决字体适配_第1张图片
配置文件:

id="@+id/tv"
        android:layout_width="200dp"
        android:layout_height="wrap_content"
        android:textSize="18sp"
        android:layout_marginTop="100dp"
        android:singleLine="true"
        android:text="Hello World! 字体大小自适应的TextView" />

如上所示发现字体太长默认…

解决方案

private void adjustTvTextSize(TextView tv, int maxWidth, String text) {
        int avaiWidth = maxWidth - tv.getPaddingLeft() - tv.getPaddingRight() - 10;

        if (avaiWidth <= 0) {
            return;
        }

        TextPaint textPaintClone = new TextPaint(tv.getPaint());
        // note that Paint text size works in px not sp
        float trySize = textPaintClone.getTextSize();

        while (textPaintClone.measureText(text) > avaiWidth) {
            trySize--;
            textPaintClone.setTextSize(trySize);
        }

        tv.setTextSize(TypedValue.COMPLEX_UNIT_PX, trySize);
    }

调用如上方法展示效果如下:
Android面试题-解决字体适配_第2张图片
当文本过长字体自动缩小,智能适配,宝宝好苦,宝宝不说。

场景二:数据科学家

Android面试题-解决字体适配_第3张图片

做个简单的例子,先验证一下:

同样的布局代码

<TextView   
 android:layout_width="wrap_content"    
 android:layout_height="wrap_content"   
 android:textSize="18sp"    
 android:text="Hello World! in SP" />

<TextView  
 android:layout_width="wrap_content"    
 android:layout_height="wrap_content" 
 android:textSize="18dp"    
 android:text="Hello World! in DP" />

调节设置中显示字体大小

Android面试题-解决字体适配_第4张图片

运行后显示样式

Android面试题-解决字体适配_第5张图片

回到标题要解决的问题,如果要像微信一样,所有字体都不允许随系统调节而发生大小变化,要怎么办呢?利用Android的Configuration类中的fontScale属性,其默认值为1,会随系统调节字体大小而发生变化,如果我们强制让其等于默认值,就可以实现字体不随调节改变,在工程的Application或BaseActivity中添加下面的代码:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    if (newConfig.fontScale != 1)//非默认值
        getResources();    
    super.onConfigurationChanged(newConfig);
}

@Override
public Resources getResources() {
     Resources res = super.getResources();
     if (res.getConfiguration().fontScale != 1) {//非默认值
        Configuration newConfig = new Configuration();       
        newConfig.setToDefaults();//设置默认        
        res.updateConfiguration(newConfig, res.getDisplayMetrics()); 
     }    
     return res;
}

解决方案:

一是布局宽高固定的情况下,字体单位改用dp表示;

二是通过3中的代码设置应用不能随系统调节,在检测到fontScale属性不为默认值1的情况下,强行进行改变。

  • 欢迎关注微信公众号,长期推荐技术文章和技术视频

  • 微信公众号名称:Android干货程序员

你可能感兴趣的:(面试题)