仿大總點評浮動效果

来源:https://www.cnblogs.com/ganchuanpu/archive/2018/03/04/8506881.html
-Advertisement-
Play Games

大家可以看到,大眾點評中,為了突出這個購買條,當向上滾動時,該滾動條會顯示在最上面(如圖2),而當用戶滑動回來的時候,又可以恢復回第一張圖的樣子 下麵說一下具體的實現思路: 從這張圖,我們可以看下具體的佈局.實際上在最頂部的位置,有一個購買條1,最開始的時候是隱藏的,而當從上向下滑動到具體位置的時候 ...


   

 

 

大家可以看到,大眾點評中,為了突出這個購買條,當向上滾動時,該滾動條會顯示在最上面(如圖2),而當用戶滑動回來的時候,又可以恢復回第一張圖的樣子


下麵說一下具體的實現思路:

從這張圖,我們可以看下具體的佈局.實際上在最頂部的位置,有一個購買條1,最開始的時候是隱藏的,而當從上向下滑動到具體位置的時候將購買條1顯示,將購買條2隱藏.

相反,當滑動回來的時候,講購買條2顯示,將購買條1隱藏.

核心的部分就是我們要去根據ScrollView的滑動高度去控制購買條的顯示與隱藏.這裡要註意的就是一定要判斷好這個滑動的高度,否則會出現不平滑的效果,影響用戶體驗.

看一下這張圖(畫得很醜,希望大家不介意),當上面的原始視圖滑動到這個位置時,也就是剛好原來上面的部分留在界面中的剛好是購買條的高度時,我們需要將隱藏的購買條顯示出來,再將原來的購買條隱藏,這樣子就不會有突兀的效果,從而使效果變得平滑.當界面從下向上的時候也是一樣,這裡不再覆述.具體的還是大家看下代碼:


佈局文件:

activity_main.xml:

 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
 2     xmlns:tools="http://schemas.android.com/tools"  
 3     android:layout_width="match_parent"  
 4     android:layout_height="match_parent" >  
 5   
 6     <com.tony.orderview.OrderView  
 7         android:id="@+id/refreshview"  
 8         android:layout_width="fill_parent"  
 9         android:layout_height="fill_parent"  
10         android:background="#77aaaa" >  
11   
12         <ScrollView  
13             android:id="@+id/scrollview"  
14             android:layout_width="fill_parent"  
15             android:layout_height="fill_parent"  
16             android:background="#accaac" >  
17   
18             <LinearLayout  
19                 android:layout_width="fill_parent"  
20                 android:layout_height="wrap_content"  
21                 android:orientation="vertical" >  
22   
23                 <LinearLayout  
24                     android:layout_width="fill_parent"  
25                     android:layout_height="250dip"  
26                     android:background="@drawable/upload"  
27                     android:text="one"  
28                     android:textColor="#ffccee" />  
29   
30                 <include  
31                     android:id="@+id/theview"  
32                     layout="@layout/deal_buy_item" />  
33   
34                 <TextView  
35                     android:layout_width="fill_parent"  
36                     android:layout_height="1250dip"  
37                     android:background="@drawable/ic_tuan_info_bg_1"  
38                     android:text="粥面故事   僅售49元,超值享受哦" />  
39   
40                 <TextView  
41                      
42                     android:layout_width="fill_parent"  
43                     android:layout_height="50dip"  
44                     android:background="#ff0055"  
45                     android:text="支持隨時退" />  
46             </LinearLayout>  
47         </ScrollView>  
48     </com.tony.orderview.OrderView>  
49   
50     <include  
51          android:visibility="gone"  
52         android:id="@+id/theviewstay"  
53         layout="@layout/deal_buy_item" />  
54   
55 </RelativeLayout>  

購買條佈局:

 1 <?xml version="1.0" encoding="utf-8"?>  
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
 3     android:layout_width="fill_parent"  
 4     android:layout_height="65.0dip"  
 5     android:background="@drawable/ic_tuan_info_bg_1"  
 6     android:orientation="vertical" >  
 7   
 8     <LinearLayout  
 9         android:layout_width="fill_parent"  
