我在使用Xamarin.Forms的Android应用程序中显示了.GIF动画的问题吗?

发布于 2025-02-01 19:24:32 字数 4588 浏览 1 评论 0原文

上面的标题是指。

.GIF动画(大约2秒钟)在登录屏幕之前几乎在飞溅屏幕中几乎没有显示。

这是我的splashlayout.xaml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"    
>

<com.felipecsl.gifimageview.library.GifImageView
    android:id="@+id/myGIFImage"
    android:layout_gravity="center"
    android:scaleType="fitCenter"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
</LinearLayout>

这是我的splash_activity.cs:

using AbuseAlert.Droid;
using Android.App;
using Android.OS;
using Felipecsl.GifImageViewLibrary;
using System.IO;

namespace Abuse_Alert.Droid
{
    [Activity(Theme = "@style/Theme.Splash", MainLauncher = true, NoHistory = true, 
Label = "AbuseAlert")]

public class SplashActivity : Activity
{        
    GifImageView myGIFImage;

    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);

        SetContentView(Resource.Layout.SplashLayout);

        System.Threading.ThreadPool.QueueUserWorkItem(o => LoadActivity());
    }

    private void LoadActivity()
    {
        //System.Threading.Thread.Sleep(2000); // Simulate a long pause
                                             // 
        RunOnUiThread(() => StartActivity(typeof(MainActivity)));
    }

    public override void OnWindowFocusChanged(bool hasFocus)
    {
        myGIFImage = FindViewById<GifImageView>(Resource.Id.myGIFImage);

        // From Drawable
        Stream input = Resources.OpenRawResource(Resource.Drawable.AbuseAlert);

        // You should convert the "input" into Byte Array 
        byte[] bytes = ConvertByteArray(input);

        myGIFImage.SetBytes(bytes);
        myGIFImage.StartAnimation();
    }
    private byte[] ConvertByteArray(Stream input)
    {
        byte[] buffer = new byte[16 * 1024];
        using MemoryStream ms = new MemoryStream();
        int read;
        while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
            ms.Write(buffer, 0, read);
        return ms.ToArray();
    }
}
}

这是我的mainActivity.cs

using System;
using Android.App;
using Android.Content.PM;
using Android.Runtime;
using Android.OS;
using AndroidX.Core.App;
using AndroidX.Core.Content;
using MediaManager;
using Android;
using LibVLCSharp.Forms.Shared;
using Android.Content;
using System.Threading.Tasks;
using Xamarin.Forms;
using Android.Gms.Extensions;
using Plugin.Toast;

[assembly: Dependency(typeof(FirebaseAuthenticator))]

namespace AbuseAlert.Droid
{

[Activity(Label = "AbuseAlert", Icon = "@drawable/icon", Theme = "@style/MainTheme", 
MainLauncher = false, ConfigurationChanges = ConfigChanges.ScreenSize | 
 ConfigChanges.Orientation)]

public class MainActivity : 
global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
    public event EventHandler<ActivityResultEventArgs> ActivityResult = delegate { };
    protected override void OnCreate(Bundle savedInstanceState)
    {
        TabLayoutResource = Abuse_Alert.Droid.Resource.Layout.Tabbar;
        ToolbarResource = Abuse_Alert.Droid.Resource.Layout.Toolbar;

        base.OnCreate(savedInstanceState);
        
        CrossMediaManager.Current.Init(this);

        LibVLCSharpFormsRenderer.Init();

        Xamarin.Essentials.Platform.Init(this, savedInstanceState);
        global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
        LoadApplication(new App());

        if (ContextCompat.CheckSelfPermission(this, Manifest.Permission.RecordAudio) != Permission.Granted)
        {
            ActivityCompat.RequestPermissions(this, new String[] { Manifest.Permission.RecordAudio }, 1);
        }

        FormsVideoPlayer.Init();
    }
    public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
    {
        Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);

        base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
    }

    protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
    {
        ActivityResult(this, new ActivityResultEventArgs
        {
            RequestCode = requestCode,
            ResultCode = resultCode,
            Data = data
        });

    }

},

