Shell 上的 FontFamily -> TabBar -> Tab -> Title
Posted
技术标签:
【中文标题】Shell 上的 FontFamily -> TabBar -> Tab -> Title【英文标题】:FontFamily on Shell -> TabBar -> Tab -> Title 【发布时间】:2019-09-22 05:38:19 【问题描述】:有没有办法设置这个字体系列?我无法找到如何做到这一点。我可以通过什么方式实现它?
【问题讨论】:
可以吗? 【参考方案1】:由于我没有找到要设置的直接属性,这里我使用自定义渲染来实现它(适用于 android):
在 Droid 项目中创建一个 AndroidShell.cs:
[assembly: ExportRenderer(typeof(ShellTest.AppShell), typeof(AndroidShell))]
namespace ShellTest.Droid
class AndroidShell : ShellRenderer
public AndroidShell(Context context) : base(context)
protected override IShellBottomNavViewAppearanceTracker CreateBottomNavViewAppearanceTracker(ShellItem shellItem)
return new MyBottomNavigationView(this);
创建 MyBottomNavigationView.cs :
internal class MyBottomNavigationView: IShellBottomNavViewAppearanceTracker
private AndroidShell androidShell;
public MyBottomNavigationView(AndroidShell androidShell)
this.androidShell = androidShell;
public void Dispose()
public void ResetAppearance(BottomNavigationView bottomView)
IMenu menu = bottomView.Menu;
for (int i = 0; i < bottomView.Menu.Size(); i++)
IMenuItem menuItem = menu.GetItem(i);
var title = menuItem.TitleFormatted;
Typeface typeface = Typeface.CreateFromAsset(MainActivity.Instance.Assets, "HYXuJingXingKaiW.ttf");
SpannableStringBuilder sb = new SpannableStringBuilder(title);
sb.SetSpan(new CustomTypefaceSpan("",typeface), 0, sb.Length(), SpanTypes.InclusiveInclusive);
menuItem.SetTitle(sb);
public void SetAppearance(BottomNavigationView bottomView, ShellAppearance appearance)
创建 CustomTypefaceSpan.cs:
class CustomTypefaceSpan :TypefaceSpan
private Typeface newType;
public CustomTypefaceSpan(String family, Typeface type) : base(family)
newType = type;
public override void UpdateDrawState(TextPaint ds)
applyCustomTypeFace(ds,newType);
public override void UpdateMeasureState(TextPaint paint)
applyCustomTypeFace(paint,newType);
private static void applyCustomTypeFace(Paint paint, Typeface tf)
TypefaceStyle oldStyle;
Typeface old = paint.Typeface;
if (old == null)
oldStyle = 0;
else
oldStyle = old.Style;
TypefaceStyle fake = oldStyle & ~tf.Style;
if ((fake & TypefaceStyle.Bold) != 0)
paint.FakeBoldText = true;
if ((fake & TypefaceStyle.Italic) != 0)
paint.TextSkewX = -0.25f;
paint.SetTypeface(tf);
和 HYXuJingXingKaiW.ttf 放在 Resources/Assets 中,带有 BuildAction:AndroidAsset
在 ios 中,您可以尝试在 AppDelegate.cs 中添加:
UITabBarItem.Appearance.SetTitleTextAttributes(new UITextAttributes() Font=UIFont.FromName("HYXuJingXingKaiW.ttf",14), ,UIControlState.Normal);
UITabBarItem.Appearance.SetTitleTextAttributes(new UITextAttributes() Font = UIFont.FromName("HYXuJingXingKaiW.ttf", 14), , UIControlState.Selected);
HYXuJingXingKaiW.ttf 被放入Resources
【讨论】:
非常感谢。我必须设置代码,将 ResetAppearance 方法的代码复制到 SetAppearance 并且它可以工作。它清除了我在 XAML 中设置的字体颜色和背景颜色。我想我需要在渲染器上设置它。我是对的? @GeorgeMR 是的,你可以使用sb.SetSpan(new ForegroundColorSpan(Android.Graphics.Color.Red), 0, sb.Length(), SpanTypes.InclusiveInclusive);
设置颜色
谢谢利奥。你太棒了。
@GeorgeMR 如果回答对你有帮助,可以标记一下吗,谢谢
@GeorgeMR 您可以尝试使用自定义渲染器的底部导航【参考方案2】:
Leo Zhu 的回答是正确的,但直到我将 ResetAppearance(bottomView)
放入 SetAppearance
方法后才对我有用。我把这个:if (title == null) continue;
放在ResetAppearance
方法中。
首先,在您的Android文件夹中,您需要将internal static MainActivity Instance get; private set;
添加到MainActivity.cs
中的MainActivity
类,并在同一类中的OnCreate
方法中通过Instance = this;
对其进行初始化。
public void SetAppearance(BottomNavigationView bottomView, IShellAppearanceElement appearance)
ResetAppearance(bottomView);
public void ResetAppearance(BottomNavigationView bottomView)
IMenu menu = bottomView.Menu;
for (int i = 0; i < bottomView.Menu.Size(); i++)
IMenuItem menuItem = menu.GetItem(i);
var title = menuItem.TitleFormatted;
if (title == null) continue;
Typeface typeface = Typeface.CreateFromAsset(MainActivity.Instance.Assets, "HYXuJingXingKaiW.ttf");
SpannableStringBuilder sb = new SpannableStringBuilder(title);
sb.SetSpan(new CustomTypefaceSpan("",typeface), 0, sb.Length(), SpanTypes.InclusiveInclusive);
menuItem.SetTitle(sb);
【讨论】:
以上是关于Shell 上的 FontFamily -> TabBar -> Tab -> Title的主要内容,如果未能解决你的问题,请参考以下文章
react-native android fontFamily 不生效
React Native - Expo:fontFamily 'SimpleLineIcons' 不是系统字体,尚未通过 Font.loadAsync 加载
如何在 Android 中更改 TextView 的 fontFamily