DepthPageTransformer来自两方同样的效果?

时间:2016-02-04 10:59:36

标签: android android-viewpager

当向左滑动时出现dept页面转换动画的代码,当向右滑动时实现类似的效果我做了解决但没有成功。

Depth Page Tranfomer

当我回到之前的图像时,我想要相同的效果,即即将到来的图像必须缩小,当前图像向右滑动。对此有任何解决方案或解决办法吗?

1 个答案:

答案 0 :(得分: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;
    }
}