Android頂部粘至視圖具體解釋

不知從某某時間開始,這樣的效果開始在UI設計中流行起來了。讓我們先來看看效果:


大家在支付寶、美團等非常多App中都有使用。要實現這個效果,我們能夠來分析下思路:

我們肯定要用2個一樣的布局來顯示我們的粘至布局。一個是正常的、還有一個是到頂部不動的。正常的那個,隨著scroll一起滾,該滾到哪滾到哪。僅僅是他滾到最上面的時候,

我們須要用粘至的布局,放到頂部。當然。他還在后面繼續滾,ok。如今我們來看看詳細怎樣實現:

先看布局,just a demo。用幾張圖片略微做做樣子。

粘至布局:

<?

xml version="1.0" encoding="UTF-8"?

> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="50dp" android:orientation="horizontal" > <TextView android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:textColor="#FFFFFF" android:background="#232323" android:text="我不會動" android:textSize="30dp" /> </LinearLayout>


主布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/parent_layout"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" ><com.xys.scrolltrick.TrickScrollandroid:id="@+id/scrollView"android:layout_width="fill_parent"android:layout_height="fill_parent" ><FrameLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content" ><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical" ><ImageViewandroid:id="@+id/iamge"android:layout_width="match_parent"android:layout_height="200dp"android:background="@drawable/ic_launcher"android:scaleType="centerCrop" /><includeandroid:id="@+id/stick"layout="@layout/stick_layout" /><ImageViewandroid:layout_width="match_parent"android:layout_height="200dp"android:background="@drawable/ic_launcher"android:scaleType="centerCrop" /><ImageViewandroid:layout_width="match_parent"android:layout_height="200dp"android:background="@drawable/ic_launcher"android:scaleType="centerCrop" /><ImageViewandroid:layout_width="match_parent"android:layout_height="200dp"android:background="@drawable/ic_launcher"android:scaleType="centerCrop" /></LinearLayout><includeandroid:id="@+id/normal"layout="@layout/stick_layout" /></FrameLayout></com.xys.scrolltrick.TrickScroll></LinearLayout>

加入多個imageview是為了讓他能滾起來

因為ScrollView中并沒有提供scroll listener,因此我們僅僅能重寫下,來創建一個接口:

package com.xys.scrolltrick;import android.content.Context;
import android.util.AttributeSet;
import android.widget.ScrollView;public class TrickScroll extends ScrollView {public interface onScrollListener {public void onScroll(int scrollY);}private onScrollListener onScrollListener;public TrickScroll(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}public TrickScroll(Context context, AttributeSet attrs) {super(context, attrs);}public TrickScroll(Context context) {super(context);}public void setOnScrollListener(onScrollListener onsScrollListener) {this.onScrollListener = onsScrollListener;}@Overrideprotected void onScrollChanged(int l, int t, int oldl, int oldt) {super.onScrollChanged(l, t, oldl, oldt);if (onScrollListener != null) {onScrollListener.onScroll(t);}}
}

我們給他的滑動。提供一個監聽接口。

主程序:

package com.xys.scrolltrick;import android.app.Activity;
import android.os.Bundle;
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
import android.widget.LinearLayout;import com.xys.scrolltrick.TrickScroll.onScrollListener;public class MainActivity extends Activity implements onScrollListener {private TrickScroll mScroll;// 正常狀態下的布局private LinearLayout mLayout1;// 頂部粘至的布局private LinearLayout mLayout2;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mScroll = (TrickScroll) findViewById(R.id.scrollView);mLayout1 = (LinearLayout) findViewById(R.id.stick);mLayout2 = (LinearLayout) findViewById(R.id.normal);mScroll.setOnScrollListener(this);// 根布局狀態下。監聽布局改變findViewById(R.id.parent_layout).getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {@Overridepublic void onGlobalLayout() {onScroll(mScroll.getScrollY());}});}@Overridepublic void onScroll(int scrollY) {// 獲取正常布局的位置來又一次設置粘至布局的位置int layoutTop = Math.max(scrollY, mLayout1.getTop());mLayout2.layout(0, layoutTop, mLayout2.getWidth(),layoutTop + mLayout2.getHeight());}
}

當中的核心就在onScroll(int scrollY)這種方法中。我們用max函數來推斷當前最大值


這里須要注意2個方法:

