1. 程式人生 > >Android開發:View間漸變動畫(例項)

Android開發:View間漸變動畫(例項)

漸變動畫(也叫消失)通常指漸漸的淡出某個UI元件,同時同步地淡入另一個。當App想切換內容或View的情況下,這種動畫很有用。漸變簡短不易察覺,同時又提供從一個介面到下一個之間流暢的轉換。如果在需要轉換的時候沒有使用任何動畫效果,這會使得轉換看上去感到生硬而倉促。在這裡我詳細的講解具體實現,並附上原始碼。

這個例項實際上設計三個檔案layout/activity_crossfade.xml、menu/activity_crossfade.xml、MainActivity

現在我附上三個檔案的原始碼,在註釋中講解功能

layout/activity_crossfade.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ScrollView
        android:id="@+id/content"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <TextView style="?android:textAppearanceMedium"
            android:lineSpacingMultiplier="1.2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@string/lorem_ipsum"
            android:padding="16dp"/>
    </ScrollView>
    <ProgressBar
        android:id="@+id/loading_spinner"
        style="?android:progressBarStyleLarge"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"/>
<!--android:textAppearanceMedium以及?android:progressBarStyleLarge均為android相關的
內建樣式,具體參見android官方參考手冊-->
</FrameLayout>

menu/activity_crossfade.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item android:id="@+id/animation"
        android:title="@string/action_animation"
        app:showAsAction="ifRoom"/>
</menu>

MainActivity.java

package com.example.power.mytest;

import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;

import java.util.zip.Inflater;


public class MainActivity extends AppCompatActivity {
    private View mContentView;
    private View mLoadingView;
    private int mShortAnimationDuration;
    /*我們先定義兩個View,一個int,其中mShortAnimationDuration用於儲存
    * 動畫的持續時間,時間我們定為android內建的值config_shortAnimTime,
    * 這個屬性為動畫定義了一個標準的“短”持續時間。對於細微或者快速發
    * 生的動畫,這是個很理想的持續時段。也可以根據實際需求使用
    * config_longAnimTime或config_mediumAnimTime。*/

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_crossfade);

        mContentView = findViewById(R.id.content);
        mLoadingView = findViewById(R.id.loading_spinner);

        mContentView.setVisibility(View.GONE);
        /*首先設定TextView的可見性為View.GONE,這樣防止view再佔
        據佈局的空間,而且也能在佈局計算中將其忽略,加速處理過程。*/

        mShortAnimationDuration = getResources().getInteger(
                android.R.integer.config_shortAnimTime
        );

        crossfade();
    }

    private void crossfade(){
        mContentView.setAlpha(0f);
        mContentView.setVisibility(View.VISIBLE);
        /*以上兩步之後,TextView已經可見,並佔據了佈局空間,只是被
        * 設定為透明*/

        /*在mShortAnimationDuration時間內,TextView從0f變到1f*/
        mContentView.animate()
                .alpha(1f)
                .setDuration(mShortAnimationDuration)
                .setListener(null);

        /*在mShortAnimationDuration時間內,ProgressBar從1f變到0f,但
        * 可能因為時間較短,progressbar還未來得及看清楚就已經消失,
        * 注意需要將Progressbar設定為View.GONE,以不佔據佈局空間*/
        mLoadingView.animate()
                .alpha(0f)
                .setDuration(mShortAnimationDuration)
                .setListener(new AnimatorListenerAdapter() {
                    @Override
                    public void onAnimationEnd(Animator animation) {
                        mLoadingView.setVisibility(View.GONE);
                    }
                });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater menuInflater = getMenuInflater();
        menuInflater.inflate(R.menu.activity_crossfade, menu);

        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()){
            case R.id.animation:
                crossfade();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }

    }
}

只需將上述原始碼黏貼與相應檔案即可,檢視具體效果,相關細節慢慢體會。