由于图标图像显示,DrawerLayout在滑动/滚动时滞后

时间:2014-06-14 16:09:27

标签: c# android listview xamarin.android drawerlayout

在我的活动中,我有一个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>

任何帮助将不胜感激! 谢谢!

1 个答案:

答案 0 :(得分:0)

我有点通过使用Android Asset studio为每个屏幕密度创建自定义图标来解决这个问题。现在似乎没有任何滞后。这样做的缺点是,如果我想改变它们的大小,我必须重做所有图标。

对于遇到相同问题和/或想知道我如何解决问题的人,请转到Android Asset Studio&amp;选择“通用图标”。之后,加载一个图标,并确保将“大小”参数设置为DP中所需的图标大小(在我的情况下为35dp,如项目布局所示)。如果您愿意,也可以使用其他设置,但这是重要的一步。现在你所要做的就是逐个加载你的图标并为每个图标下载zip。如果您只是在不刷新页面的情况下加载新文件,则除名称之外的所有设置将保持不变 - 这有助于加快该过程。另外,正如我所说,如果您想要更改大小,请务必备份原始文件,因为您必须重复此过程。