9

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

android:background="@drawable/bg_final"

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

(片段的背景是透明的,viewpager 位于 main.xml 中,其背景与此图像一起)

4

6 回答 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 毫秒。

这是我之前和之后的一个视图的 Draw 性能的屏幕截图:

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

后: 使用上面简单地覆盖 OnDraw 的 DTImageView

于 2013-08-28T03:59:39.083 回答
8

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

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

但是,如果您认为您的一种纹理很好,请将其放入res/drawable-nodpi而不是 res/drawable。如果你把它放入res/drawable-nodpi,系统将不会根据 dpi 对其进行缩放。

就我而言,它将简单的 UI 从 Pixel XL 上的 10fps 更改为 60fps 的全帧速率。

于 2016-11-23T05:28:28.777 回答
3

我有一个背景图像,尺寸不大,但尺寸奇怪 - 因此拉伸和性能不佳。我创建了一个带有参数 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);
}
于 2017-03-21T13:29:00.137 回答
2

其原因可能是图像正在被拉伸,而 Android 在拉伸背景图像方面存在性能问题。

相反,您应该使用背景颜色替换背景图像,或者查看此答案以使图像重复而不是拉伸。

于 2013-01-11T02:16:19.953 回答
2

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

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

于 2016-06-06T16:57:06.023 回答
0

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

于 2017-07-13T05:47:12.570 回答