android回彈效果
㈠ 關於剛剛發布的 Android10,需要知道這 6 大改進
9月4日,Google 終於發布了Android 10的正式版本。此前的內測階段它一直以 Android Q 的名字示人,無論是交互、使用體驗的優化,還是技術上的升級,正式的 Android 10 在諸多方面都進行了更為人性化的改變。
雖然每一次 Android 更新都有一個長長的新特性列表,但是每次最值得關注的核心功能,始終只有那麼幾個。關於 Andorid 10,最值得你關心的,就是下面的 6 大改變。
1. 優雅的深色暗黑模式上線
「深色模式」是今年產品設計的流行趨勢,深色模式的設計不僅是出於對用戶視力保護與減少視覺疲勞的考量,也利於營造更沉浸式的體驗。而Google將「深色模式」稱為「暗黑主題」。
從視覺的角度上來說,Android 10深色模式下的界面並非是簡單地在色彩上做反相處理,而是有更加細致更多元素與細節上的差異化處理。無論是抽屜菜單、設置還是應用的界面按鈕,都會由「白底黑字」變成「黑底白字」。
Google 官方的 Material Design設計規范中,在 Color 部分也新增了關於Dark Mod即深色主題界面的設計規則詳細闡述。並且深色模式會比全白背景的普通模式更省電,當然這與大多數中高端智能機常使用OLED屏幕有關。但目前 Android 10的「暗黑主題」適用范圍僅限於系統界面與 Google 自家的部分應用,很多第三方應用如我們常用的「微信」「微博」等都尚未支持新的深色模式。
2. 開啟全局手勢操作
引入全局手勢操作,是Android 10最值得被關注的直觀改變。雖然部分手勢操作與先前發布的內測版本Android Q Beta有所改變,但核心導航功能與設計邏輯並無較大調整。啟用新系統後,屏幕底部的虛擬按鍵與導航欄將不會再出現,取而代之的是一個指示條。在市場培育下,iOS的去按鍵化全屏手勢交互已讓許多用戶逐漸養成使用習慣,這里的手勢操作邏輯與iOS基本保持一致對於用戶而言學習成本已降低很多。
▲ 圖片來自:Android Central
上滑返回主屏,側滑返回上一層,左右滑動導航條能快速切換多任務。比較特別的是區別於iOS與前內測版本,當執行上滑返回主屏的操作時,會看到圖標有個小回彈的效果能更加直觀的反饋交互的變化。
整體而言經過多個版本的微調,Android 10 的這套手勢設計已基本能取代以前的虛擬鍵操作了,且操作流暢度和使用手感已接近iOS的效果。
▲ 圖片來自:The Verge
但如果一時間依舊無法適應取消虛擬按鍵的操作,Android 10還貼心的為我們保留了傳統的三按鍵模式與Android P時代的二鍵模式,供用戶隨時在設置中切換使用。
▲ 圖片來自:Arstechnica
3. 新增「專注模式」,專治注意力分散症
在早前的內測版Android Q, Google已將「專注模式」(Focus Mode) 直接集成到系統頂部的快捷菜單當中了。注意力管理近幾年已逐漸成為系統平台、廠商與用戶本身都高度關注的一件事情。
「專注模式」是一個結合「數字 健康 管理」(Digital Wellbeing) 與「勿擾模式」(Do Not Disturb)的功能。用戶可以自己選擇想要屏蔽的應用,在每次開啟「專注模式」後將這些讓人分心的應用免打擾處理。被屏蔽的應用圖標會呈不可點擊的置灰狀態無法被打開,可有效減少工作時注意力被分散。
4. 關注用戶隱私與個人數據保護,加強許可權調用限制
於Android 10而言,最重要的改變就是對隱私保護與許可權控制的限制更新。 Google官方在更新指南里花費了很大的篇幅來說明Android 10對於App獲取與使用用戶數據的許可權限制與說明。Android 10 系統整體而言對於用戶安全和隱私保護方面進行了加強管理。
對於第三方應用獲取如用戶手機攝像頭、相機或麥克風等感測器的調用許可權,使用用戶GPS 定位等與個人隱私相關甚密的數據,都有了更為細化的許可權管理。當某些App正在調用非必須的許可權時,系統還會發出通知提醒用戶,以確認信息授權的意願。
此外, Google 還推出了「Project Mainline」項目,將Android 系統涉及的隱私管理,以及通用介面(比如 OpenGL)模塊單獨劃分出來進行管理,進一步加強安全保護和方便後期的漏洞修復。
5. 人工智慧技術的更廣泛使用
Google在本次的Android 10 系統中,進行了更多對近幾年來機器學習技術與成果的運用嘗試。比如下拉通知欄里增加了「智能回復」功能。可根據接受的信息或郵件內容,自動為用戶提供一些回復語或Emoji表情的回復參考。還有特別實用的「Live Caption」實時字幕功能。像YouTube 中的實時字幕功能一樣,Android 10能夠自動為手機中正在播放的影片和音頻配上字幕。對於聽覺障礙人士而言,這個功能的增加讓理解有聲視頻不再困難重重。但該功能暫時還未正式上線,將在今年秋季推送到Android 10系統中。
6. 取消系統甜品名後綴,迎接更廣泛的受眾
曾今, Android 系統有將甜品名作為系統命名後綴的傳統。如上一代的「Android P」,也被稱作「Android Pie」,但一些用戶和媒體依舊傾向用「Android 9」來稱呼它。對於不熟悉Android系統和其甜品命名規則的用戶而言,稱呼難記易混淆。
從這一代 Android 10起,Android系統開始回歸以全球更為通用的數字後綴來進行系統命名。Google希望藉此次系統命名規則的改變,降低大家對Android系統的認知門檻,去迎接更為廣泛的用戶群體。
㈡ 如何優雅地在Android上實現iOS的圖片預覽
原文博客鏈接
用過 iOS 的都知道,擬物理的回彈效果在上面非常普遍,因為這是 iOS 系統支持的一套 UI 框架,但是 Android 就沒有了,就拿圖片查看器來講,iOS 的效果就是感覺一張圖片被綁定在了彈簧裝置上,滑動很自然,Android 沒有自帶的圖片查看器,需要自己實現
市面上主流的圖片查看器都沒有回彈的效果,一部分原因是沒有這個需求,還有一部分是實現麻煩,這里講述一個個人認為最好的方案
一個圖片查看器,要求可以滑動 Fling,觸碰到邊界的時候回彈,有越界孝喚回彈的效果,支持雙指縮放,雙擊縮放
咋一看需求,應該好寫,滾動的時候用 Scroller 來解巧態凱決,回彈效果直接用 ValueAnimator ,設置插值器為減速插值器來解決。看似簡單,但是因為是仿物理效果,中間牽扯到從滾動到回彈的時候( Scroller 動畫切換到 ValueAnimator 動畫)的閉老速度銜接問題,要看上去從滾動到開始回彈至結束沒有突兀,中間的特判邊界處理是很麻煩的,還要牽扯到縮放,所以不考慮這種方案
既然是要模擬現實中的物理效果,為何不在每一幀根據當前的狀態得到對用的加速度,然後去計算下一幀的狀態位置,這樣只要模擬現實中的物理加速度不就可以實現了嗎,那些邊界特判之類的就可以去見閻王了
方案確定完畢,接下來就是選定加速度的方程,要模擬彈簧的效果,拉力很簡單,用胡克定律嘛! F = k * dx ,摩擦力呢? Ff = μ*FN ? 這里推薦一個更加好的方案,借鑒自 Rebound 庫,這是 Facebook 的一個彈簧動畫庫,設定一個目的數值,它會根據當前的拉力,摩擦力,速度然後變化到目標值,加速度方程為
其中 tension 為彈性系數, friction 為摩擦力系數,為什麼讓摩擦力和速度成正比呢?如果摩擦力和速度成正比,那麼就不存在靜摩擦力,也就是不存在物體靜止情況下拉力小於摩擦力的情況(因為速度為0的時候,阻力為0,除非拉力為0),物體肯定會向目標地點靠近,遏制了物體摩擦力過大而無法達到目的地情況
為了方便接入各種 View ,設計一個 ZoomableGestureHelper 類
設計目的,我只需要知道視圖的大小邊界 (bounds) 和內部可滾動回彈的邊界 (innerBounds),就可以通過計算得到一個新的轉換矩陣
對於物理狀態,需要一個類 SpringPhysicsState 來做存儲,裡麵包含了速度、拉力系數、摩擦力系數,不保存位置,因為位置是通過 getBounds 動態計算得到的
速度分解成水平方向和垂直方向,因為處理方法一樣,下面只講述垂直方向的計算
狀態1 :其中一邊有越界
分析一下上圖中的位置,藍色部分為內部圖片,它被拖動越界了,此時的合力應該為 tension * dx - friction * v , v 為圖片在 y 軸方向上的速度,( dx 和 v 都是矢量,我暫且設置向右和向下為正),之後就直接調用 invalidate(); ,就可以播放動畫了。
狀態2:兩邊都沒越界
此時因為兩邊都沒有越界,所以應該不存在拉力,可以認為此時 dx 為0,摩擦力需要注意下,因為可以支持滑動( Fling ),所以此時的摩擦力要比之前越界回彈時候的摩擦力小,至於具體數值,文末會給出
狀態3:兩邊都超出
此時兩邊都超出邊界,藍色區域應該和紅色區域中心綁定,所以此時的 dx 為 dxBottom - dxTop (注意符號,因為 dx 為矢量,所以不能是 dxTop - dxBottom )
縮放的方法和移動一致,設定 tension 和 friction ,邊界設定為外面紅色的框框,藍色區域無法某一邊充滿紅色區域的時候,有拉力,否則沒拉力,摩擦力一直存在,至於雙擊放大和放小,只需要在雙擊的時候給縮放狀態設置一個初速度,然後 invalidate(); ,搞定!是不是很簡單啊
時間這一個參數在計算中是非常重要的,這關繫到當前微分狀態的數值變化,假如用歐拉方法模擬速度和位置的變化, x' = x + v * dt , v' = v + a * dt ,公式可以看出時間決定了動畫的快慢,為了接近現實物理時間,這里採用的時間單位為秒(計算機中常用的是毫秒)
確定了單位,還需要控制一下時間間隔的數值范圍,我們不能讓兩次 computeScroll 的時間間隔過於短或者過於長,這里採用的策略為固定每次計算時候的時間間隔,如果兩次 computeScroll 的時間間隔小於此時間間隔,那麼保存累計時間間隔,等待下一次 computeScroll ,直到大於等於固定的時間間隔,再用 while 循環一步一步的計算
結束判定是唯一的一個坑,因為計算機只是在 dt 時間內模擬速度和位移的變化,不是通過微積分計算的,存在誤差,比如歐拉方法 x' = x + v * dt 和 v' = v + a * dt 計算得到的 x' 和 v' 都是近似數值,把 dt 這段時間內的變化看成了勻變速運動
所以結束判定還需要設置一個閾值,當速度和偏移量小於此數值的時候,可以認定為達到了目的地
對於 ViewPager 的適配有些問題,如果在 Down 的時候 requestDisallow true 移動過程中到了左右邊界又 requestDisallow false ,此時 ViewPager 會有一個突變( 突變可恥但有用 ),而且多指頭的時候可能會崩潰,這是 ViewPager 的 Bug,具體細節請看源碼
㈢ 自定義scrollview怎麼實現回彈
先我們先建一個類:UserDefineScrollView.Java 代碼如下
package com.ysbl.myview;
import android.content.Context;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.TranslateAnimation;
import android.widget.ScrollView;
/**
* 有彈性的ScrollView
* 實現下拉彈回和上拉彈回
* @author zhangjg
* @date Feb 13, 2014 6:11:33 PM
*/
public class UserDefineScrollView extends ScrollView {
private static final String TAG = "ElasticScrollView";
//移動因子, 是一個百分比, 比如手指移動了100px, 那麼View就只移動50px
//目的是達到一個延遲的效果
㈣ android上怎樣加快過場動畫的速度
android:interpolator="@android:anim/accelerate_interpolator" 設置動畫為加速動畫(動畫播放中越來越快)
android:interpolator="@android:anim/decelerate_interpolator" 設置動畫為減速動畫(動畫播放中越來越慢)
android:interpolator="@android:anim/accelerate_decelerate_interpolator" 設置動畫為先加速在減速(開始速度最快 逐漸減慢)
android:interpolator="@android:anim/anticipate_interpolator" 先反向執行一段,然後再加速反向回來(相當於我們彈簧,先反向壓縮一小段,然後在加速彈出)
android:interpolator="@android:anim/anticipate_overshoot_interpolator" 同上先反向一段,然後加速反向回來,執行完畢自帶回彈效果(更形象的彈簧效果)
android:interpolator="@android:anim/bounce_interpolator" 執行完畢之後會回彈跳躍幾段(相當於我們高空掉下一顆皮球,到地面是會跳動幾下)
android:interpolator="@android:anim/cycle_interpolator" 循環,動畫循環一定次數,值的改變為一正弦函數:Math.sin(2* mCycles* Math.PI* input)
android:interpolator="@android:anim/linear_interpolator" 線性均勻改變
㈤ android 中如何去掉listView自帶的回彈效果
在xml中,listView的一個屬性
android:overScrollMode="never"
在代碼中
mListView.setOverScrollMode(View.OVER_SCROLL_NEVER);
設置後,魅族等手機下拉時就不會顯示HOLD了
㈥ Android自定義控制項之可平移、縮放、旋轉圖片控制項
先上效果圖
源碼
單點拖動圖片對圖片進行平移操作。雙手縮放圖片大小和旋轉圖片到一定的角度。圖片縮放的時候 不能大於最大的縮放因子和小於最小的縮放因子。大於最大縮放因子或者小於最小縮放因子需要對圖像進行回彈。圖片旋轉的角度只能為90度的倍數,不滿足90度要進行回彈。圖片回彈要一個漸變的效果。
大體思路: 首先,Android中提供了Matrix類可以對圖像進行處理。其次,要顯示一張圖片最容易想到的就是ImageView。回彈要求漸變的過程,可以通過屬性動畫進行設置。所以大體的思路是:繼承ImageView,重寫onTouchEvent()方法,判斷事件類型,在對應的事件使用Matrix對圖像進行變換。
Matrix是一個已經封裝好的矩陣,最重要的作用就是對坐標點進行變換。
舉個栗子:
1.某個點(x0,y0,1)通過單位矩陣E映射得到的點還是(x0,y0,1)。
3.點(x0,y0,1)通過矩陣T映射得到的點就會做如下的變換
可以看到點(x0,y0,1)經過T矩陣在x軸方向上平移了dx,在y軸方向上平移了dy。
通過以上的變換可以得到具體的思路: 我們維護一個圖像對應的矩陣mCurrentMatrix,該矩陣主要是對ImageView中的圖像的各個點進行映射。ImageView在容器位置擺放完成之後,置mCurrentMatrix矩陣為單位矩陣。當onTouchEvent()方法中觸發單點觸控並且手指進行平移的時候,調用矩陣mCurrentMatrix的postTranslate(dx,dy),對mCurrentMatrix進行變換。當手指抬起,利用變換結束後的矩陣對圖像的各個點進行映射,從而得到平移變換後的圖像。同理可得,在兩只手指進行縮放旋轉的時候,我們對矩陣mCurrentMatrix進行各種變換,當縮放旋轉的事件結束再利用變換完的矩陣去映射圖像的各個點,從而得到縮放、旋轉後的圖像。
安卓自定義View進階 - Matrix原理
安卓自定義View進階 - Matrix詳解
首先理清事件的邏輯:
初始化圖像大小和位置
縮放圖像大小和控制項大小自適應,平移圖像中心和控制項中心重合
onTouchEvent()函數
平移操作
將圖像對應的矩陣進行變換。
縮放操作
mBoundRectF為記錄圖像邊界的矩形。縮放的時候選取圖像的中心進行縮放。
旋轉操作
旋轉的時候旋轉的旋轉中心也是圖像的中心
圖像中各個點的映射
調用ImageView的setImageMatrix(Matrix matrix)會讓ImageView根據設置的matrix去重新繪制圖像。
更新圖像的矩形邊界
獲得圖像的矩形,並根據矩陣映射矩形各個點的坐標。
縮放回彈
旋轉回彈
一些計算方法
要求圖像的變換是一個漸變的過程,很容易想到的就是屬性動畫。因為屬性動畫本身就是對值進行不斷set的過程。而我們維護的矩陣也是一個值,所以很自然可以想到,如果得到回彈之前的矩陣的值以及回彈之後矩陣的值,就可以根據動畫監聽器中動畫當前的系數值去改變矩陣的值。
對animator對象設置完監聽器之後,就可以在手指抬起的時候調用屬性動畫的start()方法開啟動畫。
自定義可平移、縮放、旋轉的控制項主要點有兩個方面:一是onTouchEvent()中判斷平移、旋轉、縮放的觸發條件,平移位移量、縮放比例因子、旋轉角度的計算。二是Matrix矩陣的應用。
㈦ 【Android】打造下拉放大效果
在其他App上看到了這樣的一個效果,感覺有點意思,於是決定實現一個類似的效果。
( 其實是iOS的同學在實現功能的時候隨意發揮了一下 )
效果大概值這樣子的:
UI看完後
「這個效果不錯啊」
「要不你們Android也么做?」 於是~~
作為一個有追求的程序員,決定也要實現一個這樣的效果 (滿腦子都是草泥馬在奔騰)
這樣的效果嘛~~
利用自定義的 ViewGroup ,通過對手勢的處理,應該就能實現了吧?
主要應該分兩部分:
比較麻煩的應該是在第一部分,需要對事件的分發有一些理解。
說到手勢的判斷,難免需要對事件分發進行處理。
下拉部分
1、在 onInterceptTouchEvent 中對事件進行處理,如果為下拉事件,則將該事件攔截,交給 onTouchEvent 處理;
2、在 onTouchEvent 中通過計算得到下拉的距離,然後動態改變 Header 的配置,實現放大的效果。
重置部分
在 onTouchEvent 的 ACTION_UP 中重置 Header ,實現回彈
知道思路以後,實現起來就比較簡單了
創建一個 ViewGroup (這么命名為 FlexibleLayout )繼承 LinearLayout 。
onInterceptTouchEvent的處理
先通過兩個條件判斷是否為下拉事件:
然後通過 mIsBeingDragged 來標記開始拖拽
onTouchEvent的處理
修改頭部大小
得到下拉的距離後,就可以來改變 Header 的大小,實現放大效果了。
放大、重置的部分大家可以自由發揮
這里利用 Math.pow(offsetY, 0.8) 得到實際需要增加的高度,通過計算得到對應的寬度以及偏移(類似阻尼效果)。
重置頭部
直接將寬高以及偏移設置成原來的參數即可。
(如果覺得這樣重置過程不夠絲滑,可以通過動畫來完成一個流暢的重置效果,這里就不演示了)
到這里,一個簡易拉下放大的效果就做完了。試試效果
使用
直接在需要下拉放大的布局外面套上 FlexibleLayout 即可,例如 ScrollView
效果
ScrollVIew:
RecyclerView:
CoordinatorLayout:
大功告成!!!
當然裡面還有一些細節的處理,比如下拉的條件、回彈的動畫、最大高度等,具體內容的可以在 源碼 中看到。
完成下拉放大後,貌似把一個很重要的功能遺忘了下拉刷新 ??
光顧這下拉放大,刷新怎麼辦?【黑人問號】
這個功能留著下周實現吧,我的7小時睡眠已遙遙無期~~
雖然沒有直接實現下拉刷新的功能,不過源碼中已經暴露了一個下拉的監聽,你也可以通過這個監聽實現下拉刷新的操作
到這里就結束了
(來還上周欠下的債~~)
和下拉放大類似,通過希手指下滑的監聽,利用 View 的 translationY 和 rotation 實現移動和旋轉。
具體的實現過程這里就不貼出來了,直接看效果吧
有興趣的可以直接去 Github 上看源碼以及用法。
Github
PullZoomView
Android事件分發機制 詳解攻略,您值得擁有
㈧ android中scrollview怎麼實現阻尼回彈
1。你可以用ViewFlipper 來實現效果,每一張圖片為一頁,加上滑屏動畫效果,這個網上資料很全。2。你可以使用gallery來顯示圖片,這個跟ListView的使用方法是一樣的,網上資料和SDK文檔裡面都介紹很詳細。3。用手勢監聽需要給View上面實現OntouchListener,具體方法跟ViewFlipper的翻頁效果是一樣的