美文网首页
2020-12-02

2020-12-02

作者: 是我的是你的 | 来源:发表于2020-12-04 11:33 被阅读0次

解决方法有很多乐于分享的很少

前言:公司要求在已完成的项目中禁用跟随系统字体大小变化 自己的项目中增加一键改变字体的大小(类似系统设置、微信) 看上去是不是觉得多此一举


结果图.gif

一.网上找到有人提问怎么做,没见有人给出详细解决方案
我来贴下 我的做法 下面2方法可以写在入口文件index.js 也可以放在全局文件中:

A.禁用跟随系统变换字体大小

TextInput.defaultProps =Object.assign({},TextInput.defaultProps, {
  defaultProps: false,
  allowFontScaling: false,
});
Text.defaultProps = Object.assign({}, Text.defaultProps, {
  allowFontScaling: false,
});

B. 使用到的改变全局项目字体大小的方法:

DeviceEventEmitter.addListener('changeFont', num => {
//传进来字体放大倍数
if (!num) {
    return;
  }
  Text.render = _.wrap(Text.render, function(func, ...args) {
    let originText = func.apply(this, args);
    let textStyle = originText.props && originText.props.style;
    let current_style = args[0].style;
    let getFontSize;
    if (current_style == null) {
      //如果为空 提供一个默认字体大小 pxToDp 只是我这边像素转换方法页可以直接写14
      getFontSize = pxToDp(14);
    } else if (
      current_style &&
      !current_style.fontSize &&
      current_style.length > 0
    ) {
      let pop_style;
      //倒序取值 因为有些组件有重新定义style 之后会成一个style数组 后一个style会覆盖前一个
      for (let index = current_style.length; index > 0; index--) {
        let nullDict = current_style[index];
        if (!!nullDict) {
          pop_style = nullDict;
          break;
        }
      }
      //有些sytle中会报NAN数值问题导致崩溃 有可能是在Text的style中没有添加fontSize问题 这边同意处理
      if (isNaN(pop_style.fontSize) == false) {
        getFontSize = pop_style.fontSize;
      } else {
        getFontSize = pxToDp(14);
      }
    } else {
      getFontSize =
        current_style && current_style.fontSize
          ? current_style.fontSize
          : pxToDp(14);
    }
    let orignStylefs = {fontSize: getFontSize * num};
    return React.cloneElement(originText, {
      style: [textStyle, orignStylefs] });
  });
});

二. 直接贴代码 在代码中标注
\color{red}{注意: 下列代码中已删除了界面布局,只保留滑动跟变换字体大小相关方法}

import React, {Component} from 'react';
import {
  View,
  Text,
  PanResponder,
  DeviceEventEmitter,
  Animated,
} from 'react-native';
import _ from 'lodash';


const lineWidth = deviceDpWidth - pxToDp(100);
const leftMar = pxToDp(18);
export default class AAAAAA extends Component {
  constructor(props) {
    super(props);
    this.state = {
      tramsformX: new Animated.ValueXY({x: -pxToDp(10), y: 0}), //滚动按钮初始位置
      currIndex: 0, //当前在第几个字号上0:标准 1:中: 2:大
      firstPosition: 0, //用来判断左右滑动方向
    };
  }

  componentWillMount() {
    this.watcher = PanResponder.create({
      onStartShouldSetPanResponder: (evt, gestureState) => true,
      onMoveShouldSetPanResponder: (evt, gestureState) => true,
      onPanResponderGrant: this._handlePanResponderGrant,
      onPanResponderMove: this._handlePanResponderMove,
      onPanResponderRelease: this._handlePanResponderEnd,
      onPanResponderTerminate: this._handlePanResponderTerminate,
    });
  }

  _handlePanResponderGrant(evt, gestureState) {
    this.firstPosition = gestureState.x0;
    this.sTime = true; //防止多次拖拽
  }
  _handlePanResponderEnd() {}
  _handlePanResponderTerminate() {}
  componentWillUnmount() {
    this.rightSize.remove();
    this.leftSize.remove();
  }

