Android -- 固定在ScrollView頂部的View,類似於新浪微博的評論列表的頂部
現在很多App都實現了這個功能,例如新浪微博評論頁面的評論、轉發、讚的數字可以固定在螢幕上方。我個人很喜歡這種設計,所以利用一點空餘時間簡單實現了一個類似的功能。
先來看一下上面這張圖的效果。
這個是新浪微博的一個頁面,整體佈局大致分了三塊:正文內容、轉發評論贊的數字條、評論列表
其中數字條是可以跟著ScrollView一起滑動,但在滑到最頂部時固定在最上面,而下面的評論內容可以繼續滑動。
這種效果還是挺讚的,但一開始沒有什麼思路,所以就去搜了下相關技術程式碼,一下就恍然大悟!原來是自己想複雜了,其實原理很簡單!
下面是自己實現的效果圖:
實現原理:
當滾動條劃過頭部時,把需要固定的頭部從父佈局中移除,然後新增到最外層佈局的頂部。
當滾動條返回時,又把最外層的頭部移除,然後重新新增到原來的父佈局裡面。
整個實現程式碼,不算上佈局,也就100行左右。
詳細實現邏輯:
首先建一個自定義View叫MyHoveringScrollView繼承自FrameLayout,在佈局裡MyHoveringScrollView處於最外層。由於FrameLayout本身是不支援滾動條的,所以在FrameLayout內部有一個自定義的ScrollView。
在初始化的時候,通過getChildAt(0)把子佈局拿到,然後清空整個佈局,然後例項化一個自己的ScrollView,把之前拿到的子佈局新增到ScrollView裡面,
最後把ScrollView新增到MyHoveringScrollView裡面。
- publicvoid init() {
- post(new Runnable() {
- @Override
- publicvoid run() {
- mContentView = (ViewGroup) getChildAt(0);
- removeAllViews();
-
MyScrollView scrollView = new MyScrollView(getContext(), MyHoveringScrollView.
- scrollView.addView(mContentView);
- addView(scrollView);
- }
- });
- }
?
可能注意到了兩點:
1、我用了post()。因為在構造方法裡面佈局還沒有生成,getChildAt(0)是拿不到東西的,但是post()會把動作放到佇列裡,等佈局完成後再從佇列裡取出來,所以這裡是個小竅門。
2、我把MyHoveringScrollView傳入到了ScrollView裡面,這麼做其實是為了讓ScrollView回撥MyHoveringScrollView的方法。(比較懶,不想寫介面……)
然後通過setTopView()方法,把需要固定在頂部的ID傳進來:
- publicvoid setTopView(finalint id) {
- post(new Runnable() {
- @Override
- publicvoid run() {
- mTopView = (ViewGroup) mContentView.findViewById(id);
- int height = mTopView.getChildAt(0).getMeasuredHeight();
- ViewGroup.LayoutParams params = mTopView.getLayoutParams();
- params.height = height;
- mTopView.setLayoutParams(params);
- mTopViewTop = mTopView.getTop();
- mTopContent = mTopView.getChildAt(0);
- }
- });
- }
接下來,在ScrollView裡面重寫onScrollChanged()方法,並回調給MyHoveringScrollView的onScroll方法:
- privatestaticclass MyScrollView extends ScrollView {
- private MyHoveringScrollView mScrollView;
- public MyScrollView(Context context, MyHoveringScrollView scrollView) {
- super(context);
- mScrollView = scrollView;
- }
- @Override
- protectedvoid onScrollChanged(int l, int t, int oldl, int oldt) {
- super.onScrollChanged(l, t, oldl, oldt);
- mScrollView.onScroll(t);
- }
- }
- publicvoid onScroll(finalint scrollY) {
- post(new Runnable() {
- @Override
- publicvoid run() {
- if (mTopView == null
- ) return;
- if (scrollY >= mTopViewTop
- && mTopContent.getParent() == mTopView) {
- mTopView.removeView(mTopContent);
- addView(mTopContent);
- } elseif (scrollY < mTopViewTop
- && mTopContent.getParent() == MyHoveringScrollView.this) {
- removeView(mTopContent);
- mTopView.addView(mTopContent);
- }
- }
- });
- }
?
如果scrollY >= mTopViewTop就是頭部應該被固定在頂部的時候
如果scrollY < mTopViewTop就是頭部應該取消固定,還原到原來父佈局的時候
至此,功能就實現了!
怎麼使用呢?首先先寫佈局:
- <com.hide.myhoveringscroll.app.MyHoveringScrollView
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/view_hover"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
- <LinearLayoutandroid:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical"
- >
- <TextViewandroid:layout_width="match_parent"
- android:layout_height="300dp"
- android:text="這是頭部"
- android:gravity="center"
- />
- <FrameLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"
- android:id="@+id/top"
- >
- <LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"
- android:padding="20dp"
- android:background="#AAff0000"
- android:orientation="horizontal">
- <TextViewandroid:layout_width="0dp"android:layout_height="wrap_content"
- android:layout_weight="1"
- android:gravity="center"
- android:layout_gravity="center"
- android:textSize="16sp"
- android:text="這是固定部分"
- />
- <Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"
- android:text="點我一下"
- android:id="@+id/btn"
- />
- </LinearLayout>
- </FrameLayout>
- <TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"
- android:paddingTop="10dp"
- 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"
- />
- </LinearLayout>
- </com.hide.myhoveringscroll.app.MyHoveringScrollView>
其中:MyHoveringScrollView在最外層,充當ScrollView的角色(所以子佈局只能有一個)
android:id="@+id/top也就是需要固定在頂部的佈局
最後回到Activity:
- view_hover = (MyHoveringScrollView) findViewById(R.id.view_hover);
- 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
仿新浪微博首頁具有泥鰍蚯蚓滑動效果的可自定義View的Android 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 主要流程如下: 這裡只是寫了一下程式的邏輯,前期的註冊申請工作可以參考官網,或者直接點這裡:新手指南 /**