1. 程式人生 > >Android使用SVG實現今日頭條下拉重新整理動畫

Android使用SVG實現今日頭條下拉重新整理動畫

1 SVG的全稱是Scalable Vector Graphics,叫可縮放向量圖形。它和點陣圖(Bitmap)相對,SVG不會像點陣圖一樣因為縮放而讓圖片質量下降。

2 Android L開始提供了新的API VectorDrawable 可以使用SVG(向量圖)型別的資源,在xml檔案中的標籤是vector。但想要好好的感受下SVG的使用,除了需要5.0之後的系統支援外,還需要使用AndroidStudio進行開發,因為AS已經支援通過右鍵建立SVG相關的檔案(親兒子的待遇,就像Nexus系列手機)。當然,eclipse也可以進行開發,只是沒有智慧提示和自動補全,一些屬性需要記住手動敲進去。

3 這篇文章使用SVG實現今日頭條的下拉重新整理動畫,體會一把SVG的用法(網上資料不多,畢竟國內對於系統更新的支援還是比較緩慢的)

效果

效果圖

效果分析

1 方形順時針在四個角中移動
2 線條根據方形的移動而變化(包括位置變化和長度變化兩種)

實現分析

1 首先,使用vector標籤建立初始形態的svg圖形

svg圖片

<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:height
="200dp" android:viewportHeight="200" android:viewportWidth="200" android:width="200dp" >
<path android:name="path1" android:pathData=" M20,30 L100,30 M100,30 L100,90 M100,90 L20,90 M20,90 L20,30" android:strokeColor
="@android:color/darker_gray" android:strokeWidth="1" />
<path android:name="path2" android:pathData=" M120,30 L180,30 " android:strokeColor="@android:color/darker_gray" android:strokeWidth="1" /> <path android:name="path3" android:pathData=" M120,60 L180,60" android:strokeColor="@android:color/darker_gray" android:strokeWidth="1" /> <path android:name="path4" android:pathData=" M120,90 L180,90" android:strokeColor="@android:color/darker_gray" android:strokeWidth="1" /> <path android:name="path5" android:pathData=" M20,120 L180,120" android:strokeColor="@android:color/darker_gray" android:strokeWidth="1" /> <path android:name="path6" android:pathData=" M20,150 L180,150" android:strokeColor="@android:color/darker_gray" android:strokeWidth="1" /> <path android:name="path7" android:pathData=" M20,180 L180,180" android:strokeColor="@android:color/darker_gray" android:strokeWidth="1" /> </vector>

需要為每個path設定name屬性,這是為了讓系統找到要實現動畫的元素

包含了兩組寬高屬性:
1 width和height:表示svg圖形的具體大小
2 viewportWidth和viewportHeight:表示svg劃分的比例
兩者的關係:將100dp劃分為100份,如果在繪製圖形時使用座標(20,20),則意味著該座標位於該svg圖形的(20,20)位置

svg指令(包括但不限於)
1 M:將畫筆移動到某一個點上
2 L:代表從當前點繪製直線到指定點
3 A:用於繪製一段弧線,且允許弧線不閉合(可制定引數實現)
4 H:繪製水平線
5 V:繪製垂直線

2 通過animated-vector標籤制定動畫作用的path

<?xml version="1.0" encoding="utf-8"?>
<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/vector" >

    <target
        android:name="path1"
        android:animation="@animator/animator_path_one" />
    <target
        android:name="path2"
        android:animation="@animator/animator_path_two" />
    <target
        android:name="path3"
        android:animation="@animator/animator_path_three" />
    <target
        android:name="path4"
        android:animation="@animator/animator_path_four" />
    <target
        android:name="path5"
        android:animation="@animator/animator_path_five" />
    <target
        android:name="path6"
        android:animation="@animator/animator_path_six" />
    <target
        android:name="path7"
        android:animation="@animator/animator_path_sevent" />

</animated-vector>

每個target裡邊的name屬性與之前在vector中定義的name屬性必須保持一致

