android 细线条字体

2016-08-02 15:46:18 jdsjlzx 阅读数 11631

样式定义

com.android.support:appcompat-v7库中,样式主要的定义在$SDK_HOME/extras/android/v7/appcompat/res/values/themes_base.xml中,其中定义了以下样式:

  • Platform.AppCompat(android:Theme)
  • Platform.AppCompat.Light(Platform.AppCompat)
  • Base.V7.Theme.AppCompat(Platform.AppCompat)
  • Base.V7.Theme.AppCompat.Light(Platform.AppCompat.Light)
  • Base.Theme.AppCompat(Base.V7.Theme.AppCompat)
  • Base.Theme.AppCompat.Light(Base.V7.Theme.AppCompat.Light)

其他如.DarkActionBar等衍生样式
其中对于若干的样式定义,比如

  • editTextBackground
  • editTextColor
  • ……

其中定义了AppCompat包的各种样式。对于希望修改默认样式的,可以在当前Activity的样式中对需要修改的样式进行覆盖即可。比如,android.support.v7.widget.AppCompatEditText,在激活状态下下划线是加粗的,通过查看AppCompatEdit代码,找到其背景是@drawable\abc_edit_text_material,此文件是一个xml资源文件,定义了一个inset集合,使用了两张9patch图片,通过TintManager对其进行染色,就得到了所见的默认样式。

如果需要修改,比如将其激活状态下也改为同样粗细的下划线,可以新建(复制)一份@drawable\abc_edit_text_material文件,其默认内容为:

<inset xmlns:android="http://schemas.android.com/apk/res/android"
   android:insetLeft="@dimen/abc_edit_text_inset_horizontal_material"
   android:insetRight="@dimen/abc_edit_text_inset_horizontal_material"
   android:insetTop="@dimen/abc_edit_text_inset_top_material"
   android:insetBottom="@dimen/abc_edit_text_inset_bottom_material">

    <selector>
        <item android:state_enabled="false"
            android:drawable="@drawable/abc_textfield_default_mtrl_alpha"/>
        <item android:state_pressed="false"
            android:state_focused="false"
            android:drawable="@drawable/abc_textfield_default_mtrl_alpha"/>
        <item android:drawable="@drawable/abc_textfield_activated_mtrl_alpha"/>
    </selector>
</inset>

可以看到在最下方是使用了@drawable/abc_textfield_activated_mtrl_alpha资源,将其改为同上的资源,在样式文件中添加

<item name="editTextBackground">@drawable/abc_edit_text_material</item>

其中资源是你新复制修改的资源,即可。

如修改AppCompatEditText焦点时的线条粗细:
drawable下新建:
abc_edit_text_material.xml

<?xml version="1.0" encoding="utf-8"?>
<inset xmlns:android="http://schemas.android.com/apk/res/android"
    android:insetLeft="@dimen/abc_edit_text_inset_horizontal_material"
    android:insetRight="@dimen/abc_edit_text_inset_horizontal_material"
    android:insetTop="@dimen/abc_edit_text_inset_top_material"
    android:insetBottom="@dimen/abc_edit_text_inset_bottom_material">

    <selector>
        <item android:state_enabled="false"
            android:drawable="@drawable/abc_textfield_default_mtrl_alpha"/>
        <item android:state_pressed="false"
            android:state_focused="false"
            android:drawable="@drawable/abc_textfield_default_mtrl_alpha"/>
        <item android:drawable="@drawable/abc_textfield_default_mtrl_alpha"/>
    </selector>
</inset>
2011-11-10 15:38:20 feng88724 阅读数 47252

在Android SDK中使用Typeface类来定义字体,可以通过常用字体类型名称进行设置,如设置默认黑体:

Paint mp = new paint();
mp.setTypeface(Typeface.DEFAULT_BOLD)

常用的字体类型名称还有:

  * Typeface.DEFAULT //常规字体类型

  * Typeface.DEFAULT_BOLD //黑体字体类型

  * Typeface.MONOSPACE //等宽字体类型

  * Typeface.SANS_SERIF //sans serif字体类型

  * Typeface.SERIF //serif字体类型

除了字体类型设置之外,还可以为字体类型设置字体风格,如设置粗体:
Paint mp = new Paint();
Typeface font = Typeface.create(Typeface.SANS_SERIF, Typeface.BOLD);
p.setTypeface( font );

常用的字体风格名称还有:

  * Typeface.BOLD //粗体

  * Typeface.BOLD_ITALIC //粗斜体

  * Typeface.ITALIC //斜体

  * Typeface.NORMAL //常规


但是有时上面那些设置在绘图过程中是不起作用的,所以还有如下设置方式:
Paint mp = new Paint();
mp.setFakeBoldText(true)//true为粗体,false为非粗体
mp.setTextSkewX(-0.5f);     //float类型参数,负数表示右斜,整数左斜
mp.setUnderlineText(true)//true为下划线,false为非下划线
mp.setStrikeThruText(true)//true为删除线,false为非删除线

Paint常用的方法还有:
mp.setTextSize()//设置字体大小,int型,如12
mp.setStrokeWidth(w)//设置线宽,float型,如2.5f,默认绘文本无需设置(默认值好像为0),但假如设置了,再绘制文本的时候一定要恢复到0

说明:对于中文粗体的设置,好像只能通过setFakeBoldText(true)来实现,尽管效果看起来不是很实在(字体中空效果)。实际发现,最后绘制的效果与手机硬件也有些关系,比如前面的绘图测试程序.


来自:http://happyin1111.blog.163.com/blog/static/164184801201171911364435/


2015-11-26 16:39:56 coder10001 阅读数 4400
<style name="baseTextStyle">
        <item name="android:layout_width">wrap_content</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:fontFamily">sans-serif-light</item>
    </style>
每个需要显示文字的地方,继承这个style。数字和英文变成细文字体。 不再是安卓原生的字体
2019-05-11 03:41:21 weixin_34377919 阅读数 300

小伙伴们大家好呀,这次介绍一个稍微有点意思的View,在很多阅读类、新闻类的APP上都标配的字体大小调整功能。100多行代码就可以实现,来看看效果吧!

思路分析

1、刻度线代表着每个字体的大小取值,是不是SeekBar就是这样的功能呀,改一下刻度浮标的样式即可。

2、刻度条上面的标注的文本代表着字体大小的说明,假设用一个LinearLayout包着3个TextView的方法很难实现文本跟刻度对齐,只能画出来了。

开始写代码

我们以SeekBar作为基础,对它进行重写onDraw()的方法,在这之前先来初始化一下基本属性。


/**
 * 字体大小调整滑杆
 * Created by ChenRui on 2017/10/13 0013 12:50.
 */
public class RaeSeekBar extends AppCompatSeekBar {

    //  刻度说明文本,数组数量跟刻度数量一致,跟mTextSize的长度要一致
    private String[] mTickMarkTitles = new String[]{
            "A",
            "标准",
            "",
            "",
            "A"
    };
    // 刻度代表的字体大小
    private int[] mTextSize = new int[]{
            16,
            18,
            24,
            26,
            28
    };

    // 刻度文本画笔
    private final Paint mTickMarkTitlePaint = new TextPaint(Paint.ANTI_ALIAS_FLAG);
    //  刻度文本字体大小
    private float mTickMarkTitleTextSize = 18;
    // 刻度文本跟刻度之间的间隔
    private float mOffsetY = 40;
    // 刻度线的高度
    private int mLineHeight = 10;
    // 保存位置大小信息
    private final Rect mRect = new Rect();