1、getTop():該方法返回該view到容器的top像素

2、getScrollY():該方法返回的是。你的scrollview已經滾了多少

-------------------一旦這個世界有了scroll整個世界就不一樣了-------------------

知道了這2個方法后。我們就能夠推斷了,當滾的距離小于getTop()的時候。保持與正常的一樣,大于的時候,就須要用getScrollY()了,這個比較難理解,事實上你能夠把布局想象成一個紙帶,而手機屏幕是一個挖了孔的框,我們在后面從下往上拉紙帶,這樣就模擬了scroll滑動,這樣理解的話,會比較清楚點


以上。


轉載于:https://www.cnblogs.com/blfbuaa/p/7077769.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/252446.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/252446.shtml
英文地址,請注明出處:http://en.pswp.cn/news/252446.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

在實際項目開發中keil的調試方法

轉載2015-06-14 20:23:04 一.在keilc的調試狀態下&#xff0c;如何觀察各個片內外設的運行狀態&#xff1f;如何修改它們的設置&#xff1f;? 在調試狀態下&#xff0c;點擊Peripherals菜單下的不同外設選項命令&#xff0c;就會顯示或隱藏對應外設的觀察窗口。 在程序運行時&…

slam 常用數據集的幀率

1. kitti數據集的幀率約約為10fps,圖像分辨率為1241x376 2. Euroc數據集的幀率約為20fps,圖像分辨率為752x480 3.TUM數據集的幀率約為30fps, 圖像分辨率為640x360 zed相機獲取的HD圖像的分辨率為1280x720p,獲取的VGA圖像分辨率為672x376,mynt相機獲取的VGA圖像的分辨率為640x…

小李飛刀:用python刷題ing....

叨逼叨 默認每天都要刷兩道題。今天目標已完成。 第一題 26. 刪除排序數組中的重復項難度&#xff1a;簡單類型&#xff1a;數組 給定一個排序數組&#xff0c;你需要在原地刪除重復出現的元素&#xff0c;使得每個元素只出現一次&#xff0c;返回移除后數組的新長度。不要使用…

【Log4J】

學習mybatis中用到了Log4J 在此記錄下 引入 引入Maven配置 <!-- https://mvnrepository.com/artifact/log4j/log4j --><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></de…

VI-ORB環境配置

參考博客:https://blog.csdn.net/qq_38589460/article/details/82559816 https://blog.csdn.net/Robot_Starscream/article/details/90245456 本機安裝的是opencv3.0 在Examples/ROS/ORB-VIO以及/VI-ORB/src/LearnVIORB-RT下的CMakeLists.txt都要進行修改 將find_package(O…

.NET Core 3.0中的數據庫驅動框架System.Data

雖然沒有得到很多關注&#xff0c;但System.Data對于.NET中任何關系型數據庫的訪問都至關重要。因為其前身是ActiveX Data Objects&#xff0c;所以它也被稱為ADO.NET。System.Data提供了一個通用框架&#xff0c;是構建.NET數據庫驅動程序的基礎。該框架提供了數據庫驅動可以遵…

linux vg lv pv

pv由物理卷或者分區組成 pv可以組成一個或者多個vg vg可以分成多個lv 方便擴展 pvs vgs lvs 可以查看當前存在的pv vg lv 我的centos硬盤20g 使用了一段時間 加了100g 這時候 我們可以使用擴展來擴展我們的分區大小 查看自己擁有多少個硬盤 ls /dev/sd* | grep -v [0-9] …

mynt product model: D1000-IR-120標定相機和IMU外參

1. 首先是安裝相應的mynt SDK. http://www.myntai.com/mynteye/depth小覓官網,在sdk下拉菜單中點擊MYNT EYE Depth SDK,然后選擇Linux Installation安裝安裝步驟說明一步步的安裝,安裝sample后,測試一下安裝是否成功.我的電腦上安裝了ROS,所以可以點擊上面第一幅圖中的ROS Ins…

吉林省第二條國際鐵路聯運大通道“長琿歐”啟動測試

29日&#xff0c;吉林省第二條國際鐵路聯運大通道“長琿歐”在俄羅斯啟動測試。吉林省商務廳供圖 29日&#xff0c;吉林省第二條國際鐵路聯運大通道“長琿歐”在俄羅斯啟動測試。吉林省商務廳供圖 中新網長春1月29日電 (郭佳)記者29日從吉林省商務廳獲悉&#xff0c;該省第二條…

