【问题标题】:Android ViewPager LagAndroid ViewPager 滞后
【发布时间】:2020-07-10 20:23:49
【问题描述】:

您好,我有一个带有多个页面的视图分页器(使用片段状态分页器),还有一些 png 作为这些页面的背景。我已经按照在 Ui 中显示位图 (http://developer.android.com/training/displaying-bitmaps/display-bitmap.html) 进行了操作,因此我已经在后台线程中缓存并设置了可绘制的图像。但是在切换寻呼机页面时我仍然会遇到一些滞后。在每个片段上,我只对 onCreateView() 方法的视图进行膨胀,所以我不知道是什么导致了这种滞后。我可以做些什么来消除这种滞后/断断续续的影响?

【问题讨论】:

    标签: android android-viewpager


    【解决方案1】:

    我有类似的问题。

    我正在显示类似教程的页面。每页都是全屏jpg。

    一开始我把图片放在res/drawables文件夹里。浏览器在滑动时非常滞后。

    然后我将这些 jpg 文件移动到 res/drawable-hdpi 文件夹,延迟消失了。

    我认为根据文件夹对图片进行了不同的优化。所以我们不能把所有东西都放在res/drawable文件夹中

    【讨论】:

    • 这正是我的问题,您的回答为我解决了问题。我把所有的全尺寸背景图片放在 xhdpi 文件夹中,现在它像黄油一样光滑。 :)
    • 你到底是怎么想出来的。我几乎开始想“哦,它可能占用了太多 ram bcz 的巨大图像”然后我就照你说的做了。它刚刚奏效。我把我的放在xhdpi中。这是否意味着带有 hdpi/mdpi/xxhdpi/xxxhdpi 的手机也会显示我的背景。
    【解决方案2】:

    您可能想尝试将 viewPager.setOffScreenLimit(size) 设置为您的页面数。这将加载所有片段一次,并防止在滑动时重新加载它们。

    【讨论】:

    • 只是一个小修正,它是viewPager.setOffscreenLimit(size)。不过这对我有用,谢谢!
    【解决方案3】:

    为了消除滞后:

    1)如果图像是静态的,则将图像放入 res/drawable-hdpi。如果是从 URL 下载的,则使用后台线程加载图像。

    2) 通过 viewPager.setOffScreenLimit(size) 方法设置页面关闭屏幕限制。在视图分页器缓存的帮助下,您在此方法中设置的最小屏幕数默认为 1。

    3)您可以使用 FragmentPagerAdapterFragmentStatePagerAdapter 以获得更好的性能。

    【讨论】:

      【解决方案4】:

      我通过将图像移动到 drawable-nodpi 中解决了这个问题,因为这会禁用所有 DPI 的缩放。只有当用户使用具有该屏幕密度的设备时,移动到 hdpi/xhdpi 才会禁用缩放。

      【讨论】:

        【解决方案5】:

        我按照Coderek的回答,在不同的地方移动了

        res/drawable-hdpi 文件夹

        drawable-xxxhdpi 最适合我的项目。

        【讨论】:

          【解决方案6】:

          我在切换页面时避免这种延迟的解决方案是:预加载图片

          final Drawable[] images = new Drawable[3];
          for(int i=0; i<3; i++){
              int position = i+1;
              images[i] = getResources().getDrawable(getResources().getIdentifier("image"+position, "drawable", getPackageName()));
           }
          

          然后:

          mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
                  @Override
                  public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
          
                  }
          
                  @Override
                  public void onPageSelected(int position) {
                      imageSwitcher.setImageDrawable(images[position]);
                  }
          
                  @Override
                  public void onPageScrollStateChanged(int state) {
                  }
              });
          

          【讨论】:

          • 虽然代码很受欢迎,但它应该始终有一个附带的解释。这不必很长,但在意料之中。
          【解决方案7】:

          在@coderek 回答的基础上,我似乎已经通过获取位图而不为特定密度缩放它们来解决这个问题:

          BitmapFactory.Options opts = new BitmapFactory.Options();
          opts.inScaled = false;
          Bitmap bitmap = BitmapFactory.decodeResource(getResources(), resource, opts);
          
          ((ImageView) view).setImageBitmap(bitmap);
          

          xxhdpi 设备中使用drawable 文件夹中的图像导致分配的内存增加多达8 倍!

          附:

          如果分辨率太大,您也可以对drawable进行下采样:

          opts.inSampleSize = 2;
          

          【讨论】:

            【解决方案8】:

            我知道这是一个老问题,但我最近遇到了这个问题并发现了一个不同的问题。所以只要分享一下,以防有人看到这篇文章。

            我的片段基本上都是大的 Imageview 持有者,并滚动浏览 UX/UI 团队给我的图像。但是,只要下一张或上一张图片的尺寸不同,例如,(1200 x 1200) 过渡到 (1200 x 1300),滑动就会滞后,但其余的都可以。

            解决方案位于正确的文件夹中。我进行了实验,发现如果我将所有图像裁剪为相同大小,我就没有滞后问题。但是,这不符合我的需要,因为我想要不同尺寸的图片。

            所以我转而使用 Glide 将图像加载到位,而不是直接设置可绘制对象,这样可以很好地清理它。因此,如果其他人遇到此问题,您可能只需要切换到使用 glide 异步加载,而不是直接设置图像。

            【讨论】:

              【解决方案9】:

              我也遇到过类似的问题,在我的情况下,延迟是由于布局的背景图片太大造成的。我刚刚调整了图片的大小,滑动延迟消失了

              【讨论】:

                【解决方案10】:

                以上解决方案都不适用于我的情况!

                我找到了一个可以解决该问题的库,并且还包含一些更有趣的功能。 Take a look at it here!

                试试这个:

                在gradle中

                compile 'com.ToxicBakery.viewpager.transforms:view-pager-transforms:1.2.32@aar'
                

                onCreate

                viewPager.setPageTransformer(true, new DefaultTransformer());
                

                您可以通过更改第二个参数来获得一些非标准效果,但并非所有效果都能正常工作。

                【讨论】:

                  【解决方案11】:

                  我没有移动到 res/drawable-hdpi,而是将图像移动到了 res/drawable-xxxhdpi。 这立即解决了问题。

                  【讨论】:

                  • 这个答案已经在 2 年前here 给出。这个问题已经超过 7 年了。没有提供新信息
                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多