如何在Xamarin.ios(C#,Xaml)中使我的动画更加流畅

sshcrbum  于 2023-09-28  发布在  iOS
关注(0)|答案(1)|浏览(96)

我尝试为一个无法完全适合Box View的标签自动滚动,因此我使用两个char列表,一个可见,另一个不可见,并将char从一个切换到另一个,这还t平滑在所有的原因我的标签跳转每个到左边的功能的字符的大小谁消失,所以我使用翻译X跳转到右边的功能的字符的大小谁消失和翻译为了使跳转变慢和控制,事实上我不能精确地知道字符的像素大小,所以我现在自己输入值,你有一个想法,我如何知道像素大小,或者如果你有另一个想法,使我的标签自动滚动。
我已经尝试了width,结果总是-1,我已经尝试调用TextRenderer.MesureText但不能使用它,我已经尝试了graphics.MeasureString但System.Drawing.Common在这个平台上不支持,也许我没有正确使用它们,如果你能帮助我,我真的很感激。

private async void StartAnimation3()
    {
        List<char> firstQueue = new List<char>();         //to stock what I d'ont display
        List<char> secondQueue = new List<char>();          //visible one 

        int initialX = (int)metroLabel.TranslationX; 
        int sizeStringVisble = 60;                                 //width of label I can display I suppose it's close to 60 chars
        firstQueue.AddRange(new char[] { ' ', '/', ' ' }); 
        string texteComplet = "Température bureau 20°C - 15000 lumens - Volets a 80%";      //my text

        foreach (char s in texteComplet)     //I fill my lists
        {
            if (secondQueue.Count < sizeStringVisble)
            { 
                secondQueue.Add(s);
            }
            else
            {
                firstQueue.Add(s);
            }  
        }
        
        if (secondQueue.Count < sizeStringVisble)   //fill them with space to reach the width of my label 
        {
            int nbEspace = sizeStringVisble - (secondQueue.Count);
            for (int i= 0; i < nbEspace; i++)
            {
                secondQueue.Add(' ');
            }
        }

        while (true)
        {
            if (secondQueue.Count < sizeStringVisble)    //I switch my chars
            {

                if (secondQueue.Count != 0)
                {
                    char s = secondQueue[0];
                    secondQueue.RemoveAt(0);
                    firstQueue.Add(s);
                }

                if (firstQueue.Count != 0)
                {
                    char s = firstQueue[0];
                    firstQueue.RemoveAt(0);
                    secondQueue.Add(s);
                }

            }
            else
            {
                char s = secondQueue[0];
                secondQueue.RemoveAt(0);
                firstQueue.Add(s);

            }

            if (firstQueue.Last() == ' ' || firstQueue.Last() == '/' || firstQueue.Last() == '°') 
            {
                metroLabel.TranslationX += 5;    //I suppose that this type of char are 5 pixels 
                await metroLabel.TranslateTo(initialX, metroLabel.TranslationY, 80);
                
            }
            else if (char.IsUpper(firstQueue.Last()) || firstQueue.Last() == '%')
            {
                metroLabel.TranslationX += 7;     //I suppose that this type of char are 7 pixels
                await metroLabel.TranslateTo(initialX, metroLabel.TranslationY, 175);
            }
            else
            {
                metroLabel.TranslationX += 6;    //I suppose that this type of char are 6 pixels
                await metroLabel.TranslateTo(initialX, metroLabel.TranslationY, 150);
            }

            metroLabel.Text = String.Join("", secondQueue.ToArray());
        }
i7uaboj4

i7uaboj41#

您可以尝试使用ScrollView Package 标签,

<AbsoluteLayout>
    <BoxView AbsoluteLayout.LayoutBounds="0, 10, 400, 50" />
    <ScrollView x:Name="myscroll" Orientation="Horizontal" HorizontalScrollBarVisibility="Never"
                WidthRequest="400"
                AbsoluteLayout.LayoutBounds="0, 20, AutoSize, AutoSize">
        <Label x:Name="label" Text="long text here......"
           FontSize="24"
           />
    </ScrollView>
</AbsoluteLayout>

由于ScrollView可以通过编程方式滚动,因此可以尝试使用
1.将图元滚动到视图中:这只是滚动标签到最后

await myscroll.ScrollToAsync(label, ScrollToPosition.End, true);

2.将职位滚动到视图中:从ScrollView顶部滚动到150个设备独立单位

await myscroll.ScrollToAsync(150, 0, true);

控制ScrollView的滚动。
希望能帮上忙!

相关问题