自定義View-27 仿58同城載入資料動畫
效果
1、效果分析
1.1、載入顯示組合控制元件(佈局)
1.2 、分析動畫實現
1.2.1:下落動畫同時陰影縮小,當下落動畫執行完成,開始上拋動畫同時陰影放大,當上拋動畫執行完成開始下落動畫。一直輪訓執行。
1.2.2 : 下落動畫執行完畢的時候ShapeView改變形狀。
1.2.3 : 上拋動畫開始的時候執行 旋轉動畫,正方形旋轉180°,三角形旋轉120°。
2、程式碼實現
2.1、 載入顯示組合控制元件(佈局)
佈局包含三個部分 = ShapeView(圖形切換View,之前部落格寫過) + View(陰影背景 shape="oval") + TextView
佈局如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#FFFFFF"
android:gravity="center"
android:orientation="vertical">
<com.zsj.loadingview58.ShapeView
android:layout_width="25dp"
android:layout_height="25dp"
android:layout_marginBottom="82dp" />
<View
android:layout_width="25dp"
android:layout_height="3dp"
android:background="@drawable/shadow_bg" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="3dp"
android:text="正在載入中..." />
</LinearLayout>
在自定義ViewGoup載入顯示
public class LoadingView extends FrameLayout {
public LoadingView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initLayout();
}
private void initLayout() {
//載入顯示組合控制元件
inflate(getContext(), R.layout.loading_view, this);
}
}
2.2動畫分析
2.2.1:下落動畫同時陰影縮小,當下落動畫執行完成,開始上拋動畫同時陰影放大,當上拋動畫執行完成開始下落動畫。一直輪訓執行
2.2.1.1 下落的速度應該是開始慢後來越來快的,上拋的速度應該是開始快後來越來越慢的
public LoadingView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
mTranslationDistance = dip2px(80);
initLayout();
//1.2.1 下落動畫同時陰影縮小,當下落動畫執行完成,開始上拋動畫同時陰影放大,當上拋動畫執行完成開始下落動畫。一直輪訓執行。
startFallAni();
}
/**
* 開始執行下落動畫
*/
private void startFallAni() {
//下落動畫同時陰影縮小
ObjectAnimator translationAnimator = ObjectAnimator.ofFloat(mShapeView, "translationY", 0, mTranslationDistance);
//2.2.1.1 下落的速度應該是開始慢後來越來快的 ,設定加速差值器
translationAnimator.setInterpolator(new AccelerateInterpolator());
ObjectAnimator scaleAnimator = ObjectAnimator.ofFloat(mShadowView, "scaleX", 1.0f, 0.3f);
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.setDuration(ANIMATOR_DURATION);
animatorSet.playTogether(translationAnimator, scaleAnimator);
animatorSet.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
//當下落動畫執行完成,開始上拋動畫
startUpAni();
}
});
animatorSet.start();
}
/**
* 開始上拋動畫
*/
private void startUpAni() {
//開始上拋動畫同時陰影放大
ObjectAnimator translationAnimator = ObjectAnimator.ofFloat(mShapeView, "translationY", mTranslationDistance, 0);
//2.2.1.1 上拋的速度應該是開始快後來越來越慢的,設定減速插值器
translationAnimator.setInterpolator(new DecelerateInterpolator());
ObjectAnimator scaleAnimator = ObjectAnimator.ofFloat(mShadowView, "scaleX", 0.3f, 1.0f);
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.setDuration(ANIMATOR_DURATION);
animatorSet.playTogether(translationAnimator, scaleAnimator);
animatorSet.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationStart(Animator animation) {
// 2.2.3 : 上拋動畫開始的時候執行 旋轉動畫,正方形旋轉180°,三角形旋轉120°
startRotation();
}
@Override
public void onAnimationEnd(Animator animation) {
//當上拋動畫執行完成開始下落動畫
startFallAni();
}
});
animatorSet.start();
}
2.2.2 : 下落動畫執行完畢的時候ShapeView改變形狀
/**
* 開始執行下落動畫
*/
private void startFallAni() {
animatorSet.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
// 2.2.2 : 下落動畫執行完畢的時候ShapeView改變形狀
mShapeView.exchange();
}
});
animatorSet.start();
}
2.2.3 : 上拋動畫開始的時候執行 旋轉動畫,正方形旋轉180°,三角形旋轉120°
/**
* 開始上拋動畫
*/
private void startUpAni() {
animatorSet.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationStart(Animator animation) {
// 2.2.3 : 上拋動畫開始的時候執行 旋轉動畫,正方形旋轉180°,三角形旋轉120°
startRotation();
}
});
animatorSet.start();
}
/**
* 開始旋轉動畫
*/
private void startRotation() {
// 2.2.3 :正方形旋轉180°,三角形旋轉120°
ObjectAnimator rotationAnimator = null;
//判斷當前圖形是什麼?
switch (mShapeView.getCurrentShape()) {
case Circle:
case Square:
rotationAnimator = ObjectAnimator.ofFloat(mShapeView, "rotation", 0, 180);
break;
case Triangle:
rotationAnimator = ObjectAnimator.ofFloat(mShapeView, "rotation", 0, -120);
break;
default:
break;
}
rotationAnimator.setInterpolator(new DecelerateInterpolator());
rotationAnimator.setDuration(ANIMATOR_DURATION);
rotationAnimator.start();
}
完整程式碼
相關文章
- 「HTML+CSS」--自定義載入動畫【005】HTMLCSS動畫
- 「HTML+CSS」--自定義載入動畫【006】HTMLCSS動畫
- 「HTML+CSS」--自定義載入動畫【016】HTMLCSS動畫
- 「HTML+CSS」--自定義載入動畫【015】HTMLCSS動畫
- 「HTML+CSS」--自定義載入動畫【026】HTMLCSS動畫
- 「HTML+CSS」--自定義載入動畫【011】HTMLCSS動畫
- 「HTML+CSS」--自定義載入動畫【010】HTMLCSS動畫
- 「HTML+CSS」--自定義載入動畫【008】HTMLCSS動畫
- 「HTML+CSS」--自定義載入動畫【007】HTMLCSS動畫
- 「HTML+CSS」--自定義載入動畫【009】HTMLCSS動畫
- 【動畫消消樂】HTML+CSS 自定義載入動畫 065動畫HTMLCSS
- 【動畫消消樂】HTML+CSS 自定義載入動畫 062動畫HTMLCSS
- 【動畫消消樂】HTML+CSS 自定義載入動畫 061動畫HTMLCSS
- 【動畫消消樂】HTML+CSS 自定義載入動畫:怦然心跳 066動畫HTMLCSS
- 【動畫消消樂】HTML+CSS 自定義載入動畫 064(currentColor的妙用!)動畫HTMLCSS
- Flutter自定義CupertinoPageRoute進入動畫Flutter動畫
- 直播平臺搭建,自定義View實現loading動畫載入View動畫
- 「HTML+CSS」--自定義載入動畫【014】【疑問未解決】HTMLCSS動畫
- pytorch載入語音類自定義資料集PyTorch
- python爬取58同城一頁資料Python
- Flutter動畫之自定義動畫元件-FlutterLayoutFlutter動畫元件
- 搞定動畫之 JQuery 中的自定義動畫動畫jQuery
- TransitionAnimation自定義轉場動畫NaN動畫
- 爬蟲實戰——58同城租房資料爬取爬蟲
- 58同城的登入(RSA演算法)演算法
- Java 給PPT新增動畫效果(預設動畫/自定義動畫)Java動畫
- Android從零擼美團(二) - 仿美團下拉重新整理自定義動畫Android動畫
- Android從零擼美團(二) – 仿美團下拉重新整理自定義動畫Android動畫
- Android自定義View播放Gif動畫AndroidView動畫
- Android 自定義View之下雨動畫AndroidView動畫
- 58同城:聚焦女性職場人求職大資料求職大資料
- 『自定義View實戰』—— 仿ios圖示下載viewViewiOS
- 萬彩動畫大師教程 | 自定義動畫函式動畫函式
- Android 自定義圓形旋轉進度條,仿微博頭像載入效果Android
- 【動畫消消樂】HTML+CSS 自定義載入動畫:清新摺疊方塊效果 063(附原始碼及原理詳解)動畫HTMLCSS原始碼
- 58同城:2019年雙十一熱門崗位大資料大資料
- 58同城:2020年雙十一熱門職位大資料大資料
- 58同城:2020年雙十一客服行業大資料行業大資料