2017-10-24 13 views
0

ジェスチャーを使用してSnapChatのようなページをスワイプすることは可能ですか?私はこれのようなものを持っていますが、うまくいきません。もちろん、私はInterfaceとクラスを持っていますが、私はそれを実装する方法が分かりません。スワイプしながら、SnapChatのようなフォームの左側のページと右側のページをスワイプし、色の背景を変更したい。AndroidのXamarin.Formsジェスチャー

SwipeListener swipeListener = new SwipeListener(przeglad, this); 

    public void onLeftSwipe(View view) 
    { 
     if (view == przeglad) 
     { 
      Page ne = new SrchPage(); 
     } 
    } 

インタフェース:

public interface ISwipeCallBack 
{ 
    void onLeftSwipe(View view); 
    void onRightSwipe(View view); 
    void onTopSwipe(View view); 
    void onBottomSwipe(View view); 
    void onNothingSwiped(View view); 
} 

スワイプクラス:

public class SwipeListener : PanGestureRecognizer 
{ 

    private ISwipeCallBack mISwipeCallback; 
    private double translatedX = 0, translatedY = 0; 

    public SwipeListener(View view , ISwipeCallBack iSwipeCallBack) 
    { 

     mISwipeCallback = iSwipeCallBack; 
     var panGesture = new PanGestureRecognizer(); 
     panGesture.PanUpdated += OnPanUpdated; 
     view.GestureRecognizers.Add(panGesture); 
    } 

    void OnPanUpdated(object sender, PanUpdatedEventArgs e) 
    { 

     View Content = (View)sender; 

     switch (e.StatusType) 
     { 

      case GestureStatus.Running: 

       try 
       { 
        translatedX = e.TotalX; 
        translatedY = e.TotalY; 
       } 
       catch (Exception err) 
       { 
        System.Diagnostics.Debug.WriteLine("" + err.Message); 
       } 
       break; 

      case GestureStatus.Completed: 

       System.Diagnostics.Debug.WriteLine("translatedX : " + translatedX); 
       System.Diagnostics.Debug.WriteLine("translatedY : " + translatedY); 

       if (translatedX < 0 && Math.Abs(translatedX) > Math.Abs(translatedY)) 
       { 
        mISwipeCallback.onLeftSwipe(Content); 
       } 
       else if (translatedX > 0 && translatedX > Math.Abs(translatedY)) 
       { 
        mISwipeCallback.onRightSwipe(Content); 
       } 
       else if (translatedY < 0 && Math.Abs(translatedY) > Math.Abs(translatedX)) 
       { 
        mISwipeCallback.onTopSwipe(Content); 
       } 
       else if (translatedY > 0 && translatedY > Math.Abs(translatedX)) 
       { 
        mISwipeCallback.onBottomSwipe(Content); 
       } 
       else 
       { 
        mISwipeCallback.onNothingSwiped(Content); 
       } 

       break; 

     } 
    } 

} 

XML:

<Grid RowSpacing="10" Padding="30" VerticalOptions="Center" x:Name="przeglad"> 

      <Grid.RowDefinitions> 
       <RowDefinition Height="Auto"/> 

       <RowDefinition Height="Auto"/> 
       <RowDefinition Height="Auto"/> 

       <RowDefinition Height="Auto"/> 
       <RowDefinition Height="Auto"/> 
      </Grid.RowDefinitions> 

      <Button Grid.Row="2" Text="{resource:TranslateExtension Szukaj}" 
       BorderRadius="30" 
       BackgroundColor="#80FFFFFF" 

       FontSize="18" 
       TextColor="#330025" 
       BorderWidth="4" 
       BorderColor="#ffdbdb" 
       Clicked="Button_Clicked_1" 
       FontAttributes="Bold"/> 

      <Button Grid.Row="3" Text="{resource:TranslateExtension Mapa}" 
       BorderRadius="30" 
       BackgroundColor="#80FFFFFF" 
       FontSize="18" 
       TextColor="#330025"      
       BorderWidth="4" 
       BorderColor="#ffdbdb" 
       Clicked="Button_Clicked" 
       FontAttributes="Bold"/> 

     </Grid> 
+0

あなたは何を持っているのですか?それはコンパイルされますか?それはクラッシュしますか?もしそうなら、エラーまたは例外は何ですか?それが実行されている場合、それは正しいことは何ですか?シンプルなジェスチャーを実装するだけのコードがたくさんあるようです。 – Jason

答えて

0

私は何が必要だと思うが持つ元のビューにカバーしていViewPagerです透明なバックグラウンドund。例えば

このようなあなたのレイアウトを作成します。コードで

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
    <ImageView 
     android:id="@+id/img" 
     android:layout_height="match_parent" 
     android:layout_width="match_parent" 
     android:src="@drawable/BG" /> 
    <android.support.v4.view.ViewPager android:id="@+id/viewpager" 
            android:layout_height="match_parent" 
            android:layout_width="match_parent" 
            android:background="@android:color/transparent" /> 
</FrameLayout> 

の背後にある最初のViewPager用のアダプタを作成します。後ろのコードで

public class MyVPAdapter : PagerAdapter 
{ 
    private Context context; 
    private List<PItemModel> list; 

    public MyVPAdapter(Context _context, List<PItemModel> _list) 
    { 
     context = _context; 
     list = _list; 
    } 

    public override int Count 
    { 
     get { return list.Count; } 
    } 

    public override bool IsViewFromObject(View view, Java.Lang.Object obj) 
    { 
     return view == obj; 
    } 

    public override void DestroyItem(View container, int position, Java.Lang.Object view) 
    { 
     var viewpager = container.JavaCast<ViewPager>(); 
     viewpager.RemoveView(view as View); 
    } 

    public override Java.Lang.Object InstantiateItem(View container, int position) 
    { 
     ImageView tile = new ImageView(context); 
     tile.SetImageResource(list[position].TileId); 
     var viewpager = container.JavaCast<ViewPager>(); 
     viewpager.AddView(tile); 
     return tile; 
    } 
} 

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

    // Create your application here 
    SetContentView(Resource.Layout.layout2); 

    ViewPager pager = FindViewById<ViewPager>(Resource.Id.viewpager); 
    List<PItemModel> list = new List<PItemModel>(); 
    list.Add(new PItemModel() { TileId = Resource.Drawable.BackButton }); 
    list.Add(new PItemModel() { TileId = Resource.Drawable.solidimg }); 
    var adapter = new MyVPAdapter(this, list); 
    pager.Adapter = adapter; 
} 

PItemModelされますこのような単純な:

public class PItemModel 
{ 
    public int TileId { get; set; } 
} 

あなたの最後の例のコメントに記載されているリンクは、写真の上にタイルを追加するのが好き最後の問題は、ViewPagerはカメラのストリームを提示するために使用されているTextureViewの上に配置する必要があります。ここではデモ用にImageViewを使用しました。

更新:

申し訳ありませんが、私はちょうどあなたがAndroidのクライアントのプロジェクトで上記のコードを表示するためにCustom Rendererを作成し、実施することができるはずよりも、開発のためのXFを使用していることに気づき、コードOnCreateで、クライアントプロジェクトのビューレンダラーの実装に移動する必要があります。

関連する問題