【问题标题】:Slide finger vertically to open fragments垂直滑动手指以打开碎片
【发布时间】:2018-09-25 18:56:08
【问题描述】:

我想实现这样的片段导航:

当我在片段 A 的某处向下滑动手指时,片段 C 将被打开(作为滑动运动),从 C 向上滑动手指返回到 A 等等...

我考虑过具有垂直滑动方向的自定义 ViewPager,但我对“Open ..”三角形有疑问,它应该在滑动移动期间旋转的片段之间共享,例如从“Open C”更改为“Open A”。有什么建议 ? :)

【问题讨论】:

  • "我考虑过使用垂直滑动方向的自定义 ViewPager,但我对 "Open .." 三角形有疑问-这本来是一个更好的问题,因为这是一个实际的编码问题,我'确定大多数人会建议ViewPager,作为“开箱即用”,它具有滚动回调,并且专为翻阅片段而设计..
  • 您也许可以在 PageTransformer 中进行旋转。
  • 两个 cmets 的组合应该可以工作:ViewPager2(忘记旧的ViewPager)以实现稳定的垂直分页。和PageTransformerOpen 视图放在片段之间。旧的ViewPager 的垂直分页无法正常工作,因为私有slope 参数没有针对不同的屏幕尺寸进行良好设置(它只适用于hotizontal 滑动)。这已通过 ViewPager2 修复(以及其他问题)。

标签: java android kotlin android-viewpager


【解决方案1】:

res 文件夹中创建anim 文件夹。 创建名为 in_up 的文件

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:fromXDelta="-100%"
        android:toXDelta="0%"
        android:fromYDelta="0%"
        android:toYDelta="0%"
        android:duration="700"/>

创建另一个名为 out_down 的文件

 <?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:fromXDelta="0%"
        android:toXDelta="0%"
        android:fromYDelta="-100%"
        android:toYDelta="0%"
        android:duration="700"/>

要检测左右滑动,您可以使用此代码。

创建变量

private float y1,y2;
static final int MIN_DISTANCE = 150;

并覆盖onTouchEvent()

  @Override
public boolean onTouchEvent(MotionEvent event)
{
  
    switch(event.getAction())
    {
        case MotionEvent.ACTION_DOWN:
            y1 = event.getY();
            break;
        case MotionEvent.ACTION_UP:
            y2 = event.getY();
            float deltaY = y2 - y1;
            if (Math.abs(deltaY) > MIN_DISTANCE)
            {
                 MyFragment myFragment = new MyFragment();
                 myFragment.show(this.getSupportFragmentManager(), "my fragment");
                 overridePendingTransition(R.anim.in_up, R.anim.out_down);
            }
            break;
    }
    return super.onTouchEvent(event);
}

【讨论】:

【解决方案2】:

这就是我会做的:

  1. 使用this 收听滑动

  2. this 进行一些调整,例如 enter_from_left 将变为 enter_from_top 并且内部代码更改为:

        android:fromXDelta="-100%" android:toXDelta="0%"
        android:fromYDelta="0%" android:toYDelta="0%"
        android:duration="700"/>
    

       android:fromXDelta="0%" android:toXDelta="0%"
       android:fromYDelta="-100%" android:toYDelta="0%"
       android:duration="700"/>
    

    并对其他过渡 xml 文件进行类似的更改。

  3. 检查我在哪个页面上,并在检测到滑动时相应地调用replaceFragmentWithAnimation

【讨论】:

    【解决方案3】:

    我建议简单地使用Viewpager2 而不是传统的 ViewPager,因为 ViewPager2 在后台使用 recyclerview 实现,因此它支持垂直和水平滑动。查看documentation 了解如何从 ViewPager 迁移到 ViewPager2

    【讨论】:

      猜你喜欢
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-27
      • 1970-01-01
      • 1970-01-01
      • 2011-12-04
      相关资源
      最近更新 更多