android滾動動畫
A. android寮鍙戞庝箞瀹炵幇qq婊戝姩鍒犻櫎鍔ㄧ敾鏁堟灉
瑙傚療QQ鐨勬粦鍔ㄥ垹闄ゆ晥鏋滐紝鍙浠ョ寽嫻嬪彲浠ユ粦鍔ㄥ垹闄ょ殑閮ㄥ垎涓昏佸寘鍚涓や釜閮ㄥ垎錛屼竴涓鏄鍐呭瑰尯鍩燂紙鐢ㄤ簬鏀劇疆姝e父鏄劇ず鐨剉iew錛夛紝鍙︿竴涓鏄鎿嶄綔鍖哄煙錛堢敤浜庢斁緗鍒犻櫎鎸夐挳錛夈傞粯璁ゆ儏鍐典笅錛屾搷浣滃尯鍩熸槸涓嶆樉紺虹殑錛屽唴瀹瑰尯鍩熺殑澶у皬鏄濉鍏呮暣涓瀹瑰櫒錛屾搷浣滃尯鍩熷嬬粓浣嶄簬鍐呭瑰尯鍩熺殑鍙抽潰銆傚綋寮濮嬫粦鍔ㄧ殑鏃跺欙紝鏁翠釜瀹瑰櫒涓鐨勬墍鏈夊瓙view閮藉儚宸︽粦鍔錛屽傛灉鎿嶄綔鍖哄煙姝ゆ椂鏄涓嶅彲瑙佺殑錛岃劇疆涓哄彲瑙併
鎴戠殑瀹炵幇鎬濊礬灝辨槸鑷瀹氫箟涓涓猯ayout SwipeLayout緇ф壙鑷狥rameLayout銆係wipeLayout鍖呭惈涓や釜瀛恦iew錛岀涓涓瀛恦iew鏄鍐呭瑰尯鍩燂紝絎浜屼釜瀛恦iew鏄鎿嶄綔鍖哄煙銆傛粦鍔ㄦ晥鏋滅殑鎺у埗錛屼富瑕佸氨鏄閫氳繃媯嫻婼wipeLayout鐨則ouch浜嬩歡鏉ュ疄鐜幫紝榪欓噷鎴戜笉鎯寵嚜宸卞幓閫氳繃鐩戝惉touch浜嬩歡鏉ュ疄鐜版粦鍔ㄦ晥鏋滐紝閭f槸涓涓寰堢箒鐞愮殑榪囩▼銆侫ndroid support搴撻噷鍏跺疄宸茬粡鎻愪緵浜嗕竴涓寰堝ソ鐨勫伐鍏風被鏉ュ府鎴戜滑鍋氳繖浠朵簨鎯匳iewDragHelper銆傚傛灉浣犵湅榪嘇ndroid鍘熺敓鐨凞rawerLayout鐨勪唬鐮侊紝灝變細鍙戠幇DrawerLayout鐨勬粦鍔ㄦ晥鏋滀篃鏄閫氳繃ViewDragHelper綾誨疄鐜扮殑銆
B. Android 製作逐漸顯示動畫(描邊動畫、矢量動畫VectorDrawble)
Android 系統從5.0開始支持矢量圖,可以通過 Android Studio自帶的 Vector Assert 工具將SVG、PSD 轉成VectorDrawble。
轉化好的VectorDrawblew看起來好像挺復雜,是不是完全看不懂。沒關系,只要轉化的圖形沒有問題,你不用關心其內部數據。
我們直接進入矢量動畫部分。
矢量動畫的實現通過在xml定義<animated-vector>標簽(其對應的Java對象是AnimatedVectorDrawable)實現,如下所示:
可以看到<animated-vector>標簽是主要元素是target,它其實就起到一個橋梁作用,將動畫和VectorDraw中的圖形聯系起來。
比如target1,它將屬性動畫splash_animator_draw和vectorDrawble對象中name等於line1的對象聯系起來,即:動畫將生效在line1對象上。
之前展示了由svg圖片通過Android Studio Vector Assert工具轉換過來的VectorDrawble,裡面的實際上svg畫圖語法,<path>標簽里的pathData包含了畫圖的路徑(坐標)和語法
在實際使用過程中有幾率遇到這樣兩個問題(筆者都遇到過):
其實以上兩個問題都要求你掌握進階知識,svg畫圖語法。
官方svg語法解析: https://www.w3.org/TR/SVG/paths.html
不喜歡看英文,去這篇博客: http://www.jianshu.com/p/a3cb1e23c2c4
對於Android程序員,Lottie的動畫使用很簡單,步驟如下:
1.接入Lottie
從動畫實現上來說,Lottie動畫應該是最簡單的方法了。
Lottie的優點很明顯:
Lottie的缺點:
好了,如果覺得本文對你有幫助,請關注、留言、點贊我,謝謝!
C. android 下拉滾動頁面怎麼實現
以下是我自己花功夫編寫了一種非常簡單的下拉刷新實現方案,現在拿出來和大家分享一下。相信在閱讀完本篇文章之後,大家都可以在自己的項目中一分鍾引入下拉刷新功能 最近項目中需要用到ListView下拉刷新的功能,一開始想圖省事,在網上直接找一個現成的,可是嘗試了網上多個版本的下拉刷新之後發現效果都不 怎麼理想。有些是因為功能不完整或有Bug,有些是因為使用起來太復雜,十全十美的還真沒找到。因此我也是放棄了在網上找現成代碼的想法,自己花功夫編寫 了一種非常簡單的下拉刷新實現方案,現在拿出來和大家分享一下。相信在閱讀完本篇文章之後,大家都可以在自己的項目中一分鍾引入下拉刷新功能。 首先講一下實現原理。這里我們將採取的方案是使用組合View的方式,先自定義一個布局繼承自LinearLayout,然後在這個布局中加入下拉 頭和ListView這兩個子元素,並讓這兩個子元素縱向排列。初始化的時候,讓下拉頭向上偏移出屏幕,這樣我們看到的就只有ListView了。然後對 ListView的touch事件進行監聽,如果當前ListView已經滾動到頂部並且手指還在向下拉的話,那就將下拉頭顯示出來,鬆手後進行刷新操 作,並將下拉頭隱藏。原理示意圖如下: 那我們現在就來動手實現一下,新建一個項目起名叫PullToRefreshTest,先在項目中定義一個下拉頭的布局文件pull_to_refresh/apk/res/android" xmlns:tools="schemas/tools" android:id="@+id/pull_to_refresh_head" android:layout_width="fill_parent" android:layout_height="60dip" > <LinearLayout android:layout_width="200dip" android:layout_height="60dip" android:layout_centerInParent="true" android:orientation="horizontal" > <RelativeLayout android:layout_width="0dip" android:layout_height="60dip" android:layout_weight="3" > <ImageView android:id="@+id/arrow" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:src="@drawable/arrow" /> <ProgressBar android:id="@+id/progress_bar" android:layout_width="30dip" android:layout_height="30dip" android:layout_centerInParent="true" android:visibility="gone" /> </RelativeLayout> <LinearLayout android:layout_width="0dip" android:layout_height="60dip" android:layout_weight="12" android:orientation="vertical" > <TextView android:id="@+id/description" android:layout_width="fill_parent" android:layout_height="0dip" android:layout_weight="1" android:gravity="center_horizontalbottom" android:text="@string/pull_to_refresh" /> <TextView android:id="@+id/updated_at" android:layout_width="fill_parent" android:layout_height="0dip" android:layout_weight="1" android:gravity="center_horizontaltop" android:text="@string/updated_at" /> </LinearLayout> </LinearLayout> </RelativeLayout> 在這個布局中,我們包含了一個下拉指示箭頭,一個下拉狀態文字提示,和一個上次更新的時間。當然,還有一個隱藏的旋轉進度條,只有正在刷新的時候我們才會將它顯示出來。 布局中所有引用的字元串我們都放在stringsmit(); new HideHeaderTask()/apk/res/android" xmlns:tools="schemas/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" > <com.example.pulltorefreshtest.RefreshableView android:id="@+id/refreshable_view" android:layout_width="fill_parent" android:layout_height="fill_parent" > <ListView android:id="@+id/list_view" android:layout_width="fill_parent" android:layout_height="fill_parent" > </ListView> </com.example.pulltorefreshtest.RefreshableView> </RelativeLayout> 可以看到,我們在自定義的RefreshableView中加入了一個ListView,這就意味著給這個ListView加入了下拉刷新的功能,就是這么簡單! 然後我們再來看一下程序的主Activity,打開或新建MainActivity,加入如下代碼: 復制代碼 代碼如下: public class MainActivity extends Activity { RefreshableView refreshableView; ListView listView; ArrayAdapter<String> adapter; String[] items = { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L" }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); refreshableView = (RefreshableView) findViewById(R.id.refreshable_view); listView = (ListView) findViewById(R.id.list_view); adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, items); listView.setAdapter(adapter); refreshableView.setOnRefreshListener(new PullToRefreshListener() { @Override public void onRefresh() { try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } refreshableView.finishRefreshing(); } }, 0); } } 可 以看到,我們通過調用RefreshableView的setOnRefreshListener方法注冊了一個監聽器,當ListView正在刷新時就 會回調監聽器的onRefresh方法,刷新的具體邏輯就在這里處理。而且這個方法已經自動開啟了線程,可以直接在onRefresh方法中進行耗時操 作,比如向伺服器請求最新數據等,在這里我就簡單讓線程睡眠3秒鍾。另外在onRefresh方法的最後,一定要調用RefreshableView中的 finishRefreshing方法,這個方法是用來通知RefreshableView刷新結束了,不然我們的ListView將一直處於正在刷新的 狀態。 不知道大家有沒有注意到,setOnRefreshListener這個方法其實是有兩個參數的,我們剛剛也是傳入了一個不起眼的 0。那這第二個參數是用來做什麼的呢?由於RefreshableView比較智能,它會自動幫我們記錄上次刷新完成的時間,然後下拉的時候會在下拉頭中 顯示距上次刷新已過了多久。這是一個非常好用的功能,讓我們不用再自己手動去記錄和計算時間了,但是卻存在一個問題。如果當前我們的項目中有三個地方都使 用到了下拉刷新的功能,現在在一處進行了刷新,其它兩處的時間也都會跟著改變!因為刷新完成的時間是記錄在配置文件中的,由於在一處刷新更改了配置文件, 導致在其它兩處讀取到的配置文件時間已經是更改過的了。那解決方案是什麼?就是每個用到下拉刷新的地方,給setOnRefreshListener方法 的第二個參數中傳入不同的id就行了。這樣各處的上次刷新完成時間都是單獨記錄的,相互之間就不會再有影響。 好了,全部的代碼都在這里了,讓我們來運行一下,看看效果吧。 效果看起來還是非常不錯的。我們最後再來總結一下,在項目中引入ListView下拉刷新功能只需三步: 1. 在Activity的布局文件中加入自定義的RefreshableView,並讓ListView包含在其中。 2. 在Activity中調用RefreshableView的setOnRefreshListener方法注冊回調介面。 3. 在onRefresh方法的最後,記得調用RefreshableView的finishRefreshing方法,通知刷新結束。 從此以後,在項目的任何地方,一分鍾引入下拉刷新功能妥妥的。 好了,今天的講解到此結束,有疑問的朋友請在下面留言。 源碼下載,請點擊這里
D. Android瓚呯畝鍗曞疄鐜伴噾閽辨粴鍔ㄦ晥鏋
鍒╃敤ValueAnimator灝嗘暟鍊間粠0涓鐩村為暱鍒頒綘鎵闇瑕佸睍紺虹殑鏁板礆紝鐒跺悗浣跨敤TextView灝嗗為暱榪囩▼涓鐨勬暟鍊間笉鏂灞曠ず鍗沖彲瀹炵幇閲戦挶鐨勬粴鍔ㄦ晥鏋溿
ValueAnimator鏄疉ndroid涓鐢ㄦ潵瀹炵幇灞炴у姩鐢葷殑綾伙紝瀹冩槸Android3.0鍚庢墠寮曞叆鐨勶紝瀹冨彲浠ュ疄鐜板皢鏁板間粠鏌愪竴涓鍊煎埌鏌愪竴涓鍊肩殑鍙樺寲錛屾瘮濡俈alueAnimator.ofInt(10錛100)灝卞彲浠ュ疄鐜版暟鍊間粠10鍒100鐨勫彉鍖栵紝鑰屾ゆ柟娉曠殑鍙傛暟綾誨瀷鏄鍙鍙橀暱搴︾殑鍙傛暟錛屽嵆鍙浠ヤ紶鍏ュ氫釜鏁板礆紝姣斿俈alueAnimator.ofInt(10錛100錛20)鍒欏彲瀹炵幇鏁板間粠10鍒100鍒20鐨勫彉鍖栵紝閭d箞鎴戜滑濡備綍鑾峰彇鏈熼棿鍙樺寲鐨勫煎憿錛熻繖閲屾垜浠閫氳繃valueAnimator.addUpdateListener錛堬級娣誨姞涓涓鐩戝惉浜嬩歡鏉ヨ幏鍙栵紝鑰屽姩鐢葷殑鏃墮暱鍙浠ョ敤setDuration錛堬級鏂規硶鏉ヨ劇疆銆
欏圭洰婧愮爜: https://github.com/myml666/RunnTextView
E. Carson帶你學Android:常見的三種動畫類型
Android 動畫主要分為分為兩大類(三種):
下面。我將簡單介紹這兩大類、三種 Android 常用動畫
根據不同的動畫效果,補間動畫分為4種動畫:
具體效果分別如下:
較為復雜的個性化動畫效果。
將動畫拆分後的圖片幀
在 Android 3.0 ( API 11 )後才提供的一種全新動畫模式
與屬性相關、更加復雜的動畫效果。
不定期分享關於 安卓開發 的干貨,追求 短、平、快 ,但 卻不缺深度 。
F. android TextView文本動畫橫向移動時間
TextView實現文字滾動需要以下幾個要點:
1.文字長度長於可顯示範圍:android:singleLine="true"
2.設置可滾到,或顯示樣式:android:ellipsize="marquee"
3.TextView只有在獲取焦點後才會滾動顯示隱藏文字,因此需要在包中新建一個類,繼承TextView。重寫isFocused方法,這個方法默認行為是,如果TextView獲得焦點,方法返回true,失去焦點則返回false。跑馬燈效果估計也是用這個方法判斷是否獲得焦點,所以把它的返回值始終設置為true。
Java語言: AlwaysMarqueeTextView 類
public class AlwaysMarqueeTextView extends TextView {
public AlwaysMarqueeTextView(Context context) {
super(context);
}
public AlwaysMarqueeTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public AlwaysMarqueeTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
public boolean isFocused() {
return true;
}
在布局XML文件中加入這么一個AlwaysMarqueeTextView,這個加入方法也是剛剛學的。
XML語言: layout.xml
<com.examples.AlwaysMarqueeTextView
android:id=「@+id/AMTV1″
android:layout_width=「fill_parent」
android:layout_height=「wrap_content」
android:lines=「1″
android:focusable=「true」
android:focusableInTouchMode=「true」
android:scrollHorizontally=「true」
android:marqueeRepeatLimit=「marquee_forever」
android:ellipsize=「marquee」
android:background=「@android:color/transparent」
/>
ellipsize屬性
設置當文字過長時,該控制項該如何顯示。有如下值設置:」start」—–省略號顯示在開頭;」end」——省略號顯示在結尾;」middle」—-省略號顯示在中間;」marquee」 ——以跑馬燈的方式顯示(動畫橫向移動)
marqueeRepeatLimit屬性
在ellipsize指定marquee的情況下,設置重復滾動的次數,當設置為marquee_forever時表示無限次。
組合View的問題:
XML語言: 組合View
< LinearLayout
xmlns:android =「http://schemas.android.com/apk/res/android」
android:orientation =「vertical」
android:gravity =「center_vertical」
android:background =「@drawable/f_background」
android:layout_width =「fill_parent」
android:focusable =「true」
android:layout_height =「50px」 >
< TextView
android:id =「@+id/info_text」
android:focusable =「true」
android:layout_width =「fill_parent」
android:layout_height =「wrap_content」
android:text =「test marquee .. 「
android:textColor =「@color/black」
android:singleLine =「true」
android:ellipsize =「marquee」
android:marqueeRepeatLimit =「3″
android:textSize =「18sp」
/>
< TextView
android:id =「@+id/date_text」
android:layout_width =「fill_parent」
android:layout_height =「wrap_content」
android:layout_gravity =「bottom」
android:textColor =「@color/gray」
android:text =「2010/05/28″
android:textSize =「12sp」
/>
</ LinearLayout >
上面示例中2個TextView組合為一個View,由於設置了LinearLayout為focusable而TextView就沒法取得焦點了,這樣 這個TextView的跑馬燈效果就顯示不出來,就算你也設置TextView的 android:focusable="true" 也是 沒用的. 這個時候就要使用addStatesFromChildren 這個屬性了,在LinearLayout中設置這個屬性,然後設置TextView的focusable= "true" 就可以了.關於 addStatesFromChildren的說明:
Sets whether this ViewGroup's drawable states also include its children's drawable states.
G. 怎樣讓 Android 系統的過渡動畫達到 iOS 那樣流暢自然的效果
1、首先在此隱手機桌面打開設置。