  componentDidMount() {
    //通知执行左右滑动 动画
    this.rightSize = DeviceEventEmitter.addListener('rightSize', () => {
      let idx = this.state.currIndex === 2 ? 2 : this.state.currIndex + 1;
      this._startAnimatedRight(idx);
      this.setState({
        currIndex: idx,
      });
    });
    this.leftSize = DeviceEventEmitter.addListener('leftSize', () => {
      let idx = this.state.currIndex === 0 ? 0 : this.state.currIndex - 1;
      this._startAnimatedLeft(idx);
      this.setState({
        currIndex: idx,
      });
    });
    //进入界面 滚动到之前保存选中的 字体大小等级
    DataStorage.get(StorageText.SETFONTSIZE).then(data => {
      if (data) {
        this.setState({
          currIndex: data,
        });
        this._startAnimatedRight(data);
      }
    });
  }

//右滑
  _startAnimatedRight(index) {
    Animated.spring(this.state.tramsformX, {
      toValue: {x: (lineWidth * index) / 2 - leftMar, y: 0}, //目标值
      velocity: 2, //附着在弹簧上物体的初始速度。默认值0(对象处于静止状态)。
      tension: 40, //控制速度。默认值40。可不写
      friction: 7, //控制“弹性”/过冲。默认值7。可不写
    }).start();
    setTimeout(() => {
      this.sTime = true; //防止多次拖拽
    }, 1000);
    this._tongzhi(index === 2 ? 2 : index);
  }

//左滑
  _startAnimatedLeft(index) {
    Animated.spring(this.state.tramsformX, {
      toValue: {x: (lineWidth * index) / 2 - leftMar, y: 0}, //目标值
      velocity: 2, //附着在弹簧上物体的初始速度。默认值0(对象处于静止状态)。
      tension: 40, //控制速度。默认值40。 可不写
      friction: 7, //控制“弹性”/过冲。默认值7。可不写
    }).start();
    setTimeout(() => {
      this.sTime = true; //防止多次拖拽
    }, 1000);
    this._tongzhi(index === 0 ? 0 : index);
  }

//重置字体大小
  _tongzhi(index) {
    this.changeFont = DeviceEventEmitter.emit(
      'changeFont',
      this.returnSize(index),
    );
  }

//判断左右滑动
  _handlePanResponderMove(evt, gestureState) {
    if (gestureState.moveX < this.firstPosition) {
      if (this.sTime == true) {
        this.sTime = false;
        DeviceEventEmitter.emit('leftSize');
      }
    } else if (gestureState.moveX > this.firstPosition) {
      if (this.sTime == true) {
        this.sTime = false;
        DeviceEventEmitter.emit('rightSize');
      }
    } else {
    }
  }

  //传入current 字体等级 获取缩放比例
  returnSize(current) {
    if (current == 0) {
      return 1; //标准正常字号
    } else if (current == 1) {
      return 放大; // eg:1.35
    } else {
      return 要多大;  //eg:1.5
    }
  }
  popView() {
//返回缓存选中的字号 重新进入app时 使用
    DataStorage.save(StorageText.SETFONTSIZE, this.state.currIndex);
    Actions.jump('Mine');
  }
  render() {
    return (
      <View style={{flex: 1, backgroundColor: 'white'}}>
          <Animated.Image
            source={require('../images/mine/btn.png')}
            activeOpacity={1}
            style={{
              height: pxToDp(40),
              width: pxToDp(40),
              marginTop: -pxToDp(23),
              transform: [
                //左右滑动
                {translateX: this.state.tramsformX.x},
                {translateY: this.state.tramsformX.y},
              ],
            }}
            {...this.watcher.panHandlers} //绑定手势
          />
        </View>
      </View>
    );
  }
}

\color{red}{注意: 在设置Text的Style中不要有下列方式不然会奔溃报错}

<Text style={[styles.xxxxx]}>123456</Text>

\color{red}{如果style确实要重新赋值要加上大括号并添加样式值要不然删除中括号}

要不这样
<Text style={[styles.xxxxx],{color:"red"}}>123456</Text>
要不然这样 两者选其一
<Text style={styles.xxxxx}>123456</Text>

问题: 各位还有哪些可行的 在已完成项目上实现一键改变项目字体大小的方式,请告诉我!有相关资料最好

希望对你有帮助!!!

相关文章

  • Flink doc

    2020-12-02 Application state is a first-class citizen in ...

  • 场景1:电脑本地web页面播放服务器录像

    2020-12-02 思维导图 第一步:播放本地录像 源码路径:https://github.com/Wonton...

  • 散瓣花二水湖50hb7018

    原创 李大叔 清江风情 2020-12-02 图谱编号:ESB_TP_50_hb7018 直径:~36.4mm 厚...

  • 2020-12-02 生而为人何为正确01

    【2020-12-02日精进 第198天/1825】表现:8分 一、体验(描述事实,情绪,感受) 1.为自己的幸...

  • 2020-12-02

    2020-12-02 这个日子 红袖添香 树木 花草 云层 云层里渗出的阳光 都缩紧了身子 天天路过的新建...

  • 周三 2020-12-02 23:30 - 06:30 阴 12

    2020-12-2 月总结啊,失控啊,图书馆回控啊周三 2020-12-02 23:30 - 06:30 阴 12...

  • 柑橘的香气

    2020-12-02 空气中若有若无地弥漫着柑橘的香气,大楼在冬天里显得空旷又萧瑟,像是凌晨起来窗上的冰棱,明晃...

  • 如何自我照顾

    中原焦点团队 成长分享877天 2020-12-02 我们说要爱自己,并不仅仅是说要吃好、穿好、睡好等生理层面的自...

  • 第一封

    2020-12-02,我写给你而你看不见的第一封信。 “我等你到三十五岁”,我就不了吧,但是我觉得我好像可以再等等...

  • 2020-12-02

    广场舞里翩翩飞舞的裙子,桃红葱绿,鹅黄翠紫,粉黛宝蓝,街灯还没有如约而至,在暮色苍茫的澄空下,大妈们早已排起整齐的...

网友评论

      本文标题:2020-12-02

      本文链接:https://www.haomeiwen.com/subject/gweuwktx.html