======================================================
以下規則是在體驗微信操作后,推測出來的規則,可能存在一些不准確的表述
======================================================
參考基准
當處於正在聊天時,聊天內容比聊天時間更為重要,盡量避免時間和發送狀態對聊天內容的干擾,簡化界面,僅保留最核心的信息:發送者、發送內容。
Badge(未讀消息數量)
當消息數量達到三位數時(也即消息數量 > 99),顯示…而非數字,緩解/減輕強迫症患者的心理壓力
時間戳顯示
時間戳由客戶端自行處理,時間戳的顯示根據不同的場景進行顯示,可參考下面幾種典型的使用場景,但無論怎么顯示,消息之間超過5分鍾都需要顯示時間戳了。
###點擊聊天列表,進入聊天詳情時(單聊或群聊)
1)獲取數據
獲取最近最多20條數據(20條為一頁數據,超過20條時只取最近的20條,少於20條時有多少取多少)
2)顯示數據
獲取第一條消息的接收時間,然后將這個時間戳插入到界面並記錄下來(假設使用變量lastShowTimeStamp進行記錄),然后將消息按時間戳(從小到大排序,老消息在前新消息在后),追加到界面中,但需要注意時間戳的顯示規則。
循環遍歷每條消息時,需要判斷該消息的接收時間與最后一次顯示時間戳的時間間隔,當大於5分鍾(300ms)時則再追加一條時間戳,同時更新lastShowTimeStamp的值。
###時間戳的顯示規則
一天內的消息顯示為:“昨天 時:分”
二天至七天內顯示為:“星期X 時:分”
當大於7天時顯示為:“YYYY年X月X日時:分”
時、分不足二位時,前面用0補齊,月、日不足二位時不補位。如:2016年7月13日 09:22,注意計算天數是要算天,不能拿毫秒進行比較。否則昨天上午的消息,在今天下午看時將會變成“星期X 09:10”,正確的應該是“昨天 09:10”
示例截圖如下:
###聊天ing
當收到新消息時,判斷當前收到的消息與lastShowTimeStamp之間的間隔,大於5分鍾時就顯示時間戳,同時更新lastShowTimeStamp的值為當前新消息收到的時間戳。
會出現一種情況,當5分鍾內,消息很頻繁而導致消息量達到100條,那么這一千條數據中間是沒有任何時間戳的。如果退出聊天界面再重新進入時,參考第一條規則。
示例截圖:
###當向下拉取消息時
向上拉取消息時,獲取向上的20條數據(一頁,不足一頁時有多少取多少),然后根據第一條的規則來顯示。
先顯示時間戳,然后判斷每一條時間戳與上一次顯示的時間戳進行比較,間隔大於5分鍾時顯示新的時間戳,唯一與第一條規則不同的是,此時不要更新lastShowTimeStamp的值。因為lastShowTimeStamp的值是用來判斷新消息的,老消息需要判斷的話使用一個臨時變量記錄即可,拉取並顯示完一頁數據就丟棄掉了。
會出現一種情況,就是向上拉取消息時,你會遇到同一分鍾內發送的消息各有一個時間戳,而且時間戳是相同的。出現的原因是消息分屬在二頁內了
示例截圖如下:
###刪除單條消息時
刪除一條消息時,如果被刪除的消息上一條是時間戳,而下一條不是一條消息記錄時就將時間戳一並刪除掉。
這樣會導致一種情況,時間戳被刪除掉之后,lastShowTimeStamp並沒有進行更新,如果此時再接收到新消息時,它不會再顯示時間戳,直到新消息超過5分鍾的間隔才重新顯示時間戳並更新lastShowTimeStamp的值。刪除完消息后檢查當前消息數,少於一頁時自動再加載上一頁數據,直至沒有消息可供加載。
示例截圖如下(第一張圖是正常的,第二張圖是非正常的,退出聊天重新進入或等5分鍾之后便可恢復正常):
###批量刪除消息時
規則與單刪類似,唯一的不同的,當選中某一行時需要向上、向下遍歷。
向上遍歷時:
如果上一條消息是未選中狀態,中止向上查找;
如果上一條消息是選中狀態,繼續向上不斷查找,直到找到未選中消息(中止)、找到時間戳(記錄下該時間戳的位置,然后向下遍歷);
向下遍歷時:
如果下一條消息是未選中狀態,記錄的時間戳位置清除,中止向下查找;
如果下一條消息是選中狀態,繼續向下不斷查找,直到找到未選中消息(中止並清除)、找到時間戳(成功找到,也就是向前是一個時間戳,向后也是一個時間戳或是最后一條消息也記錄向上查找到的時間戳)
注:批量刪除時,一次最多能選擇刪除100條數據。消息刪除后,需要判斷當前消息數量是否夠一頁(20條),不夠就再向上加載一頁數據(20條);
在點擊刪除時,一次性進行刪除操作,避免遍歷影響性能。
示例截圖如下: