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
}