2014-06-14 35 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。如果只是在不刷新頁面的情況下加載新文件,所有除名稱外的設置都將保持不變 - 這有助於加快進程速度。另外,正如我所說,如果您想要更改大小,請務必備份原始文件,因爲您必須重複此過程。