    // ...省略一些其他构造函数
    public RaeSeekBar(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    protected void init() {
        //  初始化刻度文本字体大小
        mTickMarkTitleTextSize = getSize(mTickMarkTitleTextSize);
        // 刻度文本跟刻度之间的间隔
        mOffsetY = getSize(mOffsetY);
        // 刻度线的高度
        mLineHeight = getSize(mLineHeight);
        // 刻度文字的对齐方式为居中对齐
        mTickMarkTitlePaint.setTextAlign(Paint.Align.CENTER);
        // 刻度文字的字体颜色
        mTickMarkTitlePaint.setColor(ContextCompat.getColor(getContext(), R.color.ph1));
        // 设置最大刻度值为字体大小数组的长度
        setMax(mTextSize.length);
        // 设置当前的刻度
        setProgress(1);
    }
}
复制代码

测量布局

因为要在原来的SeekBar的基础 上添加文本,那就应该在原来的SeekBar的 高度上再增加最大刻度的文字的高度就是控件布局的高度。

@Override
protected synchronized void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    // 原来的布局大小
    int wm = MeasureSpec.getMode(widthMeasureSpec);
    int hm = MeasureSpec.getMode(heightMeasureSpec);
    int w = getMeasuredWidth();
    int h = getMeasuredHeight();
    
    // 以最大的字体为基础,加上刻度字体大小
    h += getSize(mTextSize[mTextSize.length - 1]);
    // 加上与刻度之间的间距大小
    h += mOffsetY;
    // 保存测量结果
    setMeasuredDimension(MeasureSpec.makeMeasureSpec(w, wm), MeasureSpec.makeMeasureSpec(h, hm));
}
复制代码

重绘

总结一下画的思路,这样可以比较好理解代码的实现。整个过程一共需要我们画3部分:

  • 直线
  • 刻度线
  • 刻度文本

当然还有个滑动块,这个我们可以使用SeekBar自带的效果,即可以自定义样式,又能偷下懒。下面来一个个解析画的具体步骤。

1、画直线

我们先理解成外部是一个矩形,直线位于中间,左右两边的间距为滑块的一半。通过研究发现getPaddingLeft() getPaddingRight() 正好就是这个一半值。

2、刻度线

很容易看得出来,刻度线实际是把直线进行等分,等分的多少取决于setMax()的取值,也相当于mTextSize.length,这样我们通过画直线就能轻松实现了。

3、刻度文本

最重要的是确定文本所在的(x,y) 坐标值即可,不难发现文本的坐标是跟随刻度线的位置变化的,所以在画刻度线的时候就可以一起把文本也画出来了。

4、滑块位置

系统滑块的位置其实是跟分割线的位置一样的。等分直线,处于分割线中心。

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    // 刻度长度
    int maxLength = getMax();
    int width = getWidth();
    int height = getHeight();
    int h2 = height / 2; // 居中

    // 画刻度背景
    mRect.left = getPaddingLeft();
    mRect.right = width - getPaddingRight();
    mRect.top = h2 - getSize(1); // 居中
    mRect.bottom = mRect.top + getSize(1.5f); // 1.5f为直线的高度
    // 直线的长度
    int lineWidth = mRect.width();
    // 画直线
    canvas.drawRect(mRect, mTickMarkTitlePaint);

    //  遍历刻度,画分割线和刻度文本
    for (int i = 0; i <= maxLength; i++) {

        // 刻度的起始间隔 = 左间距 + (线条的宽度 * 当前刻度位置 / 刻度长度)
        int thumbPos = getPaddingLeft() + (lineWidth * i / maxLength);
        // 画分割线
        mRect.top = h2 - mLineHeight / 2;
        mRect.bottom = h2 + mLineHeight / 2;
        mRect.left = thumbPos;
        mRect.right = thumbPos + getSize(1.5f); // 直线的宽度为1.5
        canvas.drawRect(mRect, mTickMarkTitlePaint);

        // 画刻度文本
        String title = mTickMarkTitles[i % mTickMarkTitles.length]; // 拿到刻度文本
        mTickMarkTitlePaint.getTextBounds(title, 0, title.length(), mRect); // 计算刻度文本的大小以及位置
        mTickMarkTitlePaint.setTextSize(getSize(mTextSize[i])); // 设置刻度文字大小
        // 画文本
        canvas.drawText(title, thumbPos, getSize(mTextSize[mTextSize.length - 1]), mTickMarkTitlePaint);
    }
}
复制代码

