編輯:關於Android編程
大家在使用APP的時候,有的APP在點擊語音搜索界面後,會出現一個小話筒,小話筒會類似雷達似得在閃爍,表示正在傾聽你說話的內容(這個大家可以參照微軟的必應APP),那麼問題來了,這種動畫效果是如何實現的呢?其實實現這種動畫效果有很多種方法,最常見的是兩種:第一種就是插入n張圖片進行切換已達到如此目的,第二種就是通過改變一張圖片的透明度來達到閃爍的效果。下面就分別講一下通過這兩種方法如何實現。
第一種:通過n張圖片之間切換實現動畫效果
這種方法的原理很簡單,利用handler的延時機制在子線程中完成圖片切換,再在主線程展示。
1、首先我們要先寫一個線程池,在使用的時候方便調用。
package com.jereh.musicapplication.threadpool; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; /** * Created by zhangdi on 2016/9/1. * 這是一個線程池的工具類,在用到線程的時候可以直接類名加方法名使用 */ public class ThreadPoolManager { /** 線程執行器 **/ private static ExecutorService executorService = null; /** 固定5個線程 **/ private static int nThreads = 5; /** 單例 **/ private static ThreadPoolManager taskExecutorPool = null; /** 初始化線程池 **/ static { taskExecutorPool = new ThreadPoolManager(nThreads * getNumCores()); } /** 構造函數 **/ private ThreadPoolManager(int threads) { //executorService = Executors.newFixedThreadPool(threads); executorService = Executors.newScheduledThreadPool(threads); } /** * 取得單例 * * @return */ public static ThreadPoolManager getInstance() { return taskExecutorPool; } /** * 取得線程執行器 * * @return */ public ExecutorService getExecutorService() { return executorService; } /** * 取得周期性線程執行器 * @return */ public ScheduledExecutorService getScheduledExcutorService(){ return (ScheduledExecutorService)executorService; } /** * 獲得手機cup個數 * @return */ public static int getNumCores() { int threadCount = Runtime.getRuntime().availableProcessors(); return threadCount; } }
2、下一步就是在xml文件中插入一個布局
<FrameLayout android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/fl"/>
3、然後就是在java代碼中編輯切換圖片了:
package com.jereh.musicapplication; import android.graphics.drawable.Drawable; import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.FrameLayout; import com.jereh.musicapplication.threadpool.ThreadPoolManager; import java.util.Timer; import java.util.TimerTask; import java.util.concurrent.TimeUnit; public class FrameActivity extends AppCompatActivity { private Timer timer; FrameLayout frameLayout; Drawable drawable; android.os.Handler handler = new android.os.Handler(){ int i = 0; @Override public void handleMessage(Message msg) { if (msg.what==1){ i++; move(i%4); } super.handleMessage(msg); } }; void move(int i){ drawable = getResources().getDrawable(R.mipmap.ic_launcher,null); Drawable drawable1 = getResources().getDrawable(R.mipmap.dd1,null); Drawable drawable2 = getResources().getDrawable(R.mipmap.dd2,null); Drawable drawable3 = getResources().getDrawable(R.mipmap.dd3,null); switch (i){ case 0: frameLayout.setForeground(drawable); break; case 1: frameLayout.setForeground(drawable1); break; case 2: frameLayout.setForeground(drawable2); break; case 3: frameLayout.setForeground(drawable3); break; } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_frame); frameLayout = (FrameLayout)findViewById(R.id.fl); timer = new Timer(); // timer.schedule(new TimerTask() { // @Override // public void run() { // handler.sendEmptyMessage(1); // } // },0,500);//第二個參數是隔多少秒之後開始顯示,第三個是隔多久顯示下一個 ThreadPoolManager .getInstance() .getScheduledExcutorService() .scheduleAtFixedRate(new Runnable() { @Override public void run() { handler.sendEmptyMessage(1); } },0,500, TimeUnit.MILLISECONDS);//第二個參數是隔多少秒之後開始顯示,第三個是隔多久顯示下一個 } @Override protected void onDestroy() { timer.cancel(); super.onDestroy(); } }
這裡我寫了兩種方式,第一種是用Timer類來實現,後來發現使用自定義的線程池更好,大家如果不想在定義一個線程池的話,可以直接使用Timer類來實現同樣的效果,至此使用第一種級n張圖片切換實現動畫效果的代碼就完成了。這種方式有一個弊端就是得需要n張圖片,那麼要是只有單張圖片又該怎麼辦呢,那麼就可以使用下面這種方法了。
第二種:通過改變圖片透明度實現動畫效果
1、首先我們先封裝兩個動畫方法,第一個是從不透明到完全透明,第二個是完全透明到不透明
/** * 透明效果 * @return */ public Animation getAlphaAnimationIn() { //實例化 AlphaAnimation 主要是改變透明度 //透明度 從 1-不透明 0-完全透明 Animation animation = new AlphaAnimation(1.0f, 0); //設置動畫插值器 被用來修飾動畫效果,定義動畫的變化率 animation.setInterpolator(new DecelerateInterpolator()); //設置動畫執行時間 animation.setDuration(2000); return animation; } public Animation getAlphaAnimationOut() { //實例化 AlphaAnimation 主要是改變透明度 //透明度 從 1-不透明 0-完全透明 Animation animation = new AlphaAnimation(0, 1.0f); //設置動畫插值器 被用來修飾動畫效果,定義動畫的變化率 animation.setInterpolator(new DecelerateInterpolator()); //設置動畫執行時間 animation.setDuration(2000); return animation; }
2、分別給這兩個方法設置監聽,即第一個動畫完成立刻執行第二個動畫,第二個動畫完成在立刻執行第一個動畫以實現動畫循環播放的效果
voiceState1.setAnimation(animationIn); voiceState1.setAnimation(animationOut); /** * 監聽動畫實現動畫間的切換 */ animationOut.setAnimationListener(new Animation.AnimationListener() { @Override public void onAnimationStart(Animation animation) { } @Override public void onAnimationEnd(Animation animation) { voiceState1.startAnimation(animationIn); } @Override public void onAnimationRepeat(Animation animation) { } }); animationIn.setAnimationListener(new Animation.AnimationListener() { @Override public void onAnimationStart(Animation animation) { } @Override public void onAnimationEnd(Animation animation) { voiceState1.startAnimation(animationOut); } @Override public void onAnimationRepeat(Animation animation) { } });
至此使用一張圖片通過改變其透明度實現閃爍效果就完成了。
以上所述是小編給大家介紹的android實現圖片閃爍動畫效果的兩種實現方式(實用性高),希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對本站網站的支持!
本系列文章主要介紹如何利用Android開發一個簡單的健康食譜軟件。用到的相關技術如下所示:提供GridView和ListView的基本使用利用univers
布局文件復制代碼 代碼如下:<RelativeLayout xmlns:android=http://schemas.android.com/apk/res/and
介紹彈性滑動也就是漸進式滑動,實現彈性滑動的方法有很多,但是他們都有一個共同的思想:將一次大的滑動分成若干次小的滑動並在一段時間內完成。本文主要介紹三種彈性滑動方式,Sc
通過之前的10節,已實現了記事本的大部分功能,有添加拍照,添加照片,添加錄音,添加繪圖,添加手寫,另外細心的可以發現,底部菜單還有一個更多的選項,這個以後再