
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è)轉載請注明出處。