画好了是不是等不及了来实际应用一下呢?

具体应用示例

  • 布局文件
<!--thumb属性为滑块的图片-->
<com.rae.cnblogs.widget.RaeSeekBar
    android:id="@+id/seekBar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@android:color/transparent"
    android:progressDrawable="@android:color/transparent"
    android:theme="@style/Widget.AppCompat.SeekBar"
    android:thumb="@drawable/seekbar_thumb_material_anim_font_setting" />
复制代码
  • thumb滑块图片
<selector xmlns:android="http://schemas.android.com/apk/res/android" android:constantSize="true">
    <item>
        <shape android:shape="oval">
            <solid android:color="@color/badge_color" />
            <size android:width="24dp" android:height="24dp" />
        </shape>
    </item>
</selector>
复制代码
  • 滑块回调监听
mSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
        @Override
        public void onProgressChanged(SeekBar seekBar, int value, boolean b) {
            //  获取滑块所在位置对应的字体大小
            int size = mSeekBar.getRawTextSize(value);
            mMessage.setTextSize(size);
        }
        //... 省略其他方法
    });
复制代码

源码

好啦,本篇文章到这里结束了。忍不住想试试的,可以参考源代码来做,在博客园Android开源客户端项目中,喜欢的给个Star~~

源码主要类:

转载于:https://juejin.im/post/5cd24dfb6fb9a0320c5ac7f8

2019-02-23 14:15:45 cs_lwb 阅读数 1747

 

一、前言

二、效果预览

三、实现步骤

1、自定义字体调整控件

2、滑动按钮改变当前页面预览字体大小

3、返回时,保存放大倍数并重启应用

4、初始化应用时配置字体放大倍数。

四、Demo地址

五、内容推荐


一、前言

最近项目添加了一项调整应用字体大小功能,做完后空闲之余总结一下。本功能仿照微信应用“设置” - “通用”  -  “字体大小”功能,又有一点区别。据我所知,常见改变全局字体大小方法有两种(若有更好的方案可以留言,互相学习),我把这两种分为可控和不可控,为什么这么分呢,当然不是为了方便记忆。那么简单说下两者方式的实现过程:

1、不可控:通过重写Actiivity的getResources()方法更新应用的字体倍数来调整全局字体大小

优点:实现简单

缺点:不可控制(所有字体放大倍数都是一致),无法跨进程(项目中另一个进程的字体不会改变,需要重新配置),只对sp字体单位有效果。....

2、可控:通过setTheme()方法,一开始就初始化设置不同风格的字体样式来更改全局字体大小。

优点:随意调节任意位置的字体大小

缺点:实现麻烦

而本文正式采用了第一种方案,主要是中途添加该功能,时间也不充裕,抽取字体大小又太过耗时。

微信字体大小个人猜测使用第二种方案,后者是更好的实现方式也不一定。

好了,扯得有点多。我要开始真正的表演了 ... 掌声呢   鲜花呢 .....................人呢

二、效果预览

三、实现步骤

1、自定义字体调整控件

网上找了一个相似的控件并加以完善,功能相对简单,就不做介绍了。


import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Point;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import java.util.ArrayList;
import java.util.List;
import blcs.lwb.lwbtool.R;
import blcs.lwb.lwbtool.utils.DensityUtils;

/**
 * TODO 仿微信字体大小调整
 * 自定义属性:
 * lineWidth        线条粗细
 * lineColor        线条颜色
 * totalCount       线条格数
 * circleColor      球型颜色
 * circleRadius     球型颜色半径
 * textFontColor    文字颜色
 * smallSize        小“A” 字体大小
 * standerSize      “标准” 字体大小
 * bigSize          大“A” 字体大小
 * defaultPosition  默认位置
 */
