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
}