2017-05-05 12 views
3

私はMvxを使ってXamarinのAndroidアプリケーションでこれを動作させようとしています。animation/transitionXamarin Mvvmcross 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内のタップされたカードのImageViewを新しいアクティビティの新しいImageViewに変換したいのですが?

ありがとうございます!

答えて

8

Xamarin Mvvmcross Android共有要素ナビゲーション の例はありますか?

私はそう信じません。私はMVX以内に、カスタムのプレゼンターを利用することができますが、どのよう は、私は例えば、のホールドを得るか、私は「変換」したい RecyclerView内のタップカードのImageViewのことを知っている

新しい 新しいアクティビティのImageView?

ShowViewModelを使用しているとき、私はあなたが移行したい制御要素の共有を実現するための考えることができる最も簡単な方法は、view tagsの使用とプレゼンテーションバンドルを経由しています。

私は(EventArgsの持つ例えばGitHub repoを参照してください)を選択されているViewHolderのビューを含めるようにアダプタをクリックハンドラにいくつかの変更を行うことを示唆しています。そうすれば、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; 
    } 
} 

GetTransitionNameSupportTransitionNameを取得するときだけで、プラットフォームのAPIチェックを行う拡張メソッドです。

public static string GetTransitionNameSupport(this ImageView imageView) 
{ 
    if (Build.VERSION.SdkInt >= BuildVersionCodes.Lollipop) 
     return imageView.TransitionName; 

    return string.Empty; 
} 

最後のステップは、あなたがこの例を示しrepo on GitHubを確認することができますSetup.cs

protected override IMvxAndroidViewPresenter CreateViewPresenter() 
{ 
    var mvxPresenter = new SharedElementFragmentsPresenter(AndroidViewAssemblies); 
    Mvx.RegisterSingleton<IMvxAndroidViewPresenter>(mvxPresenter); 
    return mvxPresenter; 
} 

でカスタムプレゼンターを登録することです。このソリューションは、発表者が移行中のコントロールの種類を気にする必要がないように設計されています。コントロールには、タグを識別するためのタグが必要です。レポの例では、移行する複数のコントロール要素を指定することもできます(上記の例では複雑さを増やしたくありません)。

Shared Element Demo

+0

私とMVXオープンソースコミュニティへの、これは明確にするために、時間と努力のこの量を過ごすためにどうもありがとうございます。 – JonHendrix

+1

@JonHendrix、問題ありません。私はいつもこのアニメーションを試してみたいと思っていました。あなたの質問を読んだとき、私は今でも試してみるかもしれないと思っていました:) – Plac3Hold3r

+1

@ Plac3Hold3r https://github.com/MvvmCross/MvvmCross/pull/2022これはこれをサポートしています。 – Martijn00

関連する問題