public class FontSizeView extends View {

    private int defaultLineColor = Color.rgb(33, 33, 33);
    private int defaultLineWidth;
    private int defaultMax = 5;
    private int defaultCircleColor = Color.WHITE;
    private int defaultCircleRadius;
    // 当前所在位置
    private int currentProgress;

    // 默认位置
    private int defaultPosition = 1;

    // 一共有多少格
    private int max = 7;
    // 线条颜色
    private int lineColor = Color.BLACK;
    // 线条粗细
    private int lineWidth;

    //字体颜色
    private int textColor = Color.BLACK;
    //字体大小
    private int smallSize = 14;
    private int standerSize = 16;
    private int bigSize = 28;

    // 圆半径
    private int circleRadius;
    private int circleColor = Color.WHITE;
    // 一段的宽度,根据总宽度和总格数计算得来
    private int itemWidth;
    // 控件的宽高
    private int height;
    private int width;
    // 画笔
    private Paint mLinePaint;
    private Paint mTextPaint;
    private Paint mText1Paint;
    private Paint mText2Paint;
    private Paint mCirclePaint;
    // 滑动过程中x坐标
    private float currentX = 0;
    // 有效数据点
    private List<Point> points = new ArrayList<>();

    private float circleY;
    private float textScaleX;
    private float text1ScaleX;
    private float text2ScaleX;

    public FontSizeView(Context context) {
        this(context, null);
    }

    public FontSizeView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context, attrs);
    }

    private void init(Context context, AttributeSet attrs) {

        // initDefault
        defaultLineWidth = DensityUtils.dp2px(context, 2);
        defaultCircleRadius = DensityUtils.dp2px(context, 35);
        lineWidth = DensityUtils.dp2px(context, 1);
        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.FontSizeView);
        final int N = typedArray.getIndexCount();
        for (int i = 0; i < N; i++) {
            initCustomAttr(typedArray.getIndex(i), typedArray);
        }
        typedArray.recycle();
        // 初始化画笔
        mLinePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        mLinePaint.setColor(lineColor);
        mLinePaint.setStyle(Paint.Style.FILL_AND_STROKE);
        mLinePaint.setStrokeWidth(lineWidth);

        //文字画笔
        mTextPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        mTextPaint.setColor(textColor);
        mTextPaint.setStyle(Paint.Style.FILL_AND_STROKE);
