我正在使用viewpager在我的应用中的片段之间滑动。我在XML中定义了背景,所以
android:background="@drawable/bg_final"
如果我使用简单的背景颜色,我的应用程序非常流畅。如果我将它与此背景图像一起使用,fps会减少,我的应用程序也只能通过。它并不慢,只是不那么顺利,但是在较弱的设备上它可能会工作迟缓。这是一种应用背景图像的坏方法吗?整个图像是480x800 png,大小为14.7kB。可能是什么问题?
(片段的背景是透明的,viewpager在main.xml中,其背景与此图像有关)
答案 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:强>
<强> AFTER:强>
答案 1 :(得分:8)
我有点迟了,但这只是我的意思,在运行GPU调试器时,我注意到系统放大了我的图像!我有一个1920x1080的图像,它显示为3780x6720纹理!
理想情况下,您应该在相应文件夹(res/drawable-mdpi
,res/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文件夹中,这就解决了这个问题