您的位置:首页 > 其它

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

2012-11-14 14:02 246 查看
1.
Workspace.java
的修改实现左右循环滑动、壁纸在循环滑动时的平滑过渡

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

方法1:

通过研究代码发现每次在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

}
方法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;
}
------
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Launcher 壁纸 循环