//        mTextPaint.setStrokeWidth(DensityUtils.dp2px(context, 1));
        mTextPaint.setTextSize(DensityUtils.sp2px(context, smallSize));
        textScaleX = mTextPaint.measureText("A");
        //文字画笔
        mText1Paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        mText1Paint.setColor(textColor);
        mText1Paint.setStyle(Paint.Style.FILL_AND_STROKE);
        mText1Paint.setTextSize(DensityUtils.sp2px(context, bigSize));
        text1ScaleX = mText1Paint.measureText("A");

        //文字画笔
        mText2Paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        mText2Paint.setColor(textColor);
        mText2Paint.setStyle(Paint.Style.FILL_AND_STROKE);
        mText2Paint.setTextSize(DensityUtils.sp2px(context, standerSize));
        text2ScaleX = mText2Paint.measureText("标准");

        mCirclePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        mCirclePaint.setColor(circleColor);
        mCirclePaint.setStyle(Paint.Style.FILL);

        // 设置阴影效果
        setLayerType(LAYER_TYPE_SOFTWARE, null);
        mCirclePaint.setShadowLayer(2, 0, 0, Color.rgb(33, 33, 33));
    }

    private void initCustomAttr(int attr, TypedArray typedArray) {
        if (attr == R.styleable.FontSizeView_lineColor) {
            lineColor = typedArray.getColor(attr, defaultLineColor);
        } else if (attr == R.styleable.FontSizeView_circleColor) {
            circleColor = typedArray.getColor(attr, defaultCircleColor);
        } else if (attr == R.styleable.FontSizeView_lineWidth) {
            lineWidth = typedArray.getDimensionPixelSize(attr, defaultLineWidth);
        } else if (attr == R.styleable.FontSizeView_circleRadius) {
            circleRadius = typedArray.getDimensionPixelSize(attr, defaultCircleRadius);
        } else if (attr == R.styleable.FontSizeView_totalCount) {
            max = typedArray.getInteger(attr, defaultMax);
        } else if (attr == R.styleable.FontSizeView_textFontColor) {
            textColor = typedArray.getColor(attr, textColor);
        } else if (attr == R.styleable.FontSizeView_smallSize) {
            smallSize = typedArray.getInteger(attr, smallSize);
        } else if (attr == R.styleable.FontSizeView_standerSize) {
            standerSize = typedArray.getInteger(attr, standerSize);
        } else if (attr == R.styleable.FontSizeView_bigSize) {
            bigSize = typedArray.getInteger(attr, bigSize);
        }else if (attr == R.styleable.FontSizeView_defaultPosition) {
            defaultPosition = typedArray.getInteger(attr, defaultPosition);
        }
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        height = h;
        width = w;
        circleY = height / 2;
        // 横线宽度是总宽度-2个圆的半径
        itemWidth = (w - 2 * circleRadius) / max;
        // 把可点击点保存起来
        for (int i = 0; i <= max; i++) {
            points.add(new Point(circleRadius + i * itemWidth, height / 2));
        }
        //初始刻度
        currentX = points.get(defaultPosition).x;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        //画字
        canvas.drawText("A", points.get(0).x - textScaleX / 2, height / 2 - 50, mTextPaint);

        //画字
        canvas.drawText("标准", points.get(1).x - text2ScaleX / 2, height / 2 - 50, mText2Paint);

        //画字
        canvas.drawText("A", points.get(points.size() - 1).x - text1ScaleX / 2, height / 2 - 50, mText1Paint);

        // 先画中间的横线
        canvas.drawLine(points.get(0).x, height / 2, points.get(points.size() - 1).x, height / 2, mLinePaint);
        // 绘制刻度
        for (Point point : points) {
            canvas.drawLine(point.x + 1, height / 2 - 20, point.x + 1, height / 2 + 20, mLinePaint);
        }

        // 画圆
        if (currentX < circleRadius) {
            currentX = circleRadius;
        }
        if (currentX > width - circleRadius) {
            currentX = width - circleRadius;
        }

        // 实体圆
        canvas.drawCircle(currentX + 1, circleY, circleRadius, mCirclePaint);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        currentX = event.getX();
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                invalidate();
                break;
            case MotionEvent.ACTION_MOVE:
                invalidate();
                break;
            case MotionEvent.ACTION_UP:
                //回到最近的一个刻度点
                Point targetPoint = getNearestPoint(currentX);
                if (targetPoint != null) {
                    // 最终
                    currentX = points.get(currentProgress).x;
                    invalidate();
                }
                if (onChangeCallbackListener != null) {
                    onChangeCallbackListener.onChangeListener(currentProgress);
                }
                break;
        }
        return true;
    }

    /**
     * 获取最近的刻度
     */
    private Point getNearestPoint(float x) {
        for (int i = 0; i < points.size(); i++) {
            Point point = points.get(i);
            if (Math.abs(point.x - x) < itemWidth / 2) {
                currentProgress = i;
                return point;
            }
        }
        return null;
    }

    public void setChangeCallbackListener(OnChangeCallbackListener listener) {
        this.onChangeCallbackListener = listener;
    }

    private OnChangeCallbackListener onChangeCallbackListener;

    public interface OnChangeCallbackListener {
        void onChangeListener(int position);
    }

    public void setDefaultPosition(int position){
        defaultPosition=position;
        if (onChangeCallbackListener != null) {
            onChangeCallbackListener.onChangeListener(defaultPosition);
        }
        invalidate();
    }
}