3 動畫實現(其中一個為例)

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:ordering="sequentially" >

    <objectAnimator
        android:duration="400"
        android:interpolator="@android:interpolator/decelerate_cubic"
        android:propertyName="pathData"
        android:valueFrom="
        M20,30 
        L100,30 
        M100,30 
        L100,90 
        M100,90 
        L20,90 
        M20,90 
        L20,30"
        android:valueTo="
        M100,30 
        L180,30 
        M180,30 
        L180,90 
        M180,90 
        L100,90 
        M100,90 
        L100,30"
        android:valueType="pathType" />
    <objectAnimator
        android:duration="400"
        android:interpolator="@android:interpolator/decelerate_cubic"
        android:propertyName="pathData"
        android:valueFrom="
        M100,30 
        L180,30 
        M180,30 
        L180,90 
        M180,90 
        L100,90 
        M100,90 
        L100,30"
        android:valueTo="
        M100,120 
        L180,120 
        M180,120
        L180,180 
        M180,180 
        L100,180 
        M100,180 
        L100,120"
        android:valueType="pathType" />
    <objectAnimator
        android:duration="400"
        android:interpolator="@android:interpolator/decelerate_cubic"
        android:propertyName="pathData"
        android:valueFrom="
        M100,120 
        L180,120 
        M180,120
        L180,180 
        M180,180 
        L100,180 
        M100,180 
        L100,120"
        android:valueTo="
        M20,120 
        L100,120 
        M100,120
        L100,180 
        M100,180 
        L20,180 
        M20,180 
        L20,120"
        android:valueType="pathType" />
    <objectAnimator
        android:duration="400"
        android:interpolator="@android:interpolator/decelerate_cubic"
        android:propertyName="pathData"
        android:valueFrom="
        M20,120 
        L100,120 
        M100,120
        L100,180 
        M100,180 
        L20,180 
        M20,180 
        L20,120"
        android:valueTo="
        M20,30 
        L100,30 
        M100,30 
        L100,90 
        M100,90 
        L20,90 
        M20,90 
        L20,30"
        android:valueType="pathType" />

</set>

1 定義了一個動畫集合,裡邊包含了四個屬性動畫,而且為順序執行(android:ordering=”sequentially”)
2 通過android:propertyName=”pathData”設定動畫控制的屬性為路徑
3 android:valueFrom指定了動畫的起始,android:valueTo指定了動畫的結束
4 這裡,還需要新增一個android:valueType=”pathType”來告訴系統是進行pathData變換

4 使用

經過上邊的步驟,一個svg動畫就實現了。

// 將該drawable設定給ImageView
<ImageView
    android:id="@+id/image"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    android:src="@drawable/animated_svg" />
// 啟動動畫(類似於AnimationDrawable的使用 )
Animatable animatable = (Animatable) imageView.getDrawable();
animatable.start();

總結

經過上邊的步驟,就使用svg實現了今日頭條下拉重新整理的動畫。當然,這裡只是用到了svg其中的一些知識;需要更多的瞭解svg,還是需要多些例子,多學習。

相關推薦

Android使用SVG實現今日頭條重新整理動畫

1 SVG的全稱是Scalable Vector Graphics,叫可縮放向量圖形。它和點陣圖(Bitmap)相對,SVG不會像點陣圖一樣因為縮放而讓圖片質量下降。 2 Android

android仿今日頭條重新整理中的vector動畫

一直有留意到今日頭條下拉重新整理的效果, 真的很贊,在學習了svg drawable相關資料後, 參考部落格http://blog.csdn.net/u012950099/article/details/52040028完成了今日頭條下拉重新整理中的動畫, 首先看下效果圖:

Android UI- PullToRrefresh自定義重新整理動畫

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

最簡單的RecyclerView重新整理動畫

首先我們的RecyclerView的根佈局是LinearLayout,所以這裡用的是LinearLayout.LayoutParams,如果是其他佈局,就用相應的LayoutParams。 首先是設定的程式碼: recyclerView.

Android scrollview中巢狀listview實現listview的重新整理載入更多

我們都知道在Android中scrollview和listview都能滑動,如果scrollview巢狀listview會出現一些問題,比如listview不能正常顯示item...但是在一些專案中,一些頁面內容比較多,需要在外面放一個scrollview,裡面還會巢狀li

手把手教你實現RecyclerView的重新整理和上載入更多

個人原創,轉載請註明出處http://blog.csdn.net/u012402124/article/details/78210639 2018年10月25日更新 讓大家花費時間看文章卻沒有解決需求,隨著bug的增多內心的愧疚感逐漸增強,但幾個月前的程式

SwipeRefreshLayout原始碼分析+自定義UC頭條重新整理Demo

首先來看SwipeRefreshLayout(以下簡稱SR)的繼承關係 NestedScrollingParent:巢狀滑動父介面 NestedScrollingChild :巢狀滑動子介面 Android 就是通過這兩個介面, 來實現 子View

android PullToRrefresh自定義重新整理動畫

參考自 http://blog.csdn.net/wwj_748/article/details/42523611 首先,下載著名的重新整理框架https://github.com/chrisbanes/Android-PullToRefresh,其中simple為de

輕鬆實現RecycleView的重新整理、載入更多

那如同這個題目,這裡面涉及的東西其實還是比較多的,RecycleView SwipeRefreshLayout,下拉重新整理(這個就是SwipeRefreshLayout的),載入更多。 SwipeRefreshLayout 這個是Google自己封

詳解RecyclerView+BGARefreshLayout實現自定義重新整理、上載入和側滑刪除效果

前言 還有2個月就過年了,對於我們這樣在外漂泊的異鄉人來說,一家人團聚在一起,吃一頓團圓飯,那是再幸福不過的事了。我們之所以遠離家鄉來到異鄉就像異鄉人這首歌寫的一樣,只為一扇窗! 正文 上篇文章給大家講解了一下關於RecyclerView的使用,今天給

Android 仿天貓京東淘寶 首頁的 title欄變色和重新整理動畫效果

一 啥也不說了 先看效果吧 二 實現原理      1 關於 title欄的變色 其實就是根據手指移動的距離,去改變 title欄背景顏色的透明度。其他的變化就根據專案的需要來 比如字型變色啊 搜尋框變色啊         在這裡  我自定義了一個scrollView 繼

Android自定義控制元件實戰——實現仿IOS重新整理載入 PullToRefreshLayout

         下拉重新整理控制元件,網上有很多版本,有自定義Layout佈局的,也有封裝控制元件的,各種實現方式的都有。但是很少有人告訴你具體如何實現的,今天我們就來一步步實現自己封裝的 PullToRefreshLayout 完美的解決下拉重新整理,上拉載入問題。  

Android自定義重新整理動畫--仿百度外賣重新整理

好久沒寫部落格了,小編之前一段時間一直在找工作,從天津來到了我們的大帝都,感覺還不錯。好了廢話不多說了,開始我們今天的主題吧。現如今的APP各式各樣,同樣也帶來了各種需求,一個下拉重新整理都能玩出花樣了,前兩天訂飯的時候不經意間看到了“百度外賣”的下拉重新整理,今天

android 自定義重新整理動畫效果

    今天公司讓把官方的下拉重新整理動畫改一下,自己仔細讀pullTorefresh原始碼,終於發現了蛛絲馬跡,現我就自己理解將修改步驟給大家講解一下。 本篇博文要給大家分享的是如何使用修改開源專案PullToRrefresh下拉重新整理的動畫,來滿足我們開發當中特定的需

修改PullToRefresh重新整理動畫

開源框架PullToRefresh在android開發中的使用非常廣泛,通常我們使用PullToRefresh是將這樣的專案作依賴新增到自己的專案上,但是這樣我們需要上傳依賴專案和自己的專案,雖然這並不存在任何問題。然,一個有強迫症的程式Yuan,為了專案的整潔

實現重新整理,上載入可自定義各種動畫

一、使用說明 1、UltimateRefreshView 支援ListView,GridView,ScrollView,WebVIew,RecyclerView(只支援LinearLayoutManager). 2、佈局使用: 1 2 3 4 5 6 7 8 9 1

andbase框架實現載入,重新整理和自定義旋轉動畫的方式

1、今天做列表時,需求上需要做一個下拉重新整理,下拉載入更多的功能,就上網找了一些例子,由於我原來用的就是andbase框架,就還是用它原來寫的了。其中同事給我推薦另一個框架BGARefreshLayout-Android,下載地址https://github.com/bin

[log] vue使用Mint元件實現重新整理、上載入

https://mint-ui.github.io/docs/#/zh-cn2/loadmore 使用的vue <mt-loadmore :top-method="loadTop" :bottom

WaveSwipeRefreshLayout +RecyclerView 實現簡單的水滴重新整理

第一步: 1.在app build.gradle中加入依賴: implementation 'com.github.recruit-lifestyle:WaveSwipeRefreshLayout:1.6' 2.AndroidManifest中新增網路許可權

Android從零擼美團(二) - 仿美團重新整理自定義動畫

這是【從零擼美團】系列文章第二篇。 專案地址:github.com/cachecats/L… 今天寫了下拉重新整理,框架用的是 SmartRefreshLayout ,不為啥,因為 Github 上它有 9.5k 個 star,中文支援好節省時間。 先上圖: 一、分析 美團的下拉載入動