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

ScrollviewWithToolbar.gif

最近遇到這樣的需求蔚晨,一開始自己寫出來乍钻,總是會有跳頓感肛循,不是那么流暢,去網(wǎng)上查了下银择,在加上自己修改了下多糠,便成了現(xiàn)在的樣子。(滑動過程中上面的圖片是縮放的浩考,里面的一個小icon是縮小放大透明度漸變的夹孔,真機加Vysor,看的效果特別模糊的析孽,沒入Vysor pro搭伤,這畫質(zhì)將就看吧)

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

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

首先初始化一些基本的參數(shù)

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

判斷ListView是否滑動到頂部殿漠;

public boolean isListViewReachTopEdge(ListView listView){    
  boolean result = false;    
  if(listView.getFirstVisiblePosition() == 0){        
    View childAt = listView.getChildAt(0);        
    result = childAt.getTop()==0;    
  }    
  return result;
}

下面的是對touchevent的處理

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
//如果ListView是在頂部,進行處理佩捞,不在頂部绞幌,不執(zhí)行    
  if(isListViewReachTopEdge(listView)){       
     int y = (int) ev.getY();       
     int distanceY = 0;        
     switch (ev.getAction()) {            
       case MotionEvent.ACTION_DOWN:           
         pointY = y;                
         afterup = false;                
         return super.dispatchTouchEvent(ev);            
       case MotionEvent.ACTION_MOVE:       
         y = (int) ev.getY();             
        if (currentDistance >= Distance && distanceY > 0) {                    
          return super.dispatchTouchEvent(ev);                
        }                
        if (currentDistance <= 0 && distanceY < 0) {                    
          return super.dispatchTouchEvent(ev);                
        }                
        distanceY = pointY - y;                
        if (rate == 1) {                    
          if (distanceY > 0) {                        
            return super.dispatchTouchEvent(ev);                    
          }                
        }                
        moveLayout(distanceY);                
        pointY = y;                
        break;            
       case MotionEvent.ACTION_UP:                
        afterup = true;                
        elasticityHeight();                
        return super.dispatchTouchEvent(ev);        
      }    
  }else {        
    return super.dispatchTouchEvent(ev);    
    }    
   return false;
}```

接下來就是里面用的各種方法

```java
//滑動過程中的處理
private void moveLayout(int distanceY) {
    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);}
//抬手后進行的處理
private void elasticityHeight() {
    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();
        }
    }
}
//滑動過程中,控件的大小一忱,透明度的變化
private void moveViewByrate(float rate) {
        if (rate >= 1) {
            imageView.setVisibility(View.GONE);
        } else {
            imageView.setVisibility(View.VISIBLE);
            imageView.setAlpha(1 - rate);
            imageView.setScaleX(1 - rate);
            imageView.setScaleY(1 - rate);
        }
}

文章中有部分是轉(zhuǎn)載自網(wǎng)絡莲蜘,在這里說聲抱歉。
因為時間倉促帘营,里面可能有些錯誤票渠,希望指正。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末芬迄,一起剝皮案震驚了整個濱河市问顷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌禀梳,老刑警劉巖杜窄,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異算途,居然都是意外死亡塞耕,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進店門郊艘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來荷科,“玉大人唯咬,你說我怎么就攤上這事纱注∥方” “怎么了?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵狞贱,是天一觀的道長刻获。 經(jīng)常有香客問我,道長瞎嬉,這世上最難降的妖魔是什么蝎毡? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮氧枣,結果婚禮上沐兵,老公的妹妹穿的比我還像新娘。我一直安慰自己便监,他們只是感情好扎谎,可當我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著烧董,像睡著了一般毁靶。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上逊移,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天预吆,我揣著相機與錄音,去河邊找鬼胳泉。 笑死拐叉,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的扇商。 我是一名探鬼主播凤瘦,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼钳吟!你這毒婦竟也來了廷粒?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤红且,失蹤者是張志新(化名)和其女友劉穎坝茎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體暇番,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡嗤放,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了壁酬。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片次酌。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡恨课,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出岳服,到底是詐尸還是另有隱情剂公,我是刑警寧澤,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布吊宋,位于F島的核電站纲辽,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏璃搜。R本人自食惡果不足惜拖吼,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望这吻。 院中可真熱鬧吊档,春花似錦、人聲如沸唾糯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽趾断。三九已至拒名,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間芋酌,已是汗流浹背增显。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留脐帝,地道東北人同云。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像堵腹,于是被迫代替她去往敵國和親炸站。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,697評論 2 351

推薦閱讀更多精彩內(nèi)容