xml使用方式:

   <blcs.lwb.lwbtool.View.FontSizeView
        android:id="@+id/fsv_font_size"
        android:layout_width="wrap_content"
        android:layout_height="120dp"
        android:layout_marginLeft="@dimen/space_line2"
        android:layout_marginRight="@dimen/space_line2"
        android:background="@color/white"
        app:circleRadius="11dp"
        app:lineColor="@color/round_corner_progress_bar_progress_default"
        app:standerSize="16" />

2、滑动按钮改变当前页面预览字体大小

    //备注
    <!--字体大小 及倍数-->
    <!--0.875=14/16 -->
    <dimen name="sp_small">14sp</dimen>
    <!--1  标准-->
    <dimen name="sp_stander">16sp</dimen>
    <!--1.125=18/16-->
    <dimen name="sp_big1">18sp</dimen>
    <!--1.25=20/16-->
    <dimen name="sp_big2">20sp</dimen>
    <!--1.375=22/16-->
    <dimen name="sp_big3">22sp</dimen>
    <!--1.5=24/16-->
    <dimen name="sp_big4">24sp</dimen>
    <!--1.625=26/16-->
    <dimen name="sp_big5">26sp</dimen>
    <!--1.75=28/16-->
    <dimen name="sp_big6">28sp</dimen>
        //滑动返回监听
        fsvFontSize.setChangeCallbackListener(new FontSizeView.OnChangeCallbackListener() {
            @Override
            public void onChangeListener(int position) {
                int dimension = getResources().getDimensionPixelSize(R.dimen.sp_stander);
                //根据position 获取字体倍数
                fontSizeScale = (float) (0.875 + 0.125 * position);
                //放大后的sp单位
                double v = fontSizeScale * (int) DensityUtils.px2sp(FontSizeActivity.this, dimension);
                //改变当前页面大小
                changeTextSize((int) v);
            }
        });
   
 /**
     * 改变textsize 大小
     */
    private void changeTextSize(int dimension) {
        tv_font_size1.setTextSize(dimension);
        tv_font_size2.setTextSize(dimension);
        tv_font_size3.setTextSize(dimension);
    }

3、返回时,保存放大倍数并重启应用

  public void onClick(View view) {
      SPUtils.put(FontSizeActivity.this,Constants.SP_FontScale,fontSizeScale);
      //重启应用
      AppManager.getAppManager().finishAllActivity();
      IntentUtils.toActivity(FontSizeActivity.this, MainActivity.class,true);
  }

4、初始化应用时配置字体放大倍数。

改变全局大小的关键  //  res.updateConfiguration(config,res.getDisplayMetrics());

  //fontSizeScale = (float) SPUtils.get(this, Constants.SP_FontScale, 0.0f);
 @Override
    public Resources getResources() {
        Resources res =super.getResources();
        Configuration config = res.getConfiguration();
        if(fontSizeScale>0.5){//防止第一次获取SP时得到默认值0
            config.fontScale= fontSizeScale;//设置正常字体大小的倍数
        }
        res.updateConfiguration(config,res.getDisplayMetrics());
        return res;
    }

就是这么简单。。细节我就不写了 ,贴出来代码太长。看着累 ,需要的大家可以去看我项目

四、Demo地址

https://github.com/DayorNight/BLCS

五、内容推荐

简书:《Android 仿微信全局字体大小调整》

《Android JUnit单元测试》

《Android Log日志封装》

《Android Rxjava+Retrofit网络请求框架封装》

如果你觉得我写的不错或者对您有所帮助的话

不妨顶一个【微笑】,别忘了点赞、收藏、加关注哈

您的每个举动都是对我莫大的支持