Launcher 壁纸随着左右滑动,临界时自然过渡

来源:互联网 发布:insar数据 编辑:程序博客网 时间:2024/04/30 16:55

1.      Workspace.java的修改实现左右循环滑动、壁纸在循环滑动时的平滑过渡

<>壁纸在循环滑动时的平滑过渡

方法1

通过研究代码发现每次在onTouchEventcomputeScroll时都会调用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
    }

方法2

重写updateWallpaperOffset,在computeScroll():重写了父类的computeScroll();主要功能是计算拖动的位移量、更新背景、设置要显示的屏幕

private void updateWallpaperOffsetNew(int nScrollx) {     //nScrollx 为触摸得到x坐标值

updateWallpaperOffset((getChildAt(getChildCount() - 1).getRight() - (mRight - mLeft)),nScrollx);

 }

private void updateWallpaperOffset(int scrollRange,int newScrollx) {

        IBinder token = getWindowToken();

        if (token != null) {

        mWallpaperManager.setWallpaperOffsetSteps(1.0f / (getChildCount() - 1), 0 );

        mWallpaperManager.setWallpaperOffsets(getWindowToken(),

        Math.max(0.f, Math.min(newScrollx/(float)scrollRange, 1.f)), 0);

 

 

        }

}

 

public void computeScroll() {

//重写了父类的computeScroll();主要功能是计算拖动的位移量、更新背景、设置要显示的屏幕 //setCurrentScreen(mCurrentScreen);

------

else if (mNextScreen != INVALID_SCREEN ) { 

            if (mNextScreen == -1 && true) {  //向左滑动到最左cellLayout屏幕边界

                mCurrentScreen = getChildCount() - 1;

                scrollTo(mCurrentScreen * getWidth(), getScrollY());

                int n=0;        

// mScroller.getCurrX()获取的最大值 TOATLE_NUMBER为所有(cellLyout屏幕的总数+1*每个屏幕的跨度值

          while(n<=TOATLE_NUMBER){ //壁纸循环向右滑动

             updateWallpaperOffsetNew(n) ;

             n+=180;

          }

             

            } else if (mNextScreen == getChildCount() && true) {

////向右滑动到最左cellLayout屏幕边界

                mCurrentScreen = 0;

                scrollTo(0, getScrollY());

               // updateWallpaperOffset();

           int m=TOATLE_NUMBER;

           while(m>=0){//壁纸循环向左滑动

              updateWallpaperOffsetNew(m) ;

              m-=180;

          }

       ------      

    }         

原创粉丝点击