10         android:layout_height="0.0dip"  
11         android:layout_weight="1.0"  
12         android:gravity="center_vertical"  
13         android:orientation="horizontal"  
14         android:paddingLeft="10.0dip"  
15         android:paddingRight="10.0dip" >  
16   
17         <LinearLayout  
18             android:layout_width="0.0dip"  
19             android:layout_height="fill_parent"  
20             android:layout_weight="1.0"  
21             android:gravity="center_vertical"  
22             android:orientation="vertical" >  
23   
24             <TextView  
25                 android:layout_width="wrap_content"  
26                 android:layout_height="wrap_content"  
27                 android:layout_marginRight="8.0dip"  
28                 android:singleLine="true"  
29                 android:textColor="#ffe55600"  
30                 android:textSize="21.0sp" />  
31   
32             <TextView  
33                 android:layout_width="wrap_content"  
34                 android:layout_height="wrap_content"  
35                 android:ellipsize="end"  
36                 android:singleLine="true"  
37                 android:textColor="#ff979797"  
38                 android:textSize="12.0sp" />  
39         </LinearLayout>  
40   
41         <Button  
42             android:layout_width="wrap_content"  
43             android:layout_height="wrap_content"  
44             android:ellipsize="end"  
45             android:maxLines="1"  
46             android:minWidth="150.0dip"  
47             android:text="立即搶購"  
48             android:textAppearance="?android:textAppearanceMedium" />  
49     </LinearLayout>  
50   
51     <ImageView  
52         android:layout_width="fill_parent"  
53         android:layout_height="1.0dip"  
54         android:background="@drawable/ic_tuan_info_bg_3" />  
55   
56 </LinearLayout>  

MainActivity:

 1 package com.tony.orderview;  
 2   
 3 import android.app.Activity;  
 4 import android.os.Bundle;  
 5 import android.view.Menu;  
 6 import android.view.View;  
 7 import android.widget.ScrollView;  
 8   
 9 import com.example.stayview.R;  
10 import com.tony.orderview.OrderView.StayViewListener;  
11   
12 public class MainActivity extends Activity {  
13   
14     @Override  
15     public void onCreate(Bundle savedInstanceState) {  
16         super.onCreate(savedInstanceState);  
17         setContentView(R.layout.activity_main);  
18           
19         OrderView refreshableView = (OrderView) findViewById(R.id.refreshview);  
20           
21         refreshableView.setStayView(findViewById(R.id.theview), (ScrollView)findViewById(R.id.scrollview),new StayViewListener() {  
22             @Override  
23             public void onStayViewShow() {  
24                 //從下往上拉的時候回覆顯示  
25                 findViewById(R.id.theviewstay).setVisibility(View.VISIBLE);  
26                   
27             }  
28               
29             @Override  
30             public void onStayViewGone() {  
31                 //從上往下拉隱藏佈局  
32                 findViewById(R.id.theviewstay).setVisibility(View.GONE);  
33                   
34             }  
35         });  
36           
37     }  
38         
39 }  

接著是最核心的部分,具體控制高度顯示隱藏,我是這樣做的,重寫了一個OrderView,套在整個佈局外面,然後計算ScrollView的滑動高度:

 1 package com.tony.orderview;  
 2   
 3   
 4 import android.content.Context;  
 5 import android.util.AttributeSet;  
 6 import android.view.View;  
 7 import android.widget.LinearLayout;  
 8 import android.widget.ScrollView;  
 9 import android.widget.Scroller;  
