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