那么,是什么原因导致我的.gif文件(abusealert.gif),它已经在资源/可绘制文件夹中不正确呈现呢?

The above header refers.

The .gif animation (which is about 2 seconds) hardly displays at all in the splash screen before it gets to the login screen.

This is my SplashLayout.xaml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"    
>

<com.felipecsl.gifimageview.library.GifImageView
    android:id="@+id/myGIFImage"
    android:layout_gravity="center"
    android:scaleType="fitCenter"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
</LinearLayout>

This is my Splash_Activity.cs:

using AbuseAlert.Droid;
using Android.App;
using Android.OS;
using Felipecsl.GifImageViewLibrary;
using System.IO;

namespace Abuse_Alert.Droid
{
    [Activity(Theme = "@style/Theme.Splash", MainLauncher = true, NoHistory = true, 
Label = "AbuseAlert")]

public class SplashActivity : Activity
{        
    GifImageView myGIFImage;

    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);

        SetContentView(Resource.Layout.SplashLayout);

        System.Threading.ThreadPool.QueueUserWorkItem(o => LoadActivity());
    }

    private void LoadActivity()
    {
        //System.Threading.Thread.Sleep(2000); // Simulate a long pause
                                             // 
        RunOnUiThread(() => StartActivity(typeof(MainActivity)));
    }

    public override void OnWindowFocusChanged(bool hasFocus)
    {
        myGIFImage = FindViewById<GifImageView>(Resource.Id.myGIFImage);

        // From Drawable
        Stream input = Resources.OpenRawResource(Resource.Drawable.AbuseAlert);

        // You should convert the "input" into Byte Array 
        byte[] bytes = ConvertByteArray(input);

        myGIFImage.SetBytes(bytes);
        myGIFImage.StartAnimation();
    }
    private byte[] ConvertByteArray(Stream input)
    {
        byte[] buffer = new byte[16 * 1024];
        using MemoryStream ms = new MemoryStream();
        int read;
        while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
            ms.Write(buffer, 0, read);
        return ms.ToArray();
    }
}
}

This is my MainActivity.cs

using System;
using Android.App;
using Android.Content.PM;
using Android.Runtime;
using Android.OS;
using AndroidX.Core.App;
using AndroidX.Core.Content;
using MediaManager;
using Android;
using LibVLCSharp.Forms.Shared;
using Android.Content;
using System.Threading.Tasks;
using Xamarin.Forms;
using Android.Gms.Extensions;
using Plugin.Toast;

[assembly: Dependency(typeof(FirebaseAuthenticator))]

namespace AbuseAlert.Droid
{

[Activity(Label = "AbuseAlert", Icon = "@drawable/icon", Theme = "@style/MainTheme", 
MainLauncher = false, ConfigurationChanges = ConfigChanges.ScreenSize | 
 ConfigChanges.Orientation)]

public class MainActivity : 
global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
    public event EventHandler<ActivityResultEventArgs> ActivityResult = delegate { };
    protected override void OnCreate(Bundle savedInstanceState)
    {
        TabLayoutResource = Abuse_Alert.Droid.Resource.Layout.Tabbar;
        ToolbarResource = Abuse_Alert.Droid.Resource.Layout.Toolbar;

        base.OnCreate(savedInstanceState);
        
        CrossMediaManager.Current.Init(this);

        LibVLCSharpFormsRenderer.Init();

        Xamarin.Essentials.Platform.Init(this, savedInstanceState);
        global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
        LoadApplication(new App());

        if (ContextCompat.CheckSelfPermission(this, Manifest.Permission.RecordAudio) != Permission.Granted)
        {
            ActivityCompat.RequestPermissions(this, new String[] { Manifest.Permission.RecordAudio }, 1);
        }

        FormsVideoPlayer.Init();
    }
    public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
    {
        Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);

        base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
    }

    protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
    {
        ActivityResult(this, new ActivityResultEventArgs
        {
            RequestCode = requestCode,
            ResultCode = resultCode,
            Data = data
        });

    }

}

So, what is causing my .gif file (AbuseAlert.gif) which is already in the resources/drawable folder not to render properly?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文