gpt4 book ai didi

xamarin - 是否有 Xamarin Mvvmcross Android 共享元素导航示例?

转载 作者:行者123 更新时间:2023-12-04 22:56:27 25 4
gpt4 key购买 nike

我想得到这个 animation/transition使用 Mvx 在我的 Xamarin Android 应用程序中工作。

我有一个带卡片的回收站。当点击卡片时,我现在调用:

private void TimeLineAdapterOnItemClick(object sender, int position)
{
TimeLineAdapter ta = (TimeLineAdapter) sender;
var item = ta.Items[position];

int photoNum = position + 1;
Toast.MakeText(Activity, "This is photo number " + photoNum, ToastLength.Short).Show();

ViewModel.ShowDetails(item.Id);
}

我试图找出如何通过 Mvvmcross 转换到 Xamarin 来翻译这个 java 导航:
ActivityOptionsCompat options = 
ActivityOptionsCompat.MakeSceneTransitionAnimation(this, imageView, getString(R.string.activity_image_trans));

startActivity(intent, options.toBundle());

我知道在 Mvx 中您可以使用自定义演示者,但是我如何获得例如 RecyclerView 中被点击的 Card 的 ImageView,我想将其“转换”为新事件上的新 ImageView?

谢谢!

.

最佳答案

Is there a Xamarin Mvvmcross Android Shared Element Navigation example?



我不相信。

I know that within Mvx you can make use of custom presenters, but how do I get hold of, for example, the ImageView of the tapped Card within the RecyclerView which I would like to 'transform' to the new ImageView on the new Activity?



我能想到的实现要转换的控制元素共享的最简单方法是使用 view tags和使用时的演示包 ShowViewModel .

我建议对您的 Adapter Click 处理程序进行一些更改以包含 ViewHolder 的 View 。被选中(参见 GitHub repo,例如 EventArgs)。这样您就可以与 ImageView 互动。并设置一个标记,以后可以用来识别它。
private void TimeLineAdapterOnItemClick(object sender, View e)
{
var imageView = e.FindViewById<ImageView>(Resource.Id.imageView);
imageView.Tag = "anim_image";

ViewModel.ShowDetails(imageView.Tag.ToString());
}

然后在您的 ViewModel 中,通过presentationBundle 发送该标签。
public void ShowDetails(string animationTag)
{
var presentationBundle = new MvxBundle(new Dictionary<string, string>
{
["Animate_Tag"] = animationTag
});

ShowViewModel<DetailsViewModel>(presentationBundle: presentationBundle);
}

然后创建一个自定义演示者来拾取 presentationBundle并通过转换处理新事件的创建。自定义演示器,它使用标签来查找要转换的元素并包含 ActivityOptionsCompat在新事件的开始。此示例使用 MvxFragmentsPresenter但如果您不使用片段并使用 MvxAndroidViewPresenter解决方案几乎相同(替代显示,不需要构造函数)。
public class SharedElementFragmentsPresenter : MvxFragmentsPresenter
{
public SharedElementFragmentsPresenter(IEnumerable<Assembly> AndroidViewAssemblies)
: base(AndroidViewAssemblies)
{
}

protected override void ShowActivity(MvxViewModelRequest request, MvxViewModelRequest fragmentRequest = null)
{
if (InterceptPresenter(request))
return;

Show(request, fragmentRequest);
}

private bool InterceptPresenter(MvxViewModelRequest request)
{
if ((request.PresentationValues?.ContainsKey("Animate_Tag") ?? false)
&& request.PresentationValues.TryGetValue("Animate_Tag", out var controlTag))
{
var intent = CreateIntentForRequest(request);

var control = Activity.FindViewById(Android.Resource.Id.Content).FindViewWithTag(controlTag);
control.Tag = null;

var transitionName = control.GetTransitionNameSupport();
if (string.IsNullOrEmpty(transitionName))
{
Mvx.Warning($"A {nameof(transitionName)} is required in order to animate a control.");
return false;
}

var activityOptions = ActivityOptionsCompat.MakeSceneTransitionAnimation(Activity, control, transitionName);

Activity.StartActivity(intent, activityOptions.ToBundle());
return true;
}

return false;
}
}
GetTransitionNameSupport是一个扩展方法,在获取 TransitionName 时只进行平台 API 检查.
public static string GetTransitionNameSupport(this ImageView imageView)
{
if (Build.VERSION.SdkInt >= BuildVersionCodes.Lollipop)
return imageView.TransitionName;

return string.Empty;
}

最后一步是在您身上注册自定义演示者 Setup.cs
protected override IMvxAndroidViewPresenter CreateViewPresenter()
{
var mvxPresenter = new SharedElementFragmentsPresenter(AndroidViewAssemblies);
Mvx.RegisterSingleton<IMvxAndroidViewPresenter>(mvxPresenter);
return mvxPresenter;
}

您可以查看 repo on GitHub这演示了这个例子。该解决方案的设计使演示者不必关心正在转换的控件的类型。一个控件只需要一个用于识别它的标签。存储库中的示例还允许指定要转换的多个控制元素(我不想在上面的示例中包含更多复杂性)。

Shared Element Demo

关于xamarin - 是否有 Xamarin Mvvmcross Android 共享元素导航示例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43804827/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com