跟隨ListView滑動而變化的標題欄

ScrollviewWithToolbar.gif

最近遇到這樣的需求,一開始自己寫出來,總是會有跳頓感,不是那么流暢,去網上查了下,在加上自己修改了下,便成了現在的樣子。(滑動過程中上面的圖片是縮放的,里面的一個小icon是縮小放大透明度漸變的,真機加Vysor,看的效果特別模糊的,沒入Vysor pro,這畫質將就看吧)

當然應該還可以繼續(xù)優(yōu)化吧,不過最近比較忙,暫時先這樣吧。

為了以后方便自己整理學習,先寫到簡書吧。

首先初始化一些基本的參數

privatevoidinitDistance(){//這是頂部標題欄的初始高度;OrignHight = layout.getLayoutParams().height;//給它設定個上拉的最小高度;minHight = px2dp(100);//需要滑動的距離;Distance = OrignHight - minHight; }

判斷ListView是否滑動到頂部;

publicbooleanisListViewReachTopEdge(ListView listView){booleanresult =false;if(listView.getFirstVisiblePosition() ==0){? ? ? ? ? ? View childAt = listView.getChildAt(0);? ? ? ? ? ? result = childAt.getTop()==0;? ? ? }returnresult;}

下面的是對touchevent的處理

@OverridepublicbooleandispatchTouchEvent(MotionEvent ev){//如果ListView是在頂部,進行處理,不在頂部,不執(zhí)行? ? if(isListViewReachTopEdge(listView)){inty = (int) ev.getY();intdistanceY =0;switch(ev.getAction()) {caseMotionEvent.ACTION_DOWN:? ? ? ? ? ? ? ? ? ? pointY = y;? ? ? ? ? ? ? ? ? ? ? ? afterup =false;returnsuper.dispatchTouchEvent(ev);caseMotionEvent.ACTION_MOVE:? ? ? ? ? ? ? ? y = (int) ev.getY();if(currentDistance >= Distance && distanceY >0) {returnsuper.dispatchTouchEvent(ev);? ? ? ? ? ? ? ? ? ? ? ? }if(currentDistance <=0&& distanceY <0) {returnsuper.dispatchTouchEvent(ev);? ? ? ? ? ? ? ? ? ? ? ? }? ? ? ? ? ? ? ? ? ? ? ? distanceY = pointY - y;if(rate ==1) {if(distanceY >0) {returnsuper.dispatchTouchEvent(ev);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }? ? ? ? ? ? ? ? ? ? ? ? }? ? ? ? ? ? ? ? ? ? ? ? moveLayout(distanceY);? ? ? ? ? ? ? ? ? ? ? ? pointY = y;break;caseMotionEvent.ACTION_UP:? ? ? ? ? ? ? ? ? ? ? ? afterup =true;? ? ? ? ? ? ? ? ? ? ? ? elasticityHeight();returnsuper.dispatchTouchEvent(ev);? ? ? ? ? ? ? }? ? ? }else{returnsuper.dispatchTouchEvent(ev);? ? ? ? }returnfalse;}```接下來就是里面用的各種方法```java//滑動過程中的處理privatevoidmoveLayout(intdistanceY){? ? ViewGroup.LayoutParams layoutParams = layout.getLayoutParams();? ? layoutParams.height = layoutParams.height - distanceY;? ? layout.setLayoutParams(layoutParams);? ? elasticityHeight();? ? ? layout.requestLayout();? ? currentDistance = OrignHight - layout.getLayoutParams().height;? ? rate = (float) (currentDistance *1.0/ Distance);? ? moveViewByrate(rate);}

//抬手后進行的處理privatevoidelasticityHeight(){? ? ViewGroup.LayoutParams layoutParams = layout.getLayoutParams();if(layoutParams.height < minHight) {? ? ? ? layoutParams.height = minHight;? ? ? ? layout.setLayoutParams(layoutParams);? ? ? ? layout.requestLayout();? ? }if(layoutParams.height > OrignHight) {? ? ? ? layoutParams.height = OrignHight;? ? ? ? layout.setLayoutParams(layoutParams);? ? ? ? layout.requestLayout();? ? }if(afterup) {if(layoutParams.height < OrignHight /1.8) {? ? ? ? ? ? layoutParams.height = minHight;? ? ? ? ? ? layout.setLayoutParams(layoutParams);? ? ? ? ? ? imageView.setVisibility(View.GONE);? ? ? ? ? ? layout.requestLayout();? ? ? ? }if(layoutParams.height >= OrignHight /1.8) {? ? ? ? ? ? layoutParams.height = OrignHight;? ? ? ? ? ? layout.setLayoutParams(layoutParams);? ? ? ? ? ? imageView.setVisibility(View.VISIBLE);? ? ? ? ? ? imageView.setAlpha((float)1.0-0);? ? ? ? ? ? imageView.setScaleX(1);? ? ? ? ? ? imageView.setScaleY(1);? ? ? ? ? ? layout.requestLayout();? ? ? ? }? ? }}

//滑動過程中,控件的大小,透明度的變化privatevoidmoveViewByrate(floatrate){if(rate >=1) {? ? ? ? ? ? imageView.setVisibility(View.GONE);? ? ? ? }else{? ? ? ? ? ? imageView.setVisibility(View.VISIBLE);? ? ? ? ? ? imageView.setAlpha(1- rate);? ? ? ? ? ? imageView.setScaleX(1- rate);? ? ? ? ? ? imageView.setScaleY(1- rate);? ? ? ? }}

文章中有部分是轉載自網絡,在這里說聲抱歉。

因為時間倉促,里面可能有些錯誤,希望指正。

作者:一臉懵逼的大林子

鏈接:http://www.itdecent.cn/p/56b78a948ded

來源:簡書

著作權歸作者所有。商業(yè)轉載請聯系作者獲得授權,非商業(yè)轉載請注明出處。

?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容