Android背景图像减慢应用程序

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

android:background="@drawable/bg_final" 

如果我使用简单的背景颜色,我的应用程序工作非常stream畅。 如果我用这个背景图片,fps减less,我的应用程序变得只能通过。 速度不是很慢,只是不那么顺利,但是在较弱的设备上,它可能工作滞后。 这是一个不好的方式来应用背景图像? 整个图像是一个大小为14.7kB的480×800 png。 可能是什么问题?

(这些片段的背景是透明的,viewpager是在一个main.xml文件中,它有这个图片的背景)

Solutions Collecting From Web of "Android背景图像减慢应用程序"

有很多答案指出预缩放您的位图。 这是非常重要的,你应该做,如果可以的话,但是在尝试几个不同的事情之后,我所经历的最大的性能增益是创build视图并覆盖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,所有其他function发生的中间地带,和fgImage。

使用Android sdk工具Hierarchy Viewer来分析应用程序,并查看每个视图绘制的速度。 我的应用花了30-40ms绘制bgImage和fgImage。 预缩放和重写onDraw减less了30-40毫秒,大约1.5毫秒。

以下是我的观点之前和之后的抽奖performance的截图:

之前: 使用setImageBitmap而不是重写onDraw。

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

我有点晚了,但这只是我,我运行GPUdebugging器时,我注意到,系统放大了我的形象! 我有一个1920×1080的图像,它显示为3780×6720纹理!

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

但是,如果你认为你的一个纹理是好的,把它放到res/drawable-nodpi而不是 res/drawable 。 如果你把它放到res/drawable-nodpi ,系统将不会根据dpi来扩展它。

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

我有一个背景图像,尺寸不大,但具有奇怪的尺寸 – 因此,拉伸和糟糕的performance。 我做了一个参数上下文,一个视图和一个可绘制的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); } 

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

相反,你应该用背景颜色replace背景图片,或者看到这个答案让图片重复,而不是拉伸。

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

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

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