android背景图片减慢app

时间:2013-01-10 23:30:26

标签: android background android-viewpager

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

android:background="@drawable/bg_final"

如果我使用简单的背景颜色,我的应用程序非常流畅。如果我将它与此背景图像一起使用,fps会减少,我的应用程序也只能通过。它并不慢,只是不那么顺利,但是在较弱的设备上它可能会工作迟缓。这是一种应用背景图像的坏方法吗?整个图像是480x800 png,大小为14.7kB。可能是什么问题?

(片段的背景是透明的,viewpager在main.xml中,其背景与此图像有关)

6 个答案:

答案 0 :(得分: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工具层次结构查看器来分析应用程序并查看每个视图绘制的速度。我的应用花了30-40ms绘制了bgImage和fgImage。预渲染和覆盖onDraw将30-40ms减少到大约1.5ms。

以下是我之前和之后的一个观点的Draw效果截图:

<强> BEFORE: Using setImageBitmap instead of overriding onDraw.

<强> AFTER: Using the above DTImageView which simply overrides OnDraw

答案 1 :(得分:8)

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

理想情况下,您应该在相应文件夹(res/drawable-mdpires/drawable-hdpi等)中为每个密度设置纹理。

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

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

答案 2 :(得分:3)

我有一张背景图片,尺寸不大,但尺寸很奇怪 - 因此拉伸和性能不佳。我创建了一个方法,其参数Context,View和drawable 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 :(得分:2)

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

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

答案 4 :(得分:2)

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

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

答案 5 :(得分:0)

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