【问题标题】:android background image slows down appandroid背景图像减慢应用程序
【发布时间】:2012-12-25 12:07:36
【问题描述】:

我正在使用 viewpager 在我的应用程序中的片段之间滑动。我在 XML 中定义背景,所以

android:background="@drawable/bg_final"

如果我使用简单的背景颜色,我的应用程序会非常流畅。如果我将它与这个背景图像一起使用,fps 会降低,我的应用程序变得只能通过。它并不慢,只是不那么流畅,但是在较弱的设备上它可能会滞后。应用背景图像是一种不好的方法吗?整个图像为 480x800 png,大小为 14.7kB。可能是什么问题?

(片段的背景是透明的,viewpager 位于 main.xml 中,该文件的背景与此图像有关)

【问题讨论】:

  • 可以上传背景图片吗?如果它们是黑色阴影,您可以使用 Photoshop 将其删除并手动添加到您的 xml 文件中。或任何其他重复的颜色。

标签: android background android-viewpager


【解决方案1】:

创建只添加一个大小为 1080x1920 的背景图像并将其放在 drawable-nodpi 文件夹中,这样就解决了这个问题

【讨论】:

    【解决方案2】:

    我有一个背景图片,尺寸不大,但尺寸怪异 - 因此拉伸和性能不佳。我创建了一个带有参数 Context、一个 View 和一个与设备屏幕尺寸匹配的可绘制 ID(int) 的方法。在例如 Fragments onCreateView 中使用它来设置背景。

    public void setBackground(Context context, View view, int drawableId){
        Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), drawableId);
        int width = Resources.getSystem().getDisplayMetrics().widthPixels;
        int height = Resources.getSystem().getDisplayMetrics().heightPixels;
        bitmap = Bitmap.createScaledBitmap(bitmap, width, height, true);
        BitmapDrawable bitmapDrawable = new BitmapDrawable(context.getResources(), bitmap);
        view.setBackground(bitmapDrawable);
    }
    

    【讨论】:

      【解决方案3】:

      我有点晚了,但这只是让我感到难过,在运行 GPU 调试器时,我注意到系统放大了我的图像!我有一张 1920x1080 的图像,它显示为 3780x6720 的纹理!

      理想情况下,您应该在相应文件夹(res/drawable-mdpires/drawable-hdpi 等)中拥有每种密度的纹理。

      但是,如果您认为您的一个纹理很好,请将其放入 res/drawable-nodpi不是 res/drawable。如果放入res/drawable-nodpi,系统不会根据dpi进行放大。

      在我的例子中,它将简单的 UI 从 Pixel XL 上的 10fps 更改为 60fps 的全帧速率。

      【讨论】:

        【解决方案4】:

        我遇到了同样的问题,我用这个方法解决了:

        将您的图像添加到位于res 目录下的 mipmap 文件夹中。它会根据图像的密度添加图像。

        【讨论】:

          【解决方案5】:

          有很多答案都指向预缩放位图。这非常重要,如果可以的话,您应该这样做,但是在尝试了几种不同的方法之后,我体验到的最大性能提升是创建一个视图并覆盖 onDraw 方法。

          这个类可以这么简单:

          public class DTImageView extends View {
          
               public Bitmap imageBitmap;
          
               public DTImageView(Context context) { 
                   super(context); 
               } 
          
               @Override
               protected void onDraw(Canvas canvas) {
                  super.onDraw(canvas);
          
                  if(imageBitmap != null)
                    canvas.drawBitmap(imageBitmap, 0, 0, null); 
               }
          }
          

          使用预缩放位图调用代码:

           DTImageView bgImageView = new DTImageView(context);
           bgImageView.imageBitmap = Bitmap.createScaledBitmap(bitmap,width,height,true);
          

          此时您可以将此视图添加到它所属的视图层次结构中。在我的例子中,我的视图层次结构有一个 bgImage、一个所有其他功能发生的中间地带,以及 fgImage。

          使用 android sdk 工具 Hierarchy Viewer 来分析应用并查看每个视图的绘制速度。我的应用程序花了 30-40 毫秒绘制 bgImage 和 fgImage。预缩放和覆盖 onDraw 将 30-40 毫秒减少到大约 1.5 毫秒。

          这是我的一个视图前后的 Draw 性能截图:

          之前:

          之后:

          【讨论】:

            【解决方案6】:

            造成这种情况的原因可能是图像正在被拉伸,而 Android 在拉伸背景图像方面存在性能问题。

            相反,您应该使用背景颜色或see this answer 替换背景图像,以使图像重复而不是拉伸。

            【讨论】:

              猜你喜欢
              • 2011-08-02
              • 2012-07-14
              • 2021-11-06
              • 2013-06-24
              • 1970-01-01
              • 2016-06-09
              • 2011-10-11
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多