10   
11   
12 public class OrderView extends LinearLayout {  
13   
14     private Scroller scroller;  
15     private Context mContext;  
16       
17     private View stayView;  
18     private StayViewListener stayViewListener;  
19     private ScrollView scrollView;  
20       
21     public void setStayView(View stayview,ScrollView scrollview,StayViewListener stayViewListener){  
22         this.stayView = stayview;  
23         this.scrollView = scrollview;  
24         this.stayViewListener = stayViewListener;  
25     }  
26       
27     public OrderView(Context context) {  
28         super(context);  
29         mContext = context;  
30           
31     }  
32     public OrderView(Context context, AttributeSet attrs) {  
33         super(context, attrs);  
34         mContext = context;  
35         init();  
36           
37     }  
38     private void init() {  
39         setOrientation(LinearLayout.VERTICAL);  
40         scroller = new Scroller(mContext);  
41     }  
42   
43       
44     /** 
45      *  
46      */  
47     boolean up = true;  
48     @Override  
49     public void computeScroll() {  
50         if(stayView!=null&&scrollView!=null&&stayViewListener!=null){  
51             int y = scrollView.getScrollY();  
52             if(up){  
53                 int top = stayView.getTop();  
54                 if(y>=top){  
55                     stayViewListener.onStayViewShow();  
56                     up = false;  
57                 }  
58             }  
59             if(!up){  
60                 int bottom = stayView.getBottom();  
61                 if(y<=bottom-stayView.getHeight()){  
62                     stayViewListener.onStayViewGone();  
63                     up = true;  
64                 }  
65             }  
66         }  
67     }  
68       
69       
70     public interface StayViewListener{  
71         public void onStayViewShow();  
72         public void onStayViewGone();  
73     }  
74   
75 }  

其實關於這種類似大眾點評購買條的停留效果,具體還可以有很多的做法,並不一定像我這樣自已定義View. 不過整體的思路還是不變,肯定還是要根據ScrollView的滾動高度來進行判斷.  無論用何種方式實現,一定要註意位置的控制,使該效果變得平滑,而不是突然購買條出現在界面上. 具體的細節還有很多,回頭有時間再補上吧.

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 資料庫常見面試題(開發者篇) 什麼是存儲過程?有哪些優缺點? 什麼是存儲過程?有哪些優缺點? 存儲過程就像我們編程語言中的函數一樣,封裝了我們的代碼(PLSQL、T SQL) 。 存儲過程的優點: 能夠將代碼封裝起來 保存在資料庫之中 讓編程語言進行調用 存儲過程是一個預編譯的代碼塊,執行效率比較高 ...
  • mysql資料庫的安裝與配置 workbench的簡單使用 ...
  • MySQL的複製解決什麼樣的問題,MySQL的二進位日誌的格式對數據的影響,如何實現主從複製,MySQL的複製拓撲圖 ...
  • 什麼是資料庫? 資料庫是一個以某種 有組織的方式存儲的數據集合 。也就是: 保存有組織數據的容器 (一個文件或一組文件) 為什麼我們需要資料庫? 毫無疑問,資料庫是用來存儲數據的。我們對excel肯定不會陌生,excel也是用來存儲數據。那既然有excel這樣非常好用的軟體了,為什麼需要資料庫呢?? ...
  • 1.存儲引擎 innodb與MyIASM存儲引擎的區別: 1.innodb 是mysql5.5版本以後的預設存儲引擎, 而MyISAM是5.5版本以前的預設存儲引擎. 2.innodb 支持事物,而MyISAM不支持事物 3.innodb 支持行級鎖.而MyIASM 它支持的是併發的表級鎖. 4.i ...
  • 本文主要介紹Oracle資料庫體繫結構以及相關DDL、DCL、DML語句的操作。 ...
  • 場景描述: 公司埋點項目,數據從介面服務寫入kafka集群,再從kafka集群消費寫入HDFS文件系統,最後通過Hive進行查詢輸出。這其中存在一個問題就是:埋點介面中的數據欄位是變化,後續會有少量欄位添加進來。這導致Hive表結構也需要跟著變化,否則無法通過Hive查詢到最新添加欄位的數據。 解決 ...
  • 複雜性是不可避免的,而且只會隨時間增長,所以在增加特性時一定要為重構和代碼簡化留出時間。真正遇到問題這前先不要擔心性能。iPhone非常強壯,你可能永遠也不會遇到預想的性能問題。 能過互聯網向一個設備傳送音頻時,可以採用兩種傳輸模型:流式傳輸和下載。 對於流式傳輸,音頻伺服器會按音頻的比特率通過網路 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...