安卓背景图片导致应用程序变慢

9
我是一个使用ViewPager在我的应用程序中切换片段的视图。我在XML中定义了背景,因此...
android:background="@drawable/bg_final"

如果我使用简单的背景颜色,我的应用程序运行非常平稳。如果我将其与此背景图像一起使用,则fps会下降,我的应用程序仅变得可以接受。它不是缓慢的,只是不那么平滑,但在较弱的设备上可能会出现延迟。将背景图像应用于应用程序是否是不好的方式?整个图像是480x800 png,大小为14.7kB。可能存在什么问题?
(片段的背景是透明的,viewpager位于具有此图像背景的main.xml中)

请问您能上传背景图片吗?如果它们是黑色的阴影,您可以使用 Photoshop 将其删除,并手动将其添加到您的 XML 文件中。或者任何其他重复的颜色都一样。 - Karthik Balakrishnan
6个回答

12

有很多答案都指出了预先缩放位图的重要性,如果可以的话,这非常重要,您应该这样做。然而,在尝试了几种不同的方法之后,我经历到的最大性能提升是创建一个视图并重写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毫秒。

这是我的一个视图绘制性能的截屏,分别为修改前和修改后:

修改前: 使用setImageBitmap而不是覆盖onDraw。

修改后: 使用上述仅覆盖OnDraw的DTImageView。


8
我有点晚了,但这刚刚咬住了我。当运行GPU调试器时,我注意到系统放大了我的图像! 我有一个1920x1080的图像,它显示为3780x6720的纹理!
理想情况下,您应该在相应文件夹中为每个密度提供纹理(res / drawable-mdpi,res / drawable-hdpi等)。
但是,如果您认为一个纹理很好,请将其放入res / drawable-nodpi,而不是res / drawable。如果您将其放入res / drawable-nodpi,则系统不会根据dpi进行缩放。
在我的情况下,它将一个简单的UI从Pixel XL上的10fps更改为完整的帧速率60fps。

3

我有一个背景图片,大小不大,但是它的尺寸很奇怪 - 因此会导致拉伸和性能不佳。我创建了一个方法,它接受Context、View和一个drawable ID(int)参数,并将其与设备屏幕大小匹配。例如,在片段的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);
}

2

我曾经遇到过同样的问题,通过以下方法解决:

将你的图片添加到res目录下的mipmap文件夹中。这将根据图像的密度添加图像。


2
这可能是因为图片被拉伸了,而Android在处理拉伸背景图片方面存在性能问题。
因此,您应该使用背景颜色或者参考此答案将背景图片替换为平铺方式。

0

创建一个尺寸为1080x1920的背景图片,并将其放置在drawable-nodpi文件夹中,这样就解决了这个问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接