2013-01-10 32 views
7

我正在使用viewpager在我的应用程序中的片段之间滑动。我在XML中定义了背景,所以如果我使用简单的背景颜色,我的应用程序工作非常流畅。如果我在这个背景图片中使用它,fps会减少,我的应用程序只能通过。这并不慢,只是不那么顺利,但是在较弱的设备上它可能会工作滞后。这是应用背景图像的不好方法吗?整个图像是一个尺寸为14.7kB的480x800 PNG。可能是什么问题?android背景图像放慢应用程序

(该片段的背景是透明的,则viewpager是在具有其与该图像一个背景main.xml中)

+0

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

回答

1

这样做的原因可能是该图像被拉伸,和Android具有性能拉伸背景图像的问题。

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

9

有很多答案指出预缩放位图。这是非常重要的,如果可以的话,你应该这样做,但是在尝试了几个不同的事情之后,我所经历的最大性能增益是创建视图并覆盖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毫秒。

这里是我的观点一个绘图性能的截图前后:

BEFORE: Using setImageBitmap instead of overriding onDraw.

AFTER: Using the above DTImageView which simply overrides OnDraw

1

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

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

6

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

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

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

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

3

我有一个背景图像,尺寸不大,但具有奇怪的尺寸 - 因此拉伸性能差。我使用参数Context,一个View和一个可绘制的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); 
} 
+0

这对我很好! –

0

创建大小为1080×1920只添加一个背景图像,并把它放在绘制-nodpi文件夹和解决了这个问题