您的位置:首页 > 其它

一种实现视差效果的思路

2014-01-17 17:17 134 查看
private void onScrollChanged(int top) {
    	
    	if(scrollTop == top){
    		return;
    	}
    	
    	scrollTop = top;
    	
    	//srollview当前显示高度
        int scrollViewHeight = getHeight();
        //srollview实际的总高度
        int scrollViewBottom = getAbsoluteBottom();
        
        int scrollViewHalfHeight = scrollViewHeight / 2;
        
        // starts at 1 because the first View is a static non Discrollvable
        // view.
        for(int index = 1; index < mContent.getChildCount() ; index++) {
            
        	View child = mContent.getChildAt(index);
            
        	if(! (child instanceof Discrollvable)) {
                //it's a static view, doesn't care about
                continue;
            }
            
            Discrollvable discrollvable = (Discrollvable) child;
            
            int discrollvableTop = child.getTop();
            int discrollvableHeight = child.getHeight();
            int discrollvableAbsoluteTop = discrollvableTop - top;
            
            Log("DiscrollView ------- index: ", ""+index, index);
            
            Log("DiscrollView ------- top: ", ""+top, index);
            
            Log("DiscrollView ------- scrollViewHeight: ", ""+scrollViewHeight, index);
            
            Log("DiscrollView ------- scrollViewBottom: ", ""+scrollViewBottom, index);
            
            Log("DiscrollView ------- discrollvableTop: ", ""+discrollvableTop, index);
            
            Log("DiscrollView ------- discrollvableHeight: ", ""+discrollvableHeight, index);
            
            Log("DiscrollView ------- discrollvableAbsoluteTop: ", ""+discrollvableAbsoluteTop, index);
            
            Log("DiscrollView ------- child.getBottom(): ", ""+child.getBottom(), index);
            
            Log("DiscrollView ------- scrollViewBottom - child.getBottom() ", ""+(scrollViewBottom - child.getBottom()), index);
            
            Log("DiscrollView ------- discrollvableHeight + scrollViewHalfHeight: ", ""+(discrollvableHeight + scrollViewHalfHeight), index);
            
            //原始需求:提供一个 让用户在浏览引导时看到各个“Discrollvable”的滑动视差动画 的因子
            
            //尽可能的让用户从“Discrollvable”滑动到“ParentView”(此处是指的ScrollView)的显示中间,开始动画展示
            //当“Discrollvable”的顶部滑动到“ParentView”(此处是指的ScrollView),完成动画展示
            
            //哪些是定值,哪些是不定值
            //这个算法都是围绕“top”这个不定值来产生“视差”
            
            //进一步分析:由此对于ScrollView中的“Discrollvable”分为两类,
            //一类可以满足原始需求的--即它的底部“剩余高度” 大于 它的本身高度加上ScrollView显示高度的一半
            
            //形成视差:以每个“discrollvable”的实际高度作为“视差因子”的基数,
            //动画开始位置和“discrollvableAbsoluteTop”产生视差的变数.
            
            //the Discrollvable is too big to be discrollved when its center is reached
            //the Discrollvable center. Discrollve it by its top.
           
            if(scrollViewBottom - child.getBottom() < discrollvableHeight + scrollViewHalfHeight) {
            	
            	 Log("DiscrollView *********** discrollvableAbsoluteTop", ""+discrollvableAbsoluteTop, index);
            	
                //the Discrollvable top reaches the DiscrollView bottom
                if(discrollvableAbsoluteTop <= scrollViewHeight) {
                	
                    int visibleGap = scrollViewHeight - discrollvableAbsoluteTop;
                    
                    discrollvable.onDiscrollve(clamp(visibleGap / (float) discrollvableHeight, 0.0f, 1.0f));
                } else {
                    discrollvable.onResetDiscrollve();
                }
            } else {
            	
            	Log("DiscrollView ########## discrollvableAbsoluteTop", ""+discrollvableAbsoluteTop, index);
            	
                if(discrollvableAbsoluteTop <= scrollViewHalfHeight) {
                    //the Discrollvable center reaches the DiscrollView center
                    int visibleGap = scrollViewHalfHeight - discrollvableAbsoluteTop;
                    discrollvable.onDiscrollve(clamp(visibleGap / (float) discrollvableHeight, 0.0f, 1.0f));
                } else {
                    discrollvable.onResetDiscrollve();
                }
            }
        }
    }

参考Discrollview
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: