1. 程式人生 > >Android動畫機制與使用技巧(三)Android動畫特效

Android動畫機制與使用技巧(三)Android動畫特效

下面來例舉一些動畫效果例項,讓大家熟悉如何通過Android的動畫框架來建立賞心悅目的動畫

靈動選單

下圖中展示的是靈動選單的效果圖。當用戶點選小紅點後,彈出選單,並帶有一個緩衝的過渡動畫,這也是Google在Material Design中所強調的動畫過渡效果

這裡寫圖片描述
這裡寫圖片描述

要實現這樣一個動畫效果,因為它具有互動性,所以肯定不能使用檢視動畫而必須使用屬性動畫。其次,只需要針對每個不同的按鈕設定不同的動畫,並設定相應的插值器就可以實現展開、合攏效果了。程式碼如下所示:

public class PropertyTest extends Activity implements View
.OnClickListener {
private int[] mRes = {R.id.imageView_a, R.id.imageView_b, R.id.imageView_c, R.id.imageView_d, R.id.imageView_e}; private List<ImageView> mImageViews = new ArrayList<ImageView>(); private boolean mFlag = true; @Override protected void onCreate
(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_custom_anim_instance_property); for (int i = 0; i < mRes.length; i++) { ImageView imageView = (ImageView) findViewById(mRes[i]); imageView.setOnClickListener(this
); mImageViews.add(imageView); } } @Override public void onClick(View v) { switch (v.getId()) { case R.id.imageView_a: if (mFlag) { startAnim(); } else { closeAnim(); } break; default: Toast.makeText(PropertyTest.this, "" + v.getId(), Toast.LENGTH_SHORT).show(); break; } } private void closeAnim() { ObjectAnimator animator0 = ObjectAnimator.ofFloat(mImageViews.get(0), "alpha", 0.5F, 1F); ObjectAnimator animator1 = ObjectAnimator.ofFloat(mImageViews.get(1), "translationY", 200F, 0); ObjectAnimator animator2 = ObjectAnimator.ofFloat(mImageViews.get(2), "translationX", 200F, 0); ObjectAnimator animator3 = ObjectAnimator.ofFloat(mImageViews.get(3), "translationY", -200F, 0); ObjectAnimator animator4 = ObjectAnimator.ofFloat(mImageViews.get(4), "translationX", -200F, 0); AnimatorSet set = new AnimatorSet(); set.setDuration(500); set.setInterpolator(new BounceInterpolator()); set.playTogether(animator0, animator1, animator2, animator3, animator4); set.start(); mFlag = true; } private void startAnim() { ObjectAnimator animator0 = ObjectAnimator.ofFloat( mImageViews.get(0), "alpha", 1F, 0.5F); ObjectAnimator animator1 = ObjectAnimator.ofFloat( mImageViews.get(1), "translationY", 200F); ObjectAnimator animator2 = ObjectAnimator.ofFloat( mImageViews.get(2), "translationX", 200F); ObjectAnimator animator3 = ObjectAnimator.ofFloat( mImageViews.get(3), "translationY", -200F); ObjectAnimator animator4 = ObjectAnimator.ofFloat( mImageViews.get(4), "translationX", -200F); AnimatorSet set = new AnimatorSet(); set.setDuration(500); set.setInterpolator(new BounceInterpolator()); set.playTogether( animator0, animator1, animator2, animator3, animator4); set.start(); mFlag = false; } }

計時器動畫

下面通過ValueAnimator來實現計時器的動畫效果,當用戶點選後數字會不斷增加,效果如下所示:

這裡寫圖片描述
這裡寫圖片描述

實現原理就是藉助ValueAnimator來實現數字的不斷增加,並將值設定給TextView,程式碼如下所示:

public void tvTimer(final View view) {
    ValueAnimator valueAnimator = ValueAnimator.ofInt(0, 100);
    valueAnimator.addUpdateListener(
            new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator animation) {
            ((TextView) view).setText("$ " +
                    (Integer) animation.getAnimatedValue());
        }
    });
    valueAnimator.setDuration(3000);
    valueAnimator.start();
}

下拉展開動畫

下面再通過ValueAnimator來實現一個下拉展開動畫的效果,當點選一個View時的時候,顯示下面隱藏的一個View,並且讓View在顯示時增加一個動畫效果,因此需要讓隱藏的View的高度不斷變化,但不是迅速增加到目標值。所以使用ValueAnimator來模擬這個過程。程式碼如下:

public class DropTest extends Activity {

    private LinearLayout mHiddenView;
    private float mDensity;
    private int mHiddenViewMeasuredHeight;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_custom_anim_instance_drop);
        mHiddenView = (LinearLayout) findViewById(R.id.hidden_view);
        // 獲取畫素密度
        mDensity = getResources().getDisplayMetrics().density;
        // 獲取佈局的高度
        mHiddenViewMeasuredHeight = (int) (mDensity * 40 + 0.5);
    }

    public void llClick(View view) {
        if (mHiddenView.getVisibility() == View.GONE) {
            // 開啟動畫
            animateOpen(mHiddenView);
        } else {
            // 關閉動畫
            animateClose(mHiddenView);
        }
    }

    private void animateOpen(final View view) {
        view.setVisibility(View.VISIBLE);
        ValueAnimator animator = createDropAnimator(
                view,
                0,
                mHiddenViewMeasuredHeight);
        animator.start();
    }

    private void animateClose(final View view) {
        int origHeight = view.getHeight();
        ValueAnimator animator = createDropAnimator(view, origHeight, 0);
        animator.addListener(new AnimatorListenerAdapter() {
            public void onAnimationEnd(Animator animation) {
                view.setVisibility(View.GONE);
            }
        });
        animator.start();
    }

    //通過ValueAnimator來建立一個從0到目標值的數值發生器,並由此來改變View的佈局屬性
    private ValueAnimator createDropAnimator(
            final View view, int start, int end) {
        ValueAnimator animator = ValueAnimator.ofInt(start, end);
        animator.addUpdateListener(
                new ValueAnimator.AnimatorUpdateListener() {

            @Override
            public void onAnimationUpdate(ValueAnimator valueAnimator) {
                int value = (Integer) valueAnimator.getAnimatedValue();
                ViewGroup.LayoutParams layoutParams =
                        view.getLayoutParams();
                layoutParams.height = value;
                view.setLayoutParams(layoutParams);
            }
        });
        return animator;
    }
}

這裡寫圖片描述
這裡寫圖片描述

程式碼下載

相關推薦

Android群英傳--動畫機制技巧

繼續上一篇的,總結一下最後的SVG向量動畫。 SVG向量動畫: 介紹: 向量動畫是Google在Android5.X中新增加的動畫型別。要了解這種動畫型別,首先我們來了解一下什麼是SVG。 什麼是SVG? SVG 指可伸縮

Android動畫機制使用技巧Android動畫特效

下面來例舉一些動畫效果例項,讓大家熟悉如何通過Android的動畫框架來建立賞心悅目的動畫 靈動選單 下圖中展示的是靈動選單的效果圖。當用戶點選小紅點後,彈出選單,並帶有一個緩衝的過渡動畫,這也是Google在Material Design中所強調的動畫

利用FFmpeg玩轉Android視訊錄製壓縮

前言 上一回說到啊,這千秋月沒是佳人離別,時逢枯枝落舊城,卻待新蘭滿長街,戰場上還未至瑞雪,各位看官不好意思,今日帝都又霧霾,來聽小老二說書的別忘了加個口罩。在利用FFmpeg玩轉Android視訊錄製與壓縮(二)中我們基本編寫完了所有模組兒程式碼,但是沒有整合在

Android動畫機制使用技巧——動畫補充知識

Android佈局動畫 佈局動畫是指作用在ViewGroup上,給ViewGroup增加View時新增一個動畫過渡效果。 最簡單的佈局動畫是在ViewGroup的XML中,使用以下程式碼來開啟佈局動畫。 android:animateLayoutCha

Android繪圖機制處理技巧Android影象處理之畫筆特效處理

前面的文章中已經學習了常用的畫筆屬性,比如普通的畫筆(Paint),帶邊框、填充的style,顏色(Color),寬度(StrokeWidth),抗鋸齒(ANTI_ALIAS_FLAG)等,然而Android還提供了各種各樣專業的畫筆工具,如記號筆、毛筆、蠟筆等

ArcGIS for Android 100.3的學習應用 實現地圖新增自定義指北針

圖為高德地圖實現指北針的效果,那麼ArcGIS如何實現呢? 實現方式: 新增地圖的旋轉監聽: map.addMapRotationChangedListener(new MapRotationChangedListener() { @Override

Android音訊實時傳輸播放:AMR硬編碼硬解碼

轉載請註明出處! 在Android中我所知道的音訊編解碼有兩種方式: (一)使用AudioRecord採集音訊,用這種方式採集的是未經壓縮的音訊流;用AudioTrack播放實時音訊流。用這兩個類的話,如果需要對音訊進行編解碼,就需要自己移植編解碼庫了,比如可以移植il

MySQLOracle---日期對比Oracle

數據庫 alt to_date pan 技術分享 時間日期 軟件 floor lte Oracle: 1.獲取當前日期的年,月,日,時,分,秒 select to_char(sysdate,‘yyyy‘) as nowYear from dual; //獲取時間

WPF入門教程系列八——布局之GridUniformGrid

input 接下來 toolbar wid ids 全部 ica tar 生成 五. Grid Grid顧名思義就是“網格”,它的子控件被放在一個一個實現定義好的小格子裏面,整齊配列。 Grid和其他各個Panel比較起來,功能最多也最為復雜。要使用Grid,首先要向Row

Android的JNI調用

java工具 gist 保存 對象 不能 -c 頭文件 動態 sys 註冊JNI函數   註冊之意就是將Java層的native函數與JNI層對應的實現函數關聯起來,這樣在調用Java層的native函數時,就能順利轉到JNI層對應的函數執行。 (1)靜態註冊   根據函數

SQL註入漏洞的分析利用

和數 form 打開 用戶 data 用戶名 text 必須 存儲 MySQL數據庫: 元數據庫information_schema1.在5.0以後版本的MySQL中存在著一個元數據庫information_schema,其中存儲著用戶在MySQL中創建的所有其他數據庫的信

Redis 設計實現

check 就會 鍵值 鍵值對 是否 second 變化 write 次數 RDB 持久化  一、生成RDB   cmd:SAVE --阻塞進程,執行完,才能有效接收客戶端命令。   cmd: BGSAVE --非阻塞,開啟子進程保存。           客

Kotlin學習實踐 fun 函數

意義 element 中間 類的方法 int prefix cal save tor 通過例子來學習如何高效的在Kotlin中定義使用函數。 1、命名參數、默認參數、頂層函數、擴展函數 * 展示幾種創建集合類的方法和擴展的簡單操作集合類的方法 fun createColl

Redis Sentinel機制用法

clear monitor 拒絕 coff failure abstract trac 用法 XML from:https://my.oschina.net/dyyweb/blog/513680 摘要: Redis Sentinel機制與用法(一) Sentin

spring cloud實戰思考 微服務之間通過fiegn上傳一組文件

ets inf str ceo iter protected let pan ins 需求場景:   用戶調用微服務1的接口上傳一組圖片和對應的描述信息。微服務1處理後,再將這組圖片上傳給微服務2進行處理。各個微服務能區分開不同的圖片進行不同處理。   上一篇博客已經討

Ansible基礎安裝配置

回滾 user lin 系統服務管理 oot 備份 cut htm 遠程主機 常用模塊使用(1)、setup## 用來查看遠程主機的一些基本信息# ansible storm_cluster -m setup (2)、ping## 用來測試遠程主機的運行狀態# ansibl

html標題段落

結構 鼠標 技術 ron 不顯示 開始 bubuko 文檔結構 進行 作用 HTML 標題可以用來呈現文檔結構,設置得當的標題有利於用戶瀏覽您的網頁 標題 標題(Heading)是通過 <H1>-<H6> 標簽進行定義的 <h1&

Webpack 4.X 從入門到精通 - devServermode

安裝使用 clas 情況下 屬性 端口 屬性。 npm demo title 上一篇文章裏詳細介紹了一下插件的用法,這一篇文章接著豐富module.exports裏的屬性。如今的前端發展已經非常迅速了,伴隨而來的是開發模式的轉變。現在已經不再是寫個靜態頁面並放在瀏覽器裏打開

微服務架構的優勢不足

均衡 如果 res 避免 分支 修改 分布式應用 微服務 改變 微服務架構的好處   微服務架構模式有很多好處。首先,通過分解巨大單體式應用為多個服務方法解決了復雜性問題。在功能不變的情況下,應用被分解為多個可管理的分支 或服務。每個服務都有一個用RPC-或者消息驅動API

JavaScript 內置對象和使用技巧

ise 如果 cal exec item 根據 一周 lock 9.1 實用技巧 1 從頁面中獲取元素 document.getElementById() 根據ID的值document.getElementsByTagName() 根據標簽名 document.g