Просмотр GIF-изображений в Xamarin Android

#c# #xamarin #xamarin.android

#c# #xamarin #xamarin.android

Вопрос:

Я использую образец для воспроизведения GIF-файлов в своем приложении,

но методы start(), stop() и pause() не работают.

пример: введите описание ссылки здесь

пакет nuget: установка-пакет Karamunting.Android.Корал.AndroidGifDrawable

Это мой код введите описание изображения здесь

Спасибо, что помогли мне…

Ответ №1:

🎊 Добро пожаловать в SO 🎊

Это исключение возникает из-за того, что вы приводите неправильный объект к неправильному типу ( GifDrawable ).

Чтобы достичь того, чего вы хотите, вы должны сначала получить Drawable object, обратившись GifImageView.Drawable к property, а затем привести его к GifDrawable . Теперь вы можете правильно обращаться к этим методам ( .Stop() , .Start() ) .

Пример кода:

 var gifImageView0 = FindViewById<GifImageView>(Resource.Id.gif6);

var stop = FindViewById<Button>(Resource.Id.button1);
stop.Click  = (s, e) =>
{
    // 
    (gifImageView0.Drawable as GifDrawable)?.Stop();
};
  

Ответ №2:

Добро пожаловать в SO!

Я проверил Karamunting.Android.Корал.Похоже, что пакет Nuget, доступный для Android, не предоставляет руководств для Xamarin Android для его вызова. И есть только 721 загрузка. После тестирования на моем локальном сайте у него много ошибок при использовании его методов, совместно используемых с GitHub. Я думаю, потребуется больше времени для решения проблем, связанных с тем, что указанное приведение недопустимо.

введите описание изображения здесь

Поэтому я предлагаю установить Refractor.GifImageView от JamesMontemagno. Я проверил это на локальном сайте, и это так удобно.И вы можете обратиться к его GitHub, чтобы узнать, как использовать в Xamarin Android.

Установите его:

введите описание изображения здесь

Пример кода выглядит следующим образом:

 public class MainActivity : AppCompatActivity
{
    Felipecsl.GifImageViewLibrary.GifImageView gifImageView;
    //PL.DroidsOnRoids.Gif.GifImageView gifImageViewTrans;
    Button btnToggle;
    Button btnStart;
    Button btnStop;
    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        Xamarin.Essentials.Platform.Init(this, savedInstanceState);
        // Set our view from the "main" layout resource
        SetContentView(Resource.Layout.activity_main);

        gifImageView = FindViewById<Felipecsl.GifImageViewLibrary.GifImageView>(Resource.Id.gifImageView);
        //gifImageViewTrans = FindViewById<PL.DroidsOnRoids.Gif.GifImageView>(Resource.Id.gifImageView2);
        btnToggle = FindViewById<Button>(Resource.Id.btnToggle);
        btnStart = FindViewById<Button>(Resource.Id.btnStart);
        btnStop = FindViewById<Button>(Resource.Id.btnStop);


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

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

        gifImageView.SetBytes(bytes);
        gifImageView.StartAnimation();

        btnToggle.Click  = (sender, e) =>
        {
            try
            {
                if (gifImageView.IsAnimating)
                    gifImageView.StopAnimation();
                else
                    gifImageView.StartAnimation();
            }
            catch (Exception ex)
            {

            }
        };

        btnStart.Click  = BtnStart_Click;
        btnStop.Click  = BtnStop_Click;

    }

    private void BtnStop_Click(object sender, EventArgs e)
    {
        gifImageView.StopAnimation();
    }

    private void BtnStart_Click(object sender, EventArgs e)
    {
        gifImageView.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();
        }
    }
}
  

Эффект:

введите описание изображения здесь