performance - xamarin 表单动态添加自定义字体标签到 ScrollView 非常慢

标签 performance mobile xamarin xamarin.forms

所以我有一个水平 ScrollView ,我试图在用户执行特定操作时动态填充它。我放入 View 中的每个项目都包含 4 个使用自定义字体的标签。当我尝试添加大约 10 个这些项目时,它在 android 上滞后了大约 1.5 秒,在 IOS 上滞后了 1 秒。如果我取出自定义字体,那么它在每个平台上大约需要 1 秒。如果我取出 3 个标签并只显示一个,那么它几乎是瞬间的。有什么已知的滞后原因吗?有没有什么办法可以让我仍然可以使用自定义字体而不会出现很大的延迟?

这是我制作的一个快速示例,它几乎可以完成我在我的应用程序中所做的事情。然而,我的应用程序有更多的东西,所以这里的延迟不是那么糟糕,但它仍然非常明显

public class App : Application
{
    public int count;
    public ScrollView scroll, scroll2, scroll3;
    public App ()
    {
        count = 1;
        scroll = new ScrollView {
            VerticalOptions = LayoutOptions.Center,
            Orientation = ScrollOrientation.Horizontal
        };
        scroll2 = new ScrollView {
            VerticalOptions = LayoutOptions.Center,
            Orientation = ScrollOrientation.Horizontal
        };
        Button button = new Button(){
            Text = "click",
        };
        button.Clicked += (sender, e) => AddStuff();
        Button button2 = new Button(){
            Text = "click",
        };
        button2.Clicked += (sender, e) => AddStuff2();
        MainPage = new ContentPage {
            BackgroundColor = Color.White,
            Content = new StackLayout{
                Children={
                    button,
                    scroll,
                    button2,
                    scroll2
                }
            }
        };
    }
    //this one is instantaneous
    public void AddStuff()
    {
        StackLayout stack = new StackLayout () {
            Orientation = StackOrientation.Horizontal,
            HorizontalOptions = LayoutOptions.FillAndExpand,
            HeightRequest = 200,
        };
        for (int i = 0; i < 11; i++)
            stack.Children.Add (
                new StackLayout(){
                    Children = {
                        new Label (){TextColor = Color.Blue, Text = "Size: ", WidthRequest = 100 },
                    }
                }
            );
        scroll.Content = stack;
        count++;
    }
    //this one takes forever
    public void AddStuff2()
    {
        StackLayout stack = new StackLayout () {
            Orientation = StackOrientation.Horizontal,
            HorizontalOptions = LayoutOptions.FillAndExpand,
            HeightRequest = 200,
        };
        for (int i = 0; i < 11; i++)
            stack.Children.Add (
                new StackLayout(){
                    Children = {
                        new Label (){TextColor = Color.Blue, Text = "Size: ", WidthRequest = 100 },
                        new Label (){TextColor = Color.Blue, Text ="" + count*i, WidthRequest = 100 },
                        new Label (){TextColor = Color.Blue, Text = "Size: ", WidthRequest = 100 },
                        new Label (){TextColor = Color.Blue, Text ="" + count*i, WidthRequest = 100 }
                    }
                }
            );
        scroll2.Content = stack;
        count++;
    }
}

和机器人的自定义字体标签

[assembly: ExportRenderer (typeof (Label), typeof (CustomFontLabel_Droid))]
    namespace df.Droid
    {
        public class CustomFontLabel_Droid:LabelRenderer
        {
            protected override void OnElementChanged (ElementChangedEventArgs<Xamarin.Forms.Label> e) {
                base.OnElementChanged (e);
                var label = (TextView)Control;
                Typeface font = Typeface.CreateFromAsset (Forms.Context.Assets, "SourceSansPro-Semibold.otf");
                label.Typeface = font;
            }
        }
    }

最佳答案

以防万一其他人遇到类似的问题,如果您在 android MainActivity 中创建一个静态字体属性,而不是每次都在 Label.OnElementChanged 函数中调用 createFromAsset,那么它会消除 android 上的额外延迟。

CustomFontLabel_Droid.cs

[assembly: ExportRenderer (typeof (Label), typeof (CustomFontLabel_Droid))]
namespace df.Droid
{
    public class CustomFontLabel_Droid:LabelRenderer
    {
        protected override void OnElementChanged (ElementChangedEventArgs<Xamarin.Forms.Label> e) {
            base.OnElementChanged (e);
            var label = (TextView)Control;
            // this guy slows things down-> Typeface font = Typeface.CreateFromAsset (Forms.Context.Assets, "SourceSansPro-Semibold.otf");
            label.Typeface = MainActivity.semiBoldFont;
        }
    }
}

主事件.cs

public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsApplicationActivity
    {
        public static Typeface semiBoldFont = null;
        protected override void OnCreate (Bundle bundle)
        {
            base.OnCreate (bundle);
            global::Xamarin.Forms.Forms.Init (this, bundle);
            LoadApplication (new App ());
            semiBoldFont = Typeface.CreateFromAsset (Forms.Context.Assets, "SourceSansPro-Semibold.otf");
        }
    }

关于performance - xamarin 表单动态添加自定义字体标签到 ScrollView 非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32746358/

相关文章:

sql-server - SQL Server并发访问

android - Android 上的自定义字体会降低性能吗?

java - 是否需要不基于 Spring/Tomcat 的 Java 7 云服务器框架?

xamarin - Xamarin.Forms 和 Xamarin Native 有什么区别?

android - Xamarin.Forms 如何显示互联网连接已更改?

c# - Windows Server 2019 上的 Xamarin 模拟器

java 数组双端队列大小与性能

java - 将大样本放在二叉搜索树上(不平衡)

css - 单独使用 CSS 或最少 JS 的移动 UI 控件?

二郎 : Which is more efficient in this scenario - using try catch or case statements?