Android launcher 循環優化-壁紙切換

點擊打開鏈接

CyanogenMod 7內置的launcher是基於ADW的,自己也刷過cm7總得感覺還不錯。launcher的循環功能是一個特性,不過體驗並不好。尤其是在臨界切換時,壁紙的突然跳躍,朋友手機上的360桌面也有這個問題,於是琢磨能不能在看懂的基礎上進行一些優化:

壁紙的移動和變化主要是由系統android.app.WallpaperManager來維護,應用要控制壁紙只需要2個步驟:

1.實例化一個WallpaperManager : 

private final WallpaperManager mWallpaperManager;

2.調用WallpaperManager 相關方法:

mWallpaperManager.setWallpaperOffsetSteps(0.5f, 0 );
mWallpaperManager.setWallpaperOffsets(getWindowToken(), 0.5f, 0);

通過研究代碼發現每次在onTouchEvent和computeScroll時都會調用updateWallpaperOffset,然後再調用WallpaperManager 的方法來對壁紙進行操作。

updateWallpaperOffset()中油判斷語句:

if(getScrollX()>0 && getScrollX()<getChildAt(getChildCount() - 1).getLeft())

意思是隻有ScrollX()大於0小於當前屏幕跨度的前提下壁紙纔會移動,循環桌面的臨界切屏是小於0或大於屏幕跨度的。

現象就是只會在臨界切屏完成後壁紙進行一次切換,沒有一個漸變和交互的過程,再加上壁紙是從一段到另外一端,

就產生了很突兀的用戶體驗。

原因找到了,於是就在這裏進行相關的優化:

 private void updateWallpaperOffset(int scrollRange) 

    {
    if(getScrollX() >= -(float)scrollRange / (getChildCount() - 1))
    {
    mWallpaperManager.setWallpaperOffsetSteps(1.0f / (getChildCount() - 1), 0 );
    float percent = mScrollX/(float)scrollRange;
    if(percent > 1)
    {
    percent = -(float)(percent - 1 - 1.0f / (getChildCount() - 1));
    }
    else if(percent < 0)
    {
    percent = (float)(1 - 1.0f / (getChildCount() - 1) - percent);
    }
    mWallpaperManager.setWallpaperOffsets(getWindowToken(), 
    percent , 0);
    }
    //add for desktop looping
    }

修改後的效果是臨界切屏也會有一個滑動效果,和其他屏切換維持一致性。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章