2016-02-04 4 views
0

Код для преобразования трансформации страницы отображается, когда слайд влево, чтобы добиться аналогичного эффекта при сдвиге вправо, я работал, но не имел успеха.DepthPageTransformer с обеих сторон такой же эффект?

Depth Page Tranfomer

Я хочу, чтобы один и тот же эффект, когда я вернулся к предыдущему изображению, которое пришествие изображение должно уменьшить масштаб и текущий слайду изображения справа. Любое решение или исправление для этого?

ответ

1

Этот код решает проблему, но написан на C#, я использую Xamarin.Android, но это должно быть легко перевести на java, потому что оно переведено с Java.

Это класс, полученный из RecyclerView.ViewHolder, потому что в моем коде я использую RecyclerView для отображения нескольких ViewPager.

я реализую интерфейсы

ViewPager.IPageTransformer 
ViewPager.IOnPageChangeListener 

В Java являются

ViewPager.PageTransformer 
ViewPager.OnPageChangeListener 

В том же классе, чтобы знать, если это перетаскивание вправо или влево. И изменение трансформации в направлении

public class PhotoPaisViewHolder : RecyclerView.ViewHolder, 
    ViewPager.IPageTransformer, 
    ViewPager.IOnPageChangeListener 
{ 
    private static AtomicInteger sNextGeneratedId = new AtomicInteger(1); 

    /** 
    * Generate a value suitable for use in {@link #setId(int)}. 
    * This value will not collide with ID values generated at build time by aapt for R.id. 
    * 
    * @return a generated ID value 
    */ 
    public static int GenerateViewId() 
    { 
     for (;;) 
     { 
      int result = sNextGeneratedId.Get(); 
      // aapt-generated IDs have the high byte nonzero; clamp to the range under that. 
      int newValue = result + 1; 
      if (newValue > 0x00FFFFFF) newValue = 1; // Roll over to 1, not 0. 
      if (sNextGeneratedId.CompareAndSet(result, newValue)) 
      { 
       return result; 
      } 
     } 
    } 
    public ViewPager Pager { get; private set; } 
    // Get references to the views defined in the CardView layout. 
    public PhotoPaisViewHolder(View itemView) 
     : base(itemView) 
    { 
     // This for support multiple pagers in the same RecyclerView 
     Pager = itemView.FindViewById<ViewPager>(Resource.Id.pager); 
     if (Build.VERSION.SdkInt < BuildVersionCodes.JellyBeanMr1) 
     { 
      Pager.Id = PhotoPaisViewHolder.GenerateViewId(); 
     } 
     else 
     { 
      Pager.Id = View.GenerateViewId(); 
     } 
     Pager.AddOnPageChangeListener(this); 
     Pager.SetPageTransformer(reverse, this); 
    } 
    //For control the transformation 
    private static float MIN_SCALE = 0.75f; 
    private int currentPos; 
    private bool reverse; 
    private bool dragging; 

    public void TransformPage(View view, float position) 
    { 
     // Console.WriteLine(position); 
     int pageWidth = view.Width; 

     if (position < -1) 
     { // [-Infinity,-1) 
      // This page is way off-screen to the left. 
      view.Alpha = 0; 
     } 
     else if (position <= 0) 
     { // [-1,0] 
      // Use the default slide transition when moving to the left page 
      if (reverse) 
      { 
       TransformUpView(view); 
      } 
      else 
      { 
       TransformDownView(view, position, pageWidth); 
      } 
     } 
     else if (position <= 1) 
     { // (0,1] 
      // Fade the page out. 
      if (reverse) 
      { 
       TransformDownView(view, position, pageWidth); 
      } 
      else 
      { 
       TransformUpView(view); 
      } 
     } 
     else 
     { // (1,+Infinity] 
      // This page is way off-screen to the right. 
      view.Alpha = 0; 
     } 
    } 
    private static void TransformDownView(View view, float position, int pageWidth) 
    { 
     view.Alpha = 1 - Math.Abs(position); 
     // Counteract the default slide transition 
     view.TranslationX = pageWidth * -position; 
     // Scale the page down (between MIN_SCALE and 1) 
     float scaleFactor = MIN_SCALE 
       + (1 - MIN_SCALE) * (1 - Math.Abs(position)); 
     view.ScaleX = scaleFactor; 
     view.ScaleY = scaleFactor; 
    } 
    private static void TransformUpView(View view) 
    { 
     view.Alpha = 1; 
     view.TranslationX = 0; 
     view.ScaleX = 1; 
     view.ScaleY = 1; 
    } 
    public void OnPageScrollStateChanged(int state) 
    { 
     dragging = state == ViewPager.ScrollStateDragging; 
    } 
    public void OnPageScrolled(int position, float positionOffset, int positionOffsetPixels) 
    { 
     if (dragging) 
     { 
      if (position < currentPos) 
      { 
       if (reverse) 
       { 
        reverse = !reverse; 
        Pager.SetPageTransformer(reverse, this); 
       } 
      } 
      else 
      { 
       if (!reverse) 
       { 
        reverse = !reverse; 
        Pager.SetPageTransformer(reverse, this); 
       } 
      } 
     } 
    } 
    public void OnPageSelected(int position) 
    { 
     currentPos = position; 
    } 
} 
Смежные вопросы