2014-06-14 33 views
0

在我的活动中我有一个DrawerLayout。其抽屉的ListView使用下面的MenuLVAdapter填充。列表中只有5个项目。各个项目的布局由一个水平的LinearLayout组成,其中包含左侧的一个ImageView和右侧的一个TextView。选项的名字在字符串数组资源中,图标是可绘制的资源。每个drawable是一个128x128透明背景PNG,每个大约7KB。DrawerLayout由于图标图像显示而滑动/滚动时滞后

问题是,当我滑动抽屉时,设备呈现图标时动画非常不连贯。在此之前,抽屉应该滑动。打开/关闭抽屉和滚动时也会出现同样的波纹。如果没有自定义图像(使用股票@android:drawable/ic_menu_gallery图标),那么没有任何延迟。

我只在一个WVGA hTC Desire X打包双核1GHz CPU & 768MB RAM上进行了测试。我相信我可能需要调整图像大小并使其变小,但我不确定适当的尺寸应该是多少。我的应用程序也有一个活动,包装一个几乎ideards布局的ListView,图标是256x256透明PNG。这个作品像一个魅力 - 唯一的区别是它不是一个抽屉布局,而且每个项目的图像都是一样的。我也注意到,使抽屉的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

ic_menu_gallery的分辨率是多少?你有没有为每个屏幕分辨率(mdpi - xxhdpi)制作图形? – stewjacks

+0

我不知道ic_menu_gallery的解决方案,它来自股票Android资源。不,我没有为每个屏幕分辨率制作图形。这会有帮助吗?由于目前的尺寸相当低(128x128),与我的mdpi(72x72)的标准相比,我不明白为什么它会是一个很大的问题。 –

+0

你的图形很好,不应该是一个问题。您可能希望在Eclipse中查看[Hierarchy Viewer](http://developer.android.com/tools/help/hierarchy-viewer.html)或DDMS中的Dump View Hierarchy函数,以查看是否存在过于复杂的方法视图层次结构被组织 – stewjacks

回答

0

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

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