我已经实现来类似桌面launcher滑动的效果在自己的应用里面。用的一个Scroller,scrollBy(), startScroll()等 基本上和launcher实现类似
但是发现我的滑动不如桌面那样平滑,
我感觉不是算法问题,  我猜测是cache方面的优化问题?
请问大家知道是什么原因么?
大胆猜测,或者有什么好的建议,欢迎讨论!

解决方案 »

  1.   

    可以使用ViewFlipper 具体可以参考我的博客园博文。http://www.cnblogs.com/TerryBlog 其中有一篇有讲到使用ViewFlipper 做这个效果。
      

  2.   

    我之前用的也是ViewFlipper,然后用的animation,但是无法做到桌面那种及时响应滑动的效果,
    问一下, 你确定你实现的是桌面那样滑动吗?
      

  3.   

    那谢谢谢谢 我去找找,你的内容有些多。。不太好找但是我一直觉得ViewFlipper无法实现这个效果
      

  4.   

    放在不同的surface里面,肯定能快一些
      

  5.   

    是不够平滑,拖拽和滑动已经是同步的了
    如果用简单一点的图片演示的话,基本上和桌面是一个效果了所以我感觉是要怎样优化一下目前毫无头绪。。 恳求给点建议!
    我还在launcher的源码workspace.java里面提取了一些貌似很有用的优化代码
    // The following implementation attempts to fast-track
    // the drawing dispatch by drawing only what we know needs to be 
    正如他所说,这个是减少多余的重绘,只关心我们需要重绘的区域 
     @Override
        protected void dispatchDraw(Canvas canvas) {         boolean restore = false;
            int restoreCount = 0;         // ViewGroup.dispatchDraw() supports many features we don't need:
            // clip to padding, layout animation, animation listener, disappearing
            // children, etc. The following implementation attempts to fast-track
            // the drawing dispatch by drawing only what we know needs to be drawn.         boolean fastDraw = mTouchState != TOUCH_STATE_SCROLLING  ;
            // If we are not scrolling or flinging, draw only the current screen
            if (fastDraw) {
                drawChild(canvas, getChildAt(mCurrentScreen), getDrawingTime());
            } else {
                final long drawingTime = getDrawingTime();
                final float scrollPos = (float) mScrollX / getWidth();
                final int leftScreen = (int) scrollPos;
                final int rightScreen = leftScreen + 1;
                if (leftScreen >= 0) {
                    drawChild(canvas, getChildAt(leftScreen), drawingTime);
                }
                if (scrollPos != leftScreen && rightScreen < getChildCount()) {
                    drawChild(canvas, getChildAt(rightScreen), drawingTime);
                }
            }         if (restore) {
                canvas.restoreToCount(restoreCount);
            }
        
      }