【问题标题】:Android ViewPager "slide lag"Android ViewPager“滑动滞后”
【发布时间】:2017-08-21 13:13:42
【问题描述】:

我有一个带有 3 个片段的 ViewPager Fragment。每个都有一个图像作为背景和一个TextViewTextView 始终位于屏幕左侧(而不是 Fragment 本身)。当我用手指移动碎片时,它会停留在正确的位置。当我快速移动它时。但是当我让它滑入另一个Fragment 时,TextView 不会停留在正确的位置。看起来有点滞后。

应该像这两张图片一样:

 @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        SingleTabFragment singleTabFragment = (SingleTabFragment) mSectionsPagerAdapter.getRegisteredFragment(position);
        TextView textView = singleTabFragment.getNonResizingTextView();
        ViewGroup.MarginLayoutParams marginLayoutParams = (ViewGroup.MarginLayoutParams)textView.getLayoutParams();
        marginLayoutParams.leftMargin = positionOffsetPixels;
        textView.setLayoutParams(marginLayoutParams);

    }

我真的不知道问题出在哪里。我尝试了多种方法,我添加了Thread.sleep(50); 看看它是否也发生在那里。是的,它也不能正常工作。我该如何解决这个问题?

编辑:

现在我已经放在中间了。但问题是一样的。

它应该是这样的(我知道,没有那么多帧。但我想你会明白的):

如果我让它滑动,它看起来像这样:

【问题讨论】:

  • 你能发布一个有这种行为的 gif 吗?
  • @azizbekian 是的,我已经编辑过了。

标签: android android-viewpager fragment


【解决方案1】:
 TextView textView = singleTabFragment.getNonResizingTextView();
 textView.translationX = positionOffsetPixels;

您不应该这样做marginLayoutParams.leftMargin = positionOffsetPixels;,因为更改边距可能会更改视图的位置,这将导致视图在每一帧上重新布局。这就是它落后的原因。 更改translationX 只会更改how the view is drawn 而不是它的位置。

【讨论】:

    【解决方案2】:

    您可以使用以下方法来做同样的事情,而不是在 onPageScrolled 中做:

    mPager.setPageTransformer(false, new FadePageTransformer());
    
    public class FadePageTransformer implements ViewPager.PageTransformer {
            public void transformPage(View view, float position) {
                view.setAlpha(1 - Math.abs(position));
                        if (position < 0) {
                            view.setScrollX(-(int) ((float) (view.getWidth()) * -position));
                        } else if (position > 0) {
                            view.setScrollX((int) ((float) (view.getWidth()) * position));
                        } else {
                            view.setScrollX(0);
                        }
            }
        }
    

    【讨论】:

      【解决方案3】:

      使用textView.setTranslationX(positionOffsetPixels); 代替边距

      【讨论】:

        【解决方案4】:

        看看Slowing speed of Viewpager controller in android

        您可以为 Viewpager 滚动设置自定义持续时间。

        【讨论】:

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