程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了使用 MvvmCross 和 FFImageLoading 的 Xamarin Android 可见性绑定问题大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决使用 MvvmCross 和 FFImageLoading 的 Xamarin Android 可见性绑定问题?

开发过程中遇到使用 MvvmCross 和 FFImageLoading 的 Xamarin Android 可见性绑定问题的问题如何解决?下面主要结合日常开发的经验,给出你关于使用 MvvmCross 和 FFImageLoading 的 Xamarin Android 可见性绑定问题的解决方法建议,希望对你解决使用 MvvmCross 和 FFImageLoading 的 Xamarin Android 可见性绑定问题有所启发或帮助;

为了在我的应用程序(使用 Mvx 和 FFimageLoading 的 Xamarin AndroIDX)中​​创建一个动画加载器 UI 控件,我创建了一个继承自 @H_353_3@mvxCachedImageVIEw 的自定义控件。 然后我按如下方式应用我的动画:

public class LoaderVIEw : MvxCachedImageVIEw
    {
        protected LoaderVIEw(IntPtr javaReference,JniHandleownership transfer)
            : base(javaReference,transfer)
        {
            Create();
        }

        public LoaderVIEw(Context context)
            : base(context)
        {
            Create();
        }

        public LoaderVIEw(Context context,IAttributeSet attrs)
            : base(context,attrs)
        {
            Create();
        }

        private voID Create()
        {
            if (Context == null)
                return;

            Imageservice.Instance.LoadCompiledresource("loader_inDicator")
                .Into(this);

            ApplyRotation();

            StartAnimation(Animation);
        }
        
        private voID ApplyRotation()
        {
            var rotation = new RotateAnimation(
                0,360,Dimension.relativeToSelf,0.5f,0.5f)
            {
                Duration = 1200,Interpolator = new DecelerateInterpolator(1.25f),RepeatCount = Animation.Infinite
            };

            Animation = rotation;
        }
    }

注意loader_inDicator 是一个 gif 文件

此控件一直正常工作,直到我尝试将其可见性属性绑定到“经典”IsLoading Baseviewmodel 的属性,如下所示:

var set = CreateBindingSet();
set.bind(loader).For(v => v.Visibility).To(vm => vm.IsLoading)
                .WithConversion<MvxVisibilityValueConverter>();
set.Apply();

按上述方式执行应用程序,Visibility 绑定和 gif 动画 随机工作:有时会,有时不会;有时,RotateAnimation 正在工作,但针对父元素而不是它本身 - 在糟糕的情况下,您的图标会进入页面..

做不同的测试我明白,如果我删除 ApplyRotationStartAnimation,控件会正确显示和 binded

这似乎是某个地方的线程问题。有没有人见过并(可能)解决了这个问题?

编辑:Cheesebaron anwser 给了我一个正确的提示,所以我改变了 LoaderVIEw 实现如下,它实际上解决了这个问题:

public class LoaderVIEw : MvxCachedImageVIEw
{
    private Animation _animation;

    protected LoaderVIEw(IntPtr javaReference,JniHandleownership transfer)
        : base(javaReference,transfer)
    { }

    public LoaderVIEw(Context context)
        : base(context)
    { }

    public LoaderVIEw(Context context,IAttributeSet attrs)
        : base(context,attrs)
    { }

    protected overrIDe voID OnVisibilityChanged(VIEw changedVIEw,VIEwStates visibility)
    {
        base.onVisibilityChanged(changedVIEw,visibility);

        if (visibility == VIEwStates.VisiblE)
            StartAnimation(_animation);
        else
            Clearanimation();
    }

    protected overrIDe voID OnAttachedToWindow()
    {
        base.onAttachedToWindow();
        Create();
    }

    private voID Create()
    {
        if (Context == null)
            return;

        Imageservice.Instance.LoadCompiledresource("loader_inDicator")
            .Into(this);

        _animation = ApplyRotation();
    }

    private static RotateAnimation ApplyRotation() =>
        new RotateAnimation(
            0,0.5f)
        {
            Duration = 1200,RepeatCount = Animation.Infinite
        };

}

解决方法

您可以尝试将绑定表达式更改为:

set.bind(loader).For(v => v.bindVisible()).To(vm => vm.IsLoading);

但是,您是在元素实例化时应用动画,而不是在设置可见性时应用动画。所以动画可能正在运行,而元素不可见,反之亦然。您可能希望在更合适的时间点开始动画。

大佬总结

以上是大佬教程为你收集整理的使用 MvvmCross 和 FFImageLoading 的 Xamarin Android 可见性绑定问题全部内容,希望文章能够帮你解决使用 MvvmCross 和 FFImageLoading 的 Xamarin Android 可见性绑定问题所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:使用