ListView 中图像的低 FPS
Low FPS with images in a ListView
我正在为我大学的餐厅制作一个应用程序。
我有一个 ScrollView,里面有 2 个 ListView(一个用于第一道菜,另一个用于第二道菜)。
我使用以下代码创建 ListView:
ListView lista = (ListView)view.findViewById(R.id.listaprimero); //first dishes
ArrayList<Plato> arraydir = new ArrayList<Plato>(); //array for first dishes
ListView listaS = (ListView)view.findViewById(R.id.listasegundo); //second dishes
ArrayList<Plato> arraydirS = new ArrayList<Plato>(); //array for second dishes
Plato plato; //Object "dish"
//Now for each dish that I want to add, I use the object "Plato"
//to create a dish with its photo and its name.
//Then I add it to the ArrayList
plato = new Plato(getResources().getDrawable(R.drawable.macarrones), "Macarrones", "Amenizador");
arraydir.add(plato);
plato = new Plato(getResources().getDrawable(R.drawable.arroz), "Arroz tres delicias", "CEO");
arraydir.add(plato);
plato = new Plato(getResources().getDrawable(R.drawable.ternera), "Ternera", "Amenizador");
arraydir.add(plato);
plato = new Plato(getResources().getDrawable(R.drawable.pollo), "Filetitos de pollo", "Directora RRHH");
arraydirS.add(plato);
plato = new Plato(getResources().getDrawable(R.drawable.merluza), "Merluza al horno", "Directora RRHH");
arraydirS.add(plato);
// I create the Adapter for the dishes
AdapterPlatos adapter = new AdapterPlatos(getActivity(), arraydir);
AdapterPlatos adapterS = new AdapterPlatos(getActivity(), arraydirS);
// Set it
lista.setAdapter(adapter);
listaS.setAdapter(adapterS);
现在,当我 运行 应用程序时,我的 FPS 非常低并且 Android Studio 控制台每次都显示:
"Skipped 32 frames! The application may be doing too much work on its main thread."
但是当我这样制作菜肴时:
plato = new Plato(getResources().getDrawable(R.drawable.macarrones), "Dish 1", "Amenizador");
arraydir.add(plato);
plato = new Plato(getResources().getDrawable(R.drawable.macarrones), "Dish 2", "Amenizador");
arraydir.add(plato);
plato = new Plato(getResources().getDrawable(R.drawable.macarrones), "Dish 3", "Amenizador");
arraydir.add(plato);
plato = new Plato(getResources().getDrawable(R.drawable.macarrones), "Dish 4", "Amenizador");
arraydirS.add(plato);
...
使用同一张照片,不会出现问题。
PD:照片大小在70-200Kb之间,不是大文件。
为什么?
谢谢大家。
Drawable(Bitmap)解码加载到内存中显示还是需要时间
如果您的 Plato
对象只保留可绘制对象的资源 ID,而不是可绘制对象本身,那就更好了。这将使用更少的内存。然后在您的适配器 getView()
中,您可以使用 Glide 之类的东西将该资源加载到您的 ImageView
.
Glide.with(context).load(R.drawable.macarrones).into(imageView);
确保图像的大小适合容器。即时调整图像大小的计算成本很高,并且会导致应用程序性能下降;特别是当涉及到 ListViews 时。
如果您从服务器获取图像,或者您支持不同的显示尺寸,您可以考虑使用后台线程先调整它们的大小,然后使用调整后的图像而不是原始图像(需要调整大小分配给视图时即时)。
我正在为我大学的餐厅制作一个应用程序。
我有一个 ScrollView,里面有 2 个 ListView(一个用于第一道菜,另一个用于第二道菜)。
我使用以下代码创建 ListView:
ListView lista = (ListView)view.findViewById(R.id.listaprimero); //first dishes
ArrayList<Plato> arraydir = new ArrayList<Plato>(); //array for first dishes
ListView listaS = (ListView)view.findViewById(R.id.listasegundo); //second dishes
ArrayList<Plato> arraydirS = new ArrayList<Plato>(); //array for second dishes
Plato plato; //Object "dish"
//Now for each dish that I want to add, I use the object "Plato"
//to create a dish with its photo and its name.
//Then I add it to the ArrayList
plato = new Plato(getResources().getDrawable(R.drawable.macarrones), "Macarrones", "Amenizador");
arraydir.add(plato);
plato = new Plato(getResources().getDrawable(R.drawable.arroz), "Arroz tres delicias", "CEO");
arraydir.add(plato);
plato = new Plato(getResources().getDrawable(R.drawable.ternera), "Ternera", "Amenizador");
arraydir.add(plato);
plato = new Plato(getResources().getDrawable(R.drawable.pollo), "Filetitos de pollo", "Directora RRHH");
arraydirS.add(plato);
plato = new Plato(getResources().getDrawable(R.drawable.merluza), "Merluza al horno", "Directora RRHH");
arraydirS.add(plato);
// I create the Adapter for the dishes
AdapterPlatos adapter = new AdapterPlatos(getActivity(), arraydir);
AdapterPlatos adapterS = new AdapterPlatos(getActivity(), arraydirS);
// Set it
lista.setAdapter(adapter);
listaS.setAdapter(adapterS);
现在,当我 运行 应用程序时,我的 FPS 非常低并且 Android Studio 控制台每次都显示: "Skipped 32 frames! The application may be doing too much work on its main thread."
但是当我这样制作菜肴时:
plato = new Plato(getResources().getDrawable(R.drawable.macarrones), "Dish 1", "Amenizador");
arraydir.add(plato);
plato = new Plato(getResources().getDrawable(R.drawable.macarrones), "Dish 2", "Amenizador");
arraydir.add(plato);
plato = new Plato(getResources().getDrawable(R.drawable.macarrones), "Dish 3", "Amenizador");
arraydir.add(plato);
plato = new Plato(getResources().getDrawable(R.drawable.macarrones), "Dish 4", "Amenizador");
arraydirS.add(plato);
...
使用同一张照片,不会出现问题。
PD:照片大小在70-200Kb之间,不是大文件。
为什么?
谢谢大家。
Drawable(Bitmap)解码加载到内存中显示还是需要时间
如果您的 Plato
对象只保留可绘制对象的资源 ID,而不是可绘制对象本身,那就更好了。这将使用更少的内存。然后在您的适配器 getView()
中,您可以使用 Glide 之类的东西将该资源加载到您的 ImageView
.
Glide.with(context).load(R.drawable.macarrones).into(imageView);
确保图像的大小适合容器。即时调整图像大小的计算成本很高,并且会导致应用程序性能下降;特别是当涉及到 ListViews 时。
如果您从服务器获取图像,或者您支持不同的显示尺寸,您可以考虑使用后台线程先调整它们的大小,然后使用调整后的图像而不是原始图像(需要调整大小分配给视图时即时)。