为什么自定义字体在启动应用程序时仅在几毫秒后出现?渲染问题?- Android Studio

anauzrmj  于 2023-04-12  发布在  Android
关注(0)|答案(2)|浏览(135)

我有一个应用程序,它有一个启动屏幕,然后是主活动,其中有一些TextViews。
我使用的字体家族“aladin”,我已经选择了从 * 属性〉字体家族〉更多字体... *。
问题是,当我启动我的应用程序时,启动屏幕正确显示,但当我的主要活动跟随时,在一毫秒内你可以看到我的TextView中的字体从“默认”跳到阿拉丁。
换句话说,似乎阿拉丁字体渲染/加载的时间太长了。
我该怎么做?
我已经尝试过将文本大小从sp改为dp,但这并不能解决我的问题。
阿拉丁字体应该立即出现,而不是一毫秒后,它只是不好看。
先谢谢你了。

<TextView
        android:id="@+id/textViewItem"
        android:layout_width="200dp"
        android:layout_height="100dp"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="0dp"

        android:fontFamily="@font/aladin"

        android:gravity="center|center_horizontal"
        android:textColor="#000000"
        android:textSize="26sp" />

**编辑:**这里是我的AndroidManifest.xml的一部分:

<activity
            android:name=".SplashActivity"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

        </activity>

        <activity
            android:name=".MainActivity"
            android:windowSoftInputMode="adjustPan"
            android:label="@string/app_name">

这是我的部分SplashActivity.java:

public class SplashActivity extends AppCompatActivity {

    private Handler mHandler;
    private Runnable mRunnable;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash);

        mRunnable = new Runnable() {
            @Override
            public void run() {
                startActivity(new Intent(getApplicationContext(), MainActivity.class));
                finish();
            }
        };

        mHandler=new Handler();

        mHandler.postDelayed(mRunnable, 1500);
    }

    @Override
    protected void onDestroy (){
        super.onDestroy();
        if(mHandler!=null && mRunnable !=null)
        mHandler.removeCallbacks(mRunnable);
    }
}
k75qkfdt

k75qkfdt1#

我也遇到过类似的问题;当应用程序启动时,文本会以默认字体显示几分之一秒,然后会以自定义字体重新绘制。这可能不会困扰大多数用户,但它肯定是显而易见的。
我还发现,一旦加载了自定义字体,随后的文本就会在不先显示默认字体的情况下绘制出来。
所以,我的工作方式是在启动画面显示时加载自定义字体。首先,准备自定义字体。

  1. res/font/ubuntu_mono.xml
<?xml version="1.0" encoding="utf-8"?>
<font-family xmlns:app="http://schemas.android.com/apk/res-auto"
    app:fontProviderAuthority="com.google.android.gms.fonts"
    app:fontProviderCerts="@array/com_google_android_gms_fonts_certs"
    app:fontProviderPackage="com.google.android.gms"
    app:fontProviderQuery="Ubuntu Mono">
</font-family>
  1. res/value/preloaded_fonts.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <array name="preloaded_fonts" translatable="false">
        <item>@font/ubuntu_mono</item>
    </array>
</resources>
  1. AndroidManifest.xml
...

    <meta-data
        android:name="preloaded_fonts"
        android:resource="@array/preloaded_fonts" />

然后在启动画面的布局中,添加一个没有文本的TextView。这将加载自定义字体,当主屏幕显示时,自定义字体将准备就绪。

  1. res/layout/splash.xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/constraint_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        ...

        <TextView
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:text=""
            app:fontFamily="@font/ubuntu_mono"             <-- custom font
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent" />
    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>
yzckvree

yzckvree2#

一些字体的大小很大,所以它们需要一些时间来加载,即几毫秒,有一个简单的解决方案是通过创建Typeface类的示例,在它们出现在UI中之前以编程方式加载字体:例如,如果你要使用一种名为“aladin”的特定字体,请执行以下操作:

//First you need to initialize and hook your textview
TextView textView;
textView = findViewById(R.id.textViewItem);

//initialize the font from ressources
Typeface typeFace = ResourcesCompat.getFont(getApplicationContext(),R.font.aladin);
//set the font to the textview
textView.setTypeface(typeFace);

现在,您可以避免从文件加载自定义字体时发生的延迟。这是因为字体由字体提供程序下载和缓存,因此在需要时可以更快地访问它。
希望这已经解决了你的问题:)

相关问题