现在的位置: 首页 > 综合 > 正文

Android launcher 循环优化

2013年10月07日 ⁄ 综合 ⁄ 共 1267字 ⁄ 字号 评论关闭

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
    }

修改后的效果是临界切屏也会有一个滑动效果,和其他屏切换维持一致性。


【上篇】
【下篇】

抱歉!评论已关闭.