使用Ajax解析數據遇到的問題

數據格式 我最近在使用JQuery的$.ajax訪問后臺的時候&#xff0c;發現竟然無法解析返回的數據&#xff0c;具體的錯誤記不清了(以后在遇到問題先截個圖)&#xff0c;可以在瀏覽器的Console中看到一個錯誤&#xff0c;但是去看這條請求是有數據返回的&#xff0c;所以剛開始我一…

49、劍指offer--把字符串轉換成整數

題目描述將一個字符串轉換成一個整數&#xff0c;要求不能使用字符串轉換整數的庫函數。 數值為0或者字符串不是一個合法的數值則返回0 輸入描述:輸入一個字符串,包括數字字母符號,可以為空輸出描述:如果是合法的數值表達則返回該數字&#xff0c;否則返回0輸入例子:2147483647…

Git丟棄修改

Git是如何跟蹤修改的&#xff1f;我們之前修改文件后都用到了兩個命令git add <file>、git commit&#xff0c;其實在Git中&#xff0c;每次修改后&#xff0c;如果不add到暫存區&#xff0c;那就不會加入到commit。 查看一下文件內容&#xff1a; 在其中添加一行記錄…

隱藏界面沒有必要應用場景

轉載于:https://www.cnblogs.com/zengsf/p/8366572.html

mynt product model: D1000-IR-120標定相機和IMU外參之二

1. 在之一中使用kalibr標定mynt相機和內置imu的外參數,使用的是720p,30fps的雙目圖像和200hz的imu數據,標定結果誤差比較大,這一次我們改用480p,60hz的雙目圖像和200hz的imu數據進行標定,需要在mynt_sdk中的mynteye.launch中進行如下修改. 默認獲取圖像的2560x720,30fps&#…

AODp

一、AOP是OOP的延續&#xff0c;是&#xff08;Aspect Oriented Programming&#xff09;的縮寫&#xff0c;意思是面向切面編程。 AOP&#xff08;Aspect Orient Programming&#xff09;&#xff0c;作為面向對象編程的一種補充&#xff0c;廣泛應用于處理一些具有橫切性質的…

[洛谷P4174][NOI2006]最大獲利

題目大意&#xff1a;同Petya and Graph&#xff0c;數據范圍改成$n\leqslant5\times10^3,m\leqslant5\times10^4$ 題解&#xff1a;同上 卡點&#xff1a;無 C Code&#xff1a; #include <algorithm> #include <cstdio> #define maxn 5010 #define maxm 50010 co…

使用ros發布UVC相機和串口IMU數據

&#xff11;&#xff0e;目的&#xff1a;為了可以標定普通USB相機和固定在相機上的外置IMU的外參,我希望通過ROS獲取更高分辨率和更高頻率的圖像數據,并且可以將圖像和imu的topic發布出來,直接使用rosbag record錄制話題數據,寫入bag文件,這樣獲得的bag文件直接可以用于相機和…

API自動化測試利器——Postman

自從開始做API開發之后&#xff0c;我就在尋找合適的API測試工具。一開始不是很想用Chrome擴展&#xff0c;用的WizTools的工具&#xff0c;后來試過一次Postman之后就停不下來了&#xff0c;還買了付費的Jetpacks。推出Team Sync Beta之后我又把這個工具推廣給團隊&#xff0c…

gcc,cc,g++,CC的區別

***gcc是C編譯器&#xff1b; ***g是C編譯器&#xff1b; ***linux下cc一般是一個符號連接&#xff0c;指向gcc ***gcc說明 1.gcc編譯常用格式&#xff1a; gcc C源文件 -o 目標文件 或 gcc -o 目標文件 C源文件 或 gcc C源文件 最后一種情況產生的目標文件默認為a.out 2.gcc…

云原生實踐之 RSocket 從入門到落地:Servlet vs RSocket

技術實踐的作用在于&#xff1a;除了用于構建業務&#xff0c;也是為了驗證某項技術或框架是否值得大規模推廣。 本期開始&#xff0c;我們推出《RSocket 從入門到落地》系列文章&#xff0c;通過實例和對比來介紹RSocket。主要圍繞RSocket如何實現Polyglot RPC、Service Regis…