【问题标题】:Sliding view used to control ViewPager paging用于控制 ViewPager 分页的滑动视图
【发布时间】:2017-07-31 01:32:50
【问题描述】:

我的目标是在片段 1 上有一个滑动视图,它在片段 2 被拉入可视视图之前滑动设定的距离。

我在这里制作了一个视觉效果,显示了我正在尝试做的事情: 图 1 显示片段 1(粉红色)和滑动视图(绿色)的默认视图,此状态下没有发生任何事情。

Pic 2 滑动视图可以滑动到它的截止点(黑线)。它不能在这个片段上越过这个。

图 3 整个片段 1 开始滑动,片段 2(蓝色)现在开始被拉入视图

图 4 两个片段都像以前一样继续滑动。

图 5 片段 2 现已滑入视野。

当用户尝试返回上一个屏幕时,转换会反向发生。

现在我已经实现了一个承载片段 1 和 2 的 ViewPager。默认的 ViewPager 行为允许我在两个片段之间滑动,但我不确定如何实现我所描述的功能。

【问题讨论】:

标签: android android-fragments android-viewpager


【解决方案1】:

我能够使用ViewPager PageTransformer 实现所需的转换

我在我的项目中使用Xamarin.Android,所以使用了C#。虽然这个 sn-p 是用 C# 编写的,但它可以很容易地移植到 Java 代码中,以便在其他项目中使用。

float passpoint = 7/8f;

public void TransformPage(View view, float position)
{
    var pageWidth = view.Width;
    var slidingGap = pageWidth - pageWidth * passpoint;
    var translation = position * pageWidth;

    if (position < -1)
    { // [-Infinity,-1)
        // This page is way off-screen to the left.
        view.Alpha = 0;

    }
    else if (position <= 1)
    { // [-1,1]
        var r = new Rect();

        //if valid, this view is the startpage
        Button button = (Button)view.FindViewById(Resource.Id.slidingButton);
        if (button != null)
        {
            var posPassPoint = -(1 - passpoint);
            float ratio;
            //create sliding gap
            if (position > posPassPoint)
            {
                ratio = RatioBetween(position, posPassPoint, 0);

                button.TranslationX = slidingGap * -ratio;
            }
            //compensate for sliding gap after it has been reached
            else
            {
                //1- bc want the ratio to shrink
                ratio = 1-RatioBetween(position, -1, posPassPoint);
            }
            view.TranslationX = slidingGap * ratio;
        }

        //valid on views other than start page (no sliding button)
        if (button == null)
        {
            float ratio;
            //create sliding gap
            if (position >= passpoint)
                ratio = RatioBetween(position, passpoint, 1);
            //compensate for sliding gap after it has been reached
            else
                ratio = 1 - RatioBetween(position, 0, passpoint);
            view.TranslationX = slidingGap * ratio;
        }
    }
    else
    { // (1,+Infinity]
        // This page is way off-screen to the right.
        view.Alpha = 0;
    }
}

float RatioBetween(float input, float upperBound, float lowerBound)
{
    return (input - lowerBound) / (upperBound - lowerBound);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多