在我的活动中,我有一个DrawerLayout。它的抽屉ListView使用下面的MenuLVAdapter填充。列表中只有5个项目。各个项目的布局包含一个水平LinearLayout,左边是一个ImageView,右边是一个TextView。选项的名称在字符串数组资源中,图标是可绘制的资源。每个drawable是128x128透明背景png,每个约7KB。
问题在于,当我滑动抽屉时,当设备渲染图标时动画非常不稳定。在此之前,抽屉按原样滑动。打开/关闭抽屉和滚动时都会出现相同的波动。没有自定义图像(使用股票@android:drawable / ic_menu_gallery图标),没有任何延迟。
我只在WVGA hTC Desire X上测试了这个,它包装了一个双核1GHz CPU& 768MB RAM。我相信我可能需要调整图像大小并使它们变小,但我不确定适当的大小应该是多少。我的应用程序还有一个活动包装ListView与几乎相同的布局,图标是256x256透明pngs。那个工作就像一个魅力 - 唯一的区别是它不是一个抽屉布局,每个项目的图像是相同的。我还注意到,将抽屉的ListView内的ImageView设置得更大,甚至可以使它成为laggyer。
我尝试了一些方法,从将图像设置为drawables或bitmaps,将视图声明为全局,并且只在FindViewById上加载一次,在抽屉的ListView上启用/禁用滚动缓存和持久绘图缓存,但没有其中有任何影响。
我该怎样做才能摆脱滞后?
这是ListView的适配器(注意:我已禁用自定义字体加载,仍然无效):
class MenuLVAdapter : BaseAdapter
{
string[] items;
int[] images =
{
Resource.Drawable.dash_menuicon_home,
Resource.Drawable.dash_menuicon_mydashers,
Resource.Drawable.dash_menuicon_history,
Resource.Drawable.dash_menuicon_settings,
Resource.Drawable.dash_menuicon_exit
};
Activity context;
public MenuLVAdapter(Activity context)
{
this.context = context;
items = context.Resources.GetStringArray(Resource.Array.menuLVArray);
}
public override long GetItemId(int position)
{
return position;
}
public override Java.Lang.Object GetItem(int position)
{
return items[position];
}
public string[] Items
{
get { return items; }
}
public override int Count
{
get { return items.Length; }
}
public override View GetView(int position, View convertView, ViewGroup parent)
{
View view = convertView ?? context.LayoutInflater.Inflate (Resource.Layout.MenuLVLayout, null); // re-use an existing view, if one is available
TextView menuItemNameTV = view.FindViewById<TextView>(Resource.Id.menuItemName);
ImageView menuItemIconIV = view.FindViewById<ImageView>(Resource.Id.menuItemIcon);
menuItemNameTV.Text = items[position];
menuItemIconIV.SetImageResource(images[position]);
Typeface erasMid = Typeface.CreateFromAsset(context.Assets, "Fonts/ERASM.TTF");
menuItemNameTV.SetTypeface(erasMid, TypefaceStyle.Normal);
return view;
}
}
这也是我的MenuLVLayout.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="10dp">
<ImageView
android:src="@android:drawable/ic_menu_gallery"
android:layout_width="35dp"
android:layout_height="35dp"
android:id="@+id/menuItemIcon" />
<TextView
android:id="@+id/menuItemName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="#000"
android:text="Name"
android:textSize="20sp"
android:layout_marginLeft="9.3dp"
android:layout_gravity="center_vertical" />
</LinearLayout>
任何帮助将不胜感激! 谢谢!
答案 0 :(得分:0)
我有点通过使用Android Asset studio为每个屏幕密度创建自定义图标来解决这个问题。现在似乎没有任何滞后。这样做的缺点是,如果我想改变它们的大小,我必须重做所有图标。
对于遇到相同问题和/或想知道我如何解决问题的人,请转到Android Asset Studio&amp;选择“通用图标”。之后,加载一个图标,并确保将“大小”参数设置为DP中所需的图标大小(在我的情况下为35dp,如项目布局所示)。如果您愿意,也可以使用其他设置,但这是重要的一步。现在你所要做的就是逐个加载你的图标并为每个图标下载zip。如果您只是在不刷新页面的情况下加载新文件,则除名称之外的所有设置将保持不变 - 这有助于加快该过程。另外,正如我所说,如果您想要更改大小,请务必备份原始文件,因为您必须重复此过程。