1. 程式人生 > >Android -- 固定在ScrollView頂部的View,類似於新浪微博的評論列表的頂部

Android -- 固定在ScrollView頂部的View,類似於新浪微博的評論列表的頂部

現在很多App都實現了這個功能,例如新浪微博評論頁面的評論、轉發、讚的數字可以固定在螢幕上方。我個人很喜歡這種設計,所以利用一點空餘時間簡單實現了一個類似的功能。


先來看一下上面這張圖的效果。

這個是新浪微博的一個頁面,整體佈局大致分了三塊:正文內容、轉發評論贊的數字條、評論列表

其中數字條是可以跟著ScrollView一起滑動,但在滑到最頂部時固定在最上面,而下面的評論內容可以繼續滑動。

這種效果還是挺讚的,但一開始沒有什麼思路,所以就去搜了下相關技術程式碼,一下就恍然大悟!原來是自己想複雜了,其實原理很簡單!

下面是自己實現的效果圖:

實現原理:

    當滾動條劃過頭部時,把需要固定的頭部從父佈局中移除,然後新增到最外層佈局的頂部。

當滾動條返回時又把最外層的頭部移然後重新新增到原來的父佈局裡面。

    整個實現程式碼,不算上佈局,也就100行左右

詳細實現邏輯:

首先建一個自定義View叫MyHoveringScrollView繼承自FrameLayout,在佈局裡MyHoveringScrollView處於最外層。由於FrameLayout本身是不支援滾動條的,所以在FrameLayout內部有一個自定義的ScrollView。

在初始化的時候,通過getChildAt(0)把子佈局拿到,然後清空整個佈局,然後例項化一個自己的ScrollView,把之前拿到的子佈局新增到ScrollView裡面,

最後把ScrollView新增到MyHoveringScrollView裡面。

  1. publicvoid init() {  
  2.         post(new Runnable() {  
  3.             @Override
  4.             publicvoid run() {  
  5.                 mContentView = (ViewGroup) getChildAt(0);  
  6.                 removeAllViews();  
  7.                 MyScrollView scrollView = new MyScrollView(getContext(), MyHoveringScrollView.
    this);  
  8.                 scrollView.addView(mContentView);  
  9.                 addView(scrollView);  
  10.             }  
  11.         });  
  12.     }  

?

可能注意到了兩點:

1、我用了post()。因為在構造方法裡面佈局還沒有生成,getChildAt(0)是拿不到東西的,但是post()會把動作放到佇列裡,等佈局完成後再從佇列裡取出來,所以這裡是個小竅門。

2、我把MyHoveringScrollView傳入到了ScrollView裡面,這麼做其實是為了讓ScrollView回撥MyHoveringScrollView的方法。(比較懶,不想寫介面……)

然後通過setTopView()方法,把需要固定在頂部的ID傳進來:

  1. publicvoid setTopView(finalint id) {  
  2.         post(new Runnable() {  
  3.             @Override
  4.             publicvoid run() {  
  5.                 mTopView = (ViewGroup) mContentView.findViewById(id);  
  6.                 int height = mTopView.getChildAt(0).getMeasuredHeight();  
  7.                 ViewGroup.LayoutParams params = mTopView.getLayoutParams();  
  8.                 params.height = height;  
  9.                 mTopView.setLayoutParams(params);  
  10.                 mTopViewTop = mTopView.getTop();  
  11.                 mTopContent = mTopView.getChildAt(0);  
  12.             }  
  13.         });  
  14.     }  

接下來,在ScrollView裡面重寫onScrollChanged()方法,並回調給MyHoveringScrollView的onScroll方法:

  1. privatestaticclass MyScrollView extends ScrollView {  
  2.         private MyHoveringScrollView mScrollView;  
  3.         public MyScrollView(Context context, MyHoveringScrollView scrollView) {  
  4.             super(context);  
  5.             mScrollView = scrollView;  
  6.         }  
  7.         @Override
  8.         protectedvoid onScrollChanged(int l, int t, int oldl, int oldt) {  
  9.             super.onScrollChanged(l, t, oldl, oldt);  
  10.             mScrollView.onScroll(t);  
  11.         }  
  12.     }  
  13. publicvoid onScroll(finalint scrollY) {  
  14.         post(new Runnable() {  
  15.             @Override
  16.             publicvoid run() {  
  17.                 if (mTopView == null
  18.                         ) return;  
  19.                 if (scrollY >= mTopViewTop  
  20.                         && mTopContent.getParent() == mTopView) {  
  21.                     mTopView.removeView(mTopContent);  
  22.                     addView(mTopContent);  
  23.                 } elseif (scrollY < mTopViewTop  
  24.                         && mTopContent.getParent() == MyHoveringScrollView.this) {  
  25.                     removeView(mTopContent);  
  26.                     mTopView.addView(mTopContent);  
  27.                 }  
  28.             }  
  29.         });  
  30.     }  


?

如果scrollY >= mTopViewTop就是頭部應該被固定在頂部的時候

如果scrollY < mTopViewTop就是頭部應該取消固定,還原到原來父佈局的時候

至此,功能就實現了!

怎麼使用呢?首先先寫佈局:

  1. <com.hide.myhoveringscroll.app.MyHoveringScrollView
  2.         xmlns:android="http://schemas.android.com/apk/res/android"
  3.         android:id="@+id/view_hover"
  4.         android:layout_width="match_parent"
  5.         android:layout_height="match_parent">
  6.     <LinearLayoutandroid:layout_width="match_parent"
  7.                   android:layout_height="match_parent"
  8.                   android:orientation="vertical"
  9.             >
  10.         <TextViewandroid:layout_width="match_parent"
  11.                   android:layout_height="300dp"
  12.                   android:text="這是頭部"
  13.                   android:gravity="center"
  14.                 />
  15.         <FrameLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"
  16.                      android:id="@+id/top"
  17.                 >
  18.             <LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"
  19.                           android:padding="20dp"
  20.                           android:background="#AAff0000"
  21.                           android:orientation="horizontal">
  22.                 <TextViewandroid:layout_width="0dp"android:layout_height="wrap_content"
  23.                           android:layout_weight="1"
  24.                           android:gravity="center"
  25.                           android:layout_gravity="center"
  26.                           android:textSize="16sp"
  27.                           android:text="這是固定部分"
  28.                         />
  29.                 <Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"
  30.                         android:text="點我一下"
  31.                         android:id="@+id/btn"
  32.                         />
  33.             </LinearLayout>
  34.         </FrameLayout>
  35.         <TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"
  36.                   android:paddingTop="10dp"
  37.                   android:text="內容\n內容\n內容\n內容\n內容\n內容\n內容\n內容\n內容\n內容\n內容\n內容\n內容\n內容\n內容\n內容\n內容\n內容\n內容\n內容\n內容\n內容\n內容\n內容\n內容\n內容\n內容\n內容\n內容\n內容\n內容\n內容\n內容\n內容\n內容\n內容\n內容\n內容\n內容\n內容\n內容\n內容\n內容\n內容\n內容\n內容\n內容\n內容\n內容\n內容\n內容\n內容\n內容\n內容\n內容\n內容\n內容\n內容\n內容\n內容\n內容\n內容\n內容\n內容\n內容\n內容\n內容\n內容\n內容\n"
  38.                 />
  39.     </LinearLayout>
  40. </com.hide.myhoveringscroll.app.MyHoveringScrollView>
?

其中:MyHoveringScrollView在最外層,充當ScrollView的角色(所以子佈局只能有一個)

android:id="@+id/top也就是需要固定在頂部的佈局

最後回到Activity:

  1. view_hover = (MyHoveringScrollView) findViewById(R.id.view_hover);  
  2. view_hover.setTopView(R.id.top);  

相關推薦

Android -- 固定ScrollView頂部View類似評論列表頂部

現在很多App都實現了這個功能,例如新浪微博評論頁面的評論、轉發、讚的數字可以固定在螢幕上方。我個人很喜歡這種設計,所以利用一點空餘時間簡單實現了一個類似的功能。 先來看一下上面這張圖的效果。 這個是新浪微博的一個頁面,整體佈局大致分了三塊:正文內容、轉發評論贊的

python 爬蟲1 開始先拿開始

大括號 版本 install esp con data- 定位 ble Language 剛剛開始學。 目的地是兩個。一個微博,一個貼吧 存入的話,臨時還沒想那麽多。先存到本地目錄吧 分詞和推薦後面在整合 mysql mongodb hadoop redius 後面在用

Android中使App快速 簡單地支援 信 QQ facebook等十幾個主流社交平臺的分享功能

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

PC客戶端(DotNet WinForm C# 版C#呼叫API程式碼原始碼下載)—— 初探 (第二部分內建連結)

最近興趣使然嘗試了一下使用DotNet技術實現新浪微博PC客戶端,幾天時間,目前實現登入、微博列表、釋出純文字微博功能,新浪API呼叫基本沒什麼難度,在微博列表形式處理上著實讓我煩躁了一陣子,Windows Form使用不多,這次開發也感覺有些捉襟見肘。   環境:

android sdk 整合 檔案不存在(8998) 您所訪問的站點在的認證失敗錯誤碼 21322

問題:使用mSsoHandler.authorize(new AuthListener()); 請求授權 微部落格戶端報 檔案不存在(8998)             使用mSsoHandler.authorizeWeb(new Au

仿首頁具有泥鰍蚯蚓滑動效果的可自定義ViewAndroid ViewPager指示器

說到蚯蚓滑動效果的指示器,市面上很常見 也許是普通的控制元件習以為常了,刷微博的時候看到微博首頁的設計覺得很有意思 於是在公司的蚯蚓滑動指示器的基礎上進行了加工,寫了這麼一個指示器,效果如下所示 程式碼不多,正當我竊喜的時候我突然發現遇到個坑,點選popupwindo

【forlong401的專欄--有問題上:http://www.androidren.com】Android and iOS Now! 多交流技術多分享技術只有分享才會經久不衰。 歡迎關注:@forlong401 。http://weibo.

Android and iOS Now! 多交流技術,多分享,技術只有分享,才會經久不衰。 歡迎關注新浪微博:@forlong401 。http://weibo.com/forlong401...

[iOS]類似或者人人客戶端中中間UITabBarItem只有圖片,使圖片居中的方法

一、問題描述 老生常談,類似新浪微博或者人人客戶端中,首頁常見UITabBar中間Item只有圖片且圖片位置垂直居中,效果如下圖 二、問題解決 很簡單,比如中間的VC叫MiddleViewController @implementatio

Android 自定義view-仿#話題#插入EditText

不小心開啟新浪微博發微博頁面有個可以插入話題#…#的功能,看著挺好玩的。就照著實現了一下。 如果不知道怎麼樣效果的可以開啟微博看看。大概的功能是: 插入話題使用#特殊符號開頭和結尾 話題文字高亮顯示 刪除話題選中整個話題文字一次性刪除 可以插入多個話題

android學習:Outh2授權21322錯誤

其實官網文件講的很詳細,這裡記一個容易出錯的地方,應用的回撥頁,程式碼中的REDIRECT_URL,要和開放平臺中應用資訊裡的授權回撥頁一致,不然會出現21322錯誤 程式碼中的REDIRECT_URL: public class Constants { //應用的AP

類似動態釋出時間轉換機制顯示剛剛、幾分鐘前、幾小時前、昨天、前天····

經常看到社交類app中關於動態釋出的時間點與當前時間的換算,說麻煩也不麻煩,說簡單也不簡單,只是計算起來有點繞。如以當前時間為基準,自己某個時間在微博上發表一個動態,發表時間提示有多種顯示,如剛剛、幾分鐘前、幾個小時前、昨天、前天、日期等等。自己之前做過類似的時間換算,雖然

android為什麼我呼叫分享圖片分享的是一張很模糊基本失真的圖片。。怎麼處理

程式碼如下,用這種方式調QQ,微信就不存在這麼嚴重的失真現象。  private String imageUrl = null;     private void weiboShare(){         if (!

Android中使App高速、簡單地支持信、QQ、facebook等十幾個主流社交平臺的分享功能

分析 ont renren androidm mod 執行 xen 12px 操作 前言 在如今的APP或者遊戲中,分享功能差點兒已經成為標配。分享功能不但能夠滿足用戶的需求。也能夠為產品帶來很多其它的用戶,甚至能夠對用戶的行為、活躍度、年齡段等情況進行數據統計,使得軟

實現QQ、信、和百度第三方登錄(Android Studio)

wiki protocol super cli 路徑 參考 syn jar包 all 前言: 對於大多數的APP都有第三方登錄這個功能,自己也做過幾次,最近又有一個新項目用到了第三方登錄,所以特意總結了一下關於第三方登錄的實現,並拿出來與大家一同分享; 各大開放平臺註冊

Android 開放平臺應用 android簽名怎麽獲得

文件 簽名 jdk cnblogs androi *** 命令 user pan 方法一:   通過命令行,直接生成MD5值   keytool -list -v -keystore keystorefile -storepass 123456   其中ke

Python爬蟲開源項目代碼爬取信、淘寶、豆瓣、知乎、、QQ、去哪網等 代碼整理

http server 以及 pro 模擬登錄 取數 存在 漏洞 搜狗 作者:SFLYQ 今天為大家整理了32個Python爬蟲項目。 整理的原因是,爬蟲入門簡單快速,也非常適合新入門的小夥伴培養信心。所有鏈接指向GitHub,祝大家玩的愉快~ 1、WechatSogou

頂部通欄-效果

ntb var fun on() wid 新浪微博 off tex function JS---------------------------------------- window.onload=function() {

華為終端-聯合創新3D建模+AR 成就全新社交體驗

近日,全球首款搭載3D感知攝像頭的手機華為Mate 20釋出。 通過Mate 20自帶的景深攝像頭及麒麟980的NPU加速能力,手機能夠在獲取物體表面資訊後,完成高速的精細化3D建模。 那麼,如何讓3D建模更貼近使用者生活、為使用者帶來更多樂趣?今年7月,華為三方創新實驗室與新浪微博開展聯合創新,共同發力

:絕境逢生處務實精神驅動下的技術成熟

2009年初夏,一個已經接近完工的大專案“朋友”團隊,在理想國際大廈面向新浪CEO曹國偉等人做了兩個多小時的產品彙報,這款定位在社交場景下的產品,被決策層判定“沒明白核心賣點是什麼”、“產品不夠簡單、不具傳播性”。 “朋友”在新浪互動社群部研發兩年後終遭擱淺。彼時,新浪部落格的風頭漸弱,新浪亟待尋找一個新的

Android 第三方登入之授權登入

Android第三方登入的優點有很多,這裡先簡單略過,後續再補充。先寫微博,其他的慢慢補充 新浪微博授權登入 新浪微博開放平臺 新浪微博Android SDK 主要流程如下: 這裡只是寫了一下程式的邏輯,前期的註冊申請工作可以參考官網,或者直接點這裡:新手指南 /**