精华内容
下载资源
问答
  • TextView设置字重(自定义自重)

    千次阅读 2021-10-17 10:34:26
    android提供的几种加粗方法不满足我们ui设计的字体字重 二、实现的方式 设置TextView的textStyle为Bold,这种方式的textView很粗 xml:android:textStyle=“bold” 代码:paint.setTypeface(Typeface....

    1、目的

    android提供的几种加粗方法不满足我司ui设计的字体字重
    

    2、三种加粗方法

    1. 设置TextView的textStyle为Bold,这种方式的textView很粗
      xml:android:textStyle="bold"
      代码:paint.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));
      通过textStyle方式



    2. 代码设置FakeBoldText,这种方式加粗过的比较接近medium效果

    paint.setFakeBoldText(true)
    

    在这里插入图片描述

    1. 如果以上都不满足ui小姐姐,我们还可以换种思路,TextView的加粗其实本质就是画笔paint的粗细,我们可以通过设置画笔的宽度来满足需求
    paint.setStrokeWidth(8f);
    paint.setStyle(Paint.Style.FILL_AND_STROKE);
    

    在这里插入图片描述

    (设置Style为FILL_AND_STROKE的目的是:如果字体过大,填充模式为STROKE的话就会出现字画之间的漏洞,设置FILL不会有效果,如图)

    STOKE模式:
    在这里插入图片描述


    FIll模式:
    在这里插入图片描述

    3、第三种方式额外问题以及解决方案

    问题:
      1、每个TextView都这样设置的话,重复代码太多
      2、字重之间没有一个衡量单位标准
      3、字号大小不同需要设置不同的StrokeWidth,如果不设置,小字号看起来很粗,大字号看起来没效果

    解决方案:
      1、继承LayoutFactory2(每个view创建的地方),在xml里面自定义设置一个额外属性,如果有地方需要自定义自重,使用该属性设置
      2、与自家ui小姐姐商讨确定字重的等级集,比如我们公司就制定一共5个等级字重
      3、根据字号以及等级,设计一套计算规则来计算出StrokeWidth

    3.1实现细节

    1. 在xml中自定义属性textBoldStyle,枚举,定义了5个等级
        <!-- 系统TextView自定义额外属性 -->
        <attr name="textBold" format="enum">
            <enum name="zero" value="0" />
            <enum name="one" value="1" />
            <enum name="two" value="2" />
            <enum name="three" value="3" />
            <enum name="four" value="4" />
        </attr>
    
    1. 在要用到的xml的文件TextVIew节点下设置该属性
        <TextView
            android:id="@+id/textView3"
            style="@style/TextVIewStyle"
            app:textBold="two" />
    

      style属性:

        <style name="TextVIewStyle">
            <item name="android:layout_width">match_parent</item>
            <item name="android:layout_height">100dp</item>
            <item name="android:gravity">center</item>
            <item name="android:text">Hello World!你好世界!</item>
            <item name="android:textSize">20sp</item>
        </style>
    
    1. 重写LayoutFactory2,关键思想就是重写onCreateView,自己创建TextView以及TextView的子类(怎么重写?一个字,抄,抄系统源码),然后读取textBold属性,获取加粗等级,然后设计一套计算规则(我只是简单的根据字体dp进行等比放大缩小,效果还可以),得到设置画笔宽度的值
    import android.content.Context;
    import android.content.res.TypedArray;
    import android.graphics.Paint;
    import android.graphics.Typeface;
    import android.text.TextUtils;
    import android.util.AttributeSet;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.widget.TextView;
    
    import java.lang.reflect.Constructor;
    import java.util.HashMap;
    import java.util.Map;
    
    public class NightThemeInflaterFactory implements LayoutInflater.Factory2 {
    
    	private Map<TextView, Integer> map = new HashMap<>();
    
    	private static final String NAMESPACE_RES_AUTO = "http://schemas.android.com/apk/res-auto";
    	private static final String[] mClassPrefixList = {
    			"android.widget.",
    			"android.webkit.",
    			"android.app.",
    			"android.view."
    	};
    
    	//记录对应VIEW的构造函数
    	private static final Class<?>[] mConstructorSignature = new Class[]{
    			Context.class, AttributeSet.class};
    
    	private static final HashMap<String, Constructor<? extends View>> mConstructorMap =
    			new HashMap<String, Constructor<? extends View>>();
    
    	@Override
    	public View onCreateView(View parent, String name, Context context, AttributeSet attrs) {
    		return onCreateView(name, context, attrs);
    	}
    
    	@Override
    	public View onCreateView(String name, Context context, AttributeSet attrs) {
    		//创建系统的控件
    		View view = createSDKView(name, context, attrs);
    		if (null == view) {
    			//创建非系统控件
    			view = createView(name, context, attrs);
    		}
    
    		//如果是TextView或者是继承了TextView的子控件
    		if (view instanceof TextView) {
    			TextView textView = (TextView) view;
    			//查找textBold属性(xml中直接定义的)
    			int value = attrs.getAttributeIntValue(NAMESPACE_RES_AUTO, "textBold", -1);
    			//查找textBold属性(写在style里面的)
    			if (value == -1) {
    				TypedArray typedArray = context.obtainStyledAttributes(R.style.TextVIewStyle, new int[]{R.attr.textBold});
    				value = typedArray.getInt(0, -1);
    				typedArray.recycle();
    			}
    			float density = getDensity(context);
    			float textSize = textView.getTextSize();
    			//将文字大小换算成dp属性,根据dp进行放大缩小系数
    			int dp = (int) (textSize / density);
    			//我的项目是以dp的1/10为最大的等级,最低等级是0即正常字体(不加粗),
    			//然后在1/10的基础上再划分为4个等级
    			float fullNums = dp / 20f;
    			value = Math.min(value, 4);
    			float targetLevel = fullNums * value;
    			if (value > -1 && textView.getTypeface().getStyle() != Typeface.BOLD) {
    				textView.getPaint().setStrokeWidth(targetLevel);
    				textView.getPaint().setStyle(Paint.Style.FILL_AND_STROKE);
    				map.put(textView, value);
    			}
    		}
    		return view;
    
    	}
    
    	public void generateTvBold(float percent, Context context) {
    		//我的项目是以dp的1/10为最大的等级,最低等级是0即正常字体(不加粗),
    		//然后在1/10的基础上再划分为4个等级
    		float density = getDensity(context);
    		TextView textView = null;
    		for (Map.Entry<TextView, Integer> entry : map.entrySet()) {
    			textView = entry.getKey();
    			float textSize = textView.getTextSize();
    			int dp = (int) (textSize / density);
    			float fullNums = dp / percent;
    			int value = entry.getValue();
    			float targetLevel = fullNums * value;
    			textView.getPaint().setStrokeWidth(targetLevel);
    			textView.getPaint().setStyle(Paint.Style.FILL_AND_STROKE);
    			textView.invalidate();
    		}
    
    	}
    
    	private View createSDKView(String name, Context context, AttributeSet
    			attrs) {
    		//如果包含 . 则不是SDK中的view 可能是自定义view包括support库中的View
    		if (-1 != name.indexOf('.')) {
    			return null;
    		}
    		//不包含就要在解析的 节点 name前,拼上: android.widget. 等尝试去反射
    		for (int i = 0; i < mClassPrefixList.length; i++) {
    			View view = createView(mClassPrefixList[i] + name, context, attrs);
    			if (view != null) {
    				return view;
    			}
    		}
    		return null;
    	}
    
    	/**
    	 * @param name
    	 * @param context
    	 * @param attrs   反射创建view
    	 * @return
    	 */
    	private View createView(String name, Context context, AttributeSet
    			attrs) {
    		Constructor<? extends View> constructor = findConstructor(context, name);
    		try {
    			return constructor.newInstance(context, attrs);
    		} catch (Exception e) {
    		}
    		return null;
    	}
    
    	private Constructor<? extends View> findConstructor(Context context, String name) {
    		Constructor<? extends View> constructor = mConstructorMap.get(name);
    		if (constructor == null) {
    			try {
    				Class<? extends View> clazz = context.getClassLoader().loadClass
    						(name).asSubclass(View.class);
    				constructor = clazz.getConstructor(mConstructorSignature);
    				mConstructorMap.put(name, constructor);
    			} catch (Exception e) {
    			}
    		}
    		return constructor;
    	}
    
    	private float getDensity(Context context) {
    		return context.getResources().getDisplayMetrics().density;
    	}
    
    }
    
    1. 在activity的onCreate函数的setContentView之前设置使用我们自定义的layoutFactory2
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		LayoutInflaterCompat.setFactory2(getLayoutInflater(), CustomFactory());
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    	}
    
    展开全文
  • 2015-07-20, 22:11:21建議再將Thin及Black字型加入,就更完整了!fonts.xml代碼:NotoSansHans-Thin.otfNotoSansHans-Light.otfNotoSansHans-Regular.otfNotoSansHans-Medium.otfNotoSansHans-Bold.otfNotoSansHans-...

    2015-07-20, 22:11:21

    建議再將Thin及Black字型加入,就更完整了!

    fonts.xml

    代碼:

    NotoSansHans-Thin.otf

    NotoSansHans-Light.otf

    NotoSansHans-Regular.otf

    NotoSansHans-Medium.otf

    NotoSansHans-Bold.otf

    NotoSansHans-Black.otf

    NotoSansHant-Thin.otf

    NotoSansHant-Light.otf

    NotoSansHant-Regular.otf

    NotoSansHant-Medium.otf

    NotoSansHant-Bold.otf

    NotoSansHant-Black.otf

    當然在"fallback_fonts.xml"內也要加入:

    fallback_fonts.xml

    代碼:

    NotoSansHans-Thin.otf

    NotoSansHans-Light.otf

    NotoSansHans-Regular.otf

    NotoSansHans-Medium.otf

    NotoSansHans-Bold.otf

    NotoSansHans-Black.otf

    NotoSansHant-Thin.otf

    NotoSansHant-Light.otf

    NotoSansHant-Regular.otf

    NotoSansHant-Medium.otf

    NotoSansHant-Bold.otf

    NotoSansHant-Black.otf

    展开全文
  • 第一种情况:从哪儿到哪儿固定的换文字颜色//XXXXXXX MMMMM是你自定义的文字 即从后端接口获得的变换文字String warehouseIn ="XXXXXXX";String warehouseOut = "MMMMM";String insertedNumStr = mContext.getString...

    第一种情况:从哪儿到哪儿固定的换文字颜色

    //XXXXXXX MMMMM是你自定义的文字 即从后端接口获得的变换文字

    String warehouseIn ="XXXXXXX";

    String warehouseOut = "MMMMM";

    String insertedNumStr = mContext.getString(R.string.ex_warehouse_in,warehouseOut,warehouseIn);

    //字体大小颜色不同

    SpannableString spannableString = new SpannableString(insertedNumStr);

    spannableString.setSpan(new ForegroundColorSpan(Color.parseColor("#0F41A6")), 3, warehouseOut.length()+3, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);

    spannableString.setSpan(new ForegroundColorSpan(Color.parseColor("#44D7B6")), insertedNumStr.lastIndexOf(":")+1, insertedNumStr.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);

    holder.tvExIn.setText(spannableString);

    第二种情况:部分指定文字规定颜色:

    SpannableString spannableString = new SpannableString(insertedNumStr);

    spannableString.setSpan(new ForegroundColorSpan(Color.parseColor("#0F41A6")), 6, insertedNumStr.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);

    holder.tvOrderNumber.setText(spannableString);

    第三种情况:直接指定某段文字颜色:

    //设置文字颜色

    holder.tvGoodsNumber.setTextColor(ContextCompat.getColor(mContext,R.color.colorHint));

    holder.TVSupplier.setTextColor(ContextCompat.getColor(mContext,R.color.colorHint));

    前两种都需要计算起止位置,左含右不含原理.

    展开全文
  • 随着时代的发展,Android的状态栏都不是乌黑一片了,在Android4.4之后我们可以修改状态栏的颜色或者让我们自己的View延伸到状态栏下面。我们可以进行更多的定制化了,然而有的时候我们使用的是淡色的颜色比如白色,...

    随着时代的发展,Android的状态栏都不是乌黑一片了,在Android4.4之后我们可以修改状态栏的颜色或者让我们自己的View延伸到状态栏下面。我们可以进行更多的定制化了,然而有的时候我们使用的是淡色的颜色比如白色,由于状态栏上面的文字为白色,这样的话状态栏上面的文字就无法看清了。因此本文提供一些解决方案,可以是MIUI6+,Flyme4+,Android6.0+支持切换状态栏的文字颜色为暗色。

    修改MIUI

    public static boolean setMiuiStatusBarDarkMode(Activity activity, boolean darkmode) {

    Class extends Window> clazz = activity.getWindow().getClass();

    try {

    int darkModeFlag = 0;

    Class> layoutParams = Class.forName("android.view.MiuiWindowManager$LayoutParams");

    Field field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE");

    darkModeFlag = field.getInt(layoutParams);

    Method extraFlagField = clazz.getMethod("setExtraFlags", int.class, int.class);

    extraFlagField.invoke(activity.getWindow(), darkmode ? darkModeFlag : 0, darkModeFlag);

    return true;

    } catch (Exception e) {

    e.printStackTrace();

    }

    return false;

    }

    上面为小米官方提供的解决方案,主要为MIUI内置了可以修改状态栏的模式,支持Dark和Light两种模式。

    修改Flyme

    public static boolean setMeizuStatusBarDarkIcon(Activity activity, boolean dark) {

    boolean result = false;

    if (activity != null) {

    try {

    WindowManager.LayoutParams lp = activity.getWindow().getAttributes();

    Field darkFlag = WindowManager.LayoutParams.class

    .getDeclaredField("MEIZU_FLAG_DARK_STATUS_BAR_ICON");

    Field meizuFlags = WindowManager.LayoutParams.class

    .getDeclaredField("meizuFlags");

    darkFlag.setAccessible(true);

    meizuFlags.setAccessible(true);

    int bit = darkFlag.getInt(null);

    int value = meizuFlags.getInt(lp);

    if (dark) {

    value |= bit;

    } else {

    value &= ~bit;

    }

    meizuFlags.setInt(lp, value);

    activity.getWindow().setAttributes(lp);

    result = true;

    } catch (Exception e) {

    }

    }

    return result;

    }

    同理使用跟miui类似的方式

    修改Android6.0+

    Android 6.0开始,谷歌官方提供了支持,在style属性中配置android:windowLightStatusBar

    即可, 设置为true时,当statusbar的背景颜色为淡色时,statusbar的文字颜色会变成灰色,为false时同理。

    @color/status_bar_color

    false

    以上就是Android系统更改状态栏字体颜色的相关代码,希望对大家的学习有所帮助。

    时间: 2016-01-07

    展开全文
  • ] App运行环境说明 [Android版本号] [iOS版本号] [手机型号] [模拟器型号] 附件 [IDE问题请提供HBuilderX运行日志。菜单帮助-查看运行日志,点右键打开文件所在目录,将log文件压缩成zip包上传] [App问题请提供可...
  • 字重对应的值 字重: 100 - Thin 200 - Extra Light (Ultra Light) 300 - Light 400 - Regular (Normal、Book、Roman) 500 - Medium 600 - Semi Bold (Demi Bold) 700 - Bold 800 - Extra Bold (Ultra Bold) 900 - ...
  • Android TextView设置字体粗细只有三种状态,textStyle取值只有bold、nomral、italic、客户需求是字体是medium粗细,只因ios是有medium属性,Android被要求要一样;要实现这种方式,我们可以换另外一种思想去做,...
  • 权重是依照比例分配屏幕的剩余空间对这句话不理解的能够看下图假如我们希望剩余的空间平分给空间1 和空间2 ,我们分别在2个控件的设置android:layout_weight="1"上面算是对权重的分析,详细使用方法例如以下先看一段...
  • 编辑:是的,字体通常是非常专门针对不同的权重绘,至少对于精心设计的字体.如果您只是寻找类似人造粗体样式(如Photoshop或Office适用于没有定义粗体样式的字体),您可能可以使用TextPaint类,并设置FAKE_BOLD_TEXT_...
  • 一、自定义字体1.android Typeface使用TTF字体文件设置字体我们可以在程序中放入ttf字体文件,在程序中使用Typeface设置字体。第一步,在assets目录下新建fonts目录,把ttf字体文件放到这。第二步,程序中调用:...
  • package ...import android.content.Context;import android.content.res.AssetManager;import android.graphics.Typeface;import java.io.IOException;import java.util.ArrayList;import ...
  • 本文实例为大家分享了Android字母导航栏的具体代码,供大家参考,具体内容如下效果实现逻辑明确需求字母导航栏在实际开发中还是比较多见的,城市选择、名称选择等等可能需要到。 现在要做到的就是在滑动控件过程中...
  • /*** Created by dingchao on 2018/3/27.*/public class DcTextViewRunNumber extendsTextView {/*** 延迟*/private final int DELAY = 20;/*** 保留小数位数 默认2为*/private final int DECIMALS_COUNT = 2;...
  • 在ondraw()方法中绘制元素:文字、横线、短竖线和圆形标记 重写onmeasure()方法,控制整体大小和边界 在ontouchevent()方法中处理action_down和action_move事件,调用invalidate()方法引起view的绘,以更新视图 ...
  • } } 就是简单的绘制了一行。 疑问 为什么这里要继承自AppCompatTextView而不是View? 答:偷个懒而已,因为不用在我来测量View,直接用父类的就行 来看看效果顺便也看看布局: 出现问题 文字并没有显示。 答:...
  • 先看下面图片:这是我在做登录页面的时候,调用系统的progressdialog 进行等待,可是看起来很不协调,左边的等待图片过大,右边文字过小,看起来老别扭,虽然功能上不存在什么问题,但是我有强迫症,看不顺的就像弄...
  • 用了一段时间 Android手机之后,不禁对系统中的字体产生了兴趣。因为看起来,Android 中使用的中文字体和 Windows中使用的“微软雅黑”很像,我一度怀疑 Android中使用的就是这个字体。今天有时间,就一探究竟吧。...
  • 关於android控件

    2021-06-09 05:24:39
    今天Android123通过DigitalClock类讲解下Android平台下自绘TextView类,演示下相关的Handler、Runnable线程和Observer观察者类。首先我们回忆下上次 Android自定义View实例AnalogClock源码 一文中的自绘控件,上次...
  • 此外,在任意一个Activity中如上覆盖了getResources方法后,会让其它Activity的字体也变的独立于系统配置(这里的Activity只针对重新create的,如当前 Activity 的 fragment,因为没有重新onCreate,就不会绘进而...
  • 由于在android 中的Html源码中对html标签的支持不是很完全,在使用textview加载html自定义字体样式的时候遇到坑了,就是font标签不支持size属性,查看源码中发现没有去解析size属性// Html源码部分private static ...
  • } private void initAnimation() { //根据属性动画值绘数字 valueAnimator = ValueAnimator.ofFloat(0,1).setDuration(autoSpeed); valueAnimator.addUpdateListener(new ValueAnimator....
  • 微信七彩字体一款方便的手机字体更换软件,微信炫彩软件集合了上百款优质中文美化字体,微信七彩发光里有可爱的喵呜体、卡通体,清秀的静蕾体等多种字体。软件介绍微信、qq上最好用、最个性的聊天字体应用,让你...
  • 我一直想把“如何评价思源黑体 (Source Han Sans) 族?”过于冗长的部分独立出来,同时也想为自己折腾的历程做个总结,所以又写了这篇答案。适用于 Android 5.x 以上,基于思源黑体 1.004 版本:背景:Google 已经...
  • android,view的

    2021-01-12 17:55:03
    ============问题描述============mars数独制作视频,页面绘的时候出现了问题,“Unfortunately,shudu08hasstopped.”感觉是某个xml文件没有配置好,求高手帮助纠正错误,顺便告诉下android运行的基本流程。...
  • android 字体修改

    2021-05-26 08:01:42
    android字体的设置有以下方法:1)直接在代码设置TypefacecustomFont=Typeface.createFromAsset(this.getAssets(),"1.ttf");TextViewtextview1=(TextView)findViewById(R.id.activity_main_header);textview1....
  • 安卓平板电脑系统装图解教程

    千次阅读 2021-06-04 03:14:03
    微信圈的朋友都在刷圈子说遇到系统故障都不知道安卓平板电脑系统装要怎么操作,那么安卓平板电脑装系统最简单的方法是怎样的,有没有最快捷的安卓平板电脑系统装方式,太着急了。不担心,小编知道的安卓平板...
  • } } 3、不从界面,单纯从逻辑考虑,当用户向某一方向移动时,其实就是不断遍历再判断,表的遍历需要两for循环,根据方向从方向的最前面开始,一个一个判断是不是0(0表示空白),从而判断能不能移动,然后判断...
  • 其实技术含量不是很高,就算是记录一下吧 实现思路 本来字母检索打算用listview展示,但是网上查了一通资料后发现基本上都是使用的自定义view展示,想也对,字母检索会被频繁的刷新,如果用listview的话,感觉太了...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 51,576
精华内容 20,630
关键字:

安卓字重