Android實現(xiàn)鎖屏熒光效果
前言
這是幾個月前寫的博文,睡前看了覺得有些敷衍,還是改了再發(fā)吧。
之前的博客做了個鎖屏應(yīng)用,在以前各種酷炫的鎖屏效果是很流行的,有時候會去鎖屏市場看看哪些自己喜歡的特效,發(fā)現(xiàn)有個很酷炫的熒光解鎖的效果,于是想著能否自己實現(xiàn)一下。
鎖屏效果:
原理:
鎖屏的原理在前些篇章已經(jīng)有做介紹了,這里主要講熒光這種效果的實現(xiàn)。
原理要點:
1)關(guān)于熒光點,每一個熒光店都是我們一個對象實體,因此我們將其單獨構(gòu)造為一個類,它具有自己的一些屬性,比如熒光開始時間,熒光點的半徑,熒光點的生命周期等。
/** * 熒光點 */ private class FluorescencePointF{ public PointF mPointF; //熒光點坐標 public long mStartTime; //開始時間 private float mRadius; //熒光點半徑 private final float MAX_RADIUS = Constant.sScaleX * 15; //熒光點最大半徑 private final float MIN_RADIUS = Constant.sScaleX * 8; //熒光點最小半徑 private final long SHOW_TIME = 600; //熒光維持時間 private final Interpolator DEC_INTERPOLATOR = new DecelerateInterpolator(); //減速 /** * 構(gòu)造方法 */ public FluorescencePointF(PointF pointF) { this.mPointF = pointF; this.mStartTime = System.currentTimeMillis(); this.mRadius = MIN_RADIUS + mRandom.nextInt((int) MAX_RADIUS); Log.e(TAG,"FluorescencePointF point:" + "x:" +pointF.x + " y:" + pointF.y); Log.e(TAG,"FluorescencePointF radius:" + this.mRadius); } /** * 獲得半徑 */ public float getRadius(){ if(!isAlive()) return 0; return mRadius * DEC_INTERPOLATOR.getInterpolation( ((float)SHOW_TIME - (System.currentTimeMillis() - mStartTime))/ SHOW_TIME); } /** * 熒光點是否生存 * @return */ public boolean isAlive(){ return System.currentTimeMillis() - mStartTime <= SHOW_TIME; } }
2)關(guān)于熒光發(fā)光的實現(xiàn)
從鎖屏主題的效果我們可以看到,熒光點都是先發(fā)光閃亮,后來隨著半徑逐漸變小,亮度逐漸減弱。
光亮效果我們可以通過RadialGradient類渲染來實現(xiàn),同時我們可以通過逐漸改變半徑大小,來讓熒光點看起來慢慢縮小。
Shader shader = new RadialGradient(fluorescencePointF.mPointF.x,fluorescencePointF .mPointF.y,radius,COLOR_WHITE,COLOR_WHITE_SHADER, Shader.TileMode.CLAMP); mPaintShader.setShader(shader); canvas.drawCircle(fluorescencePointF.mPointF.x,fluorescencePointF.mPointF.y, fluorescencePointF.getRadius(),mPaintShader);
3)關(guān)于熒光點錯落閃亮的效果
實現(xiàn)了一個熒光點如何發(fā)光的效果,接下來我們要實現(xiàn)的是一堆熒光點,為了讓熒光效果看起來自然,我們當然不能同時產(chǎn)生一堆熒光點,我們要造成一種“隨機”的效果,即隨機的產(chǎn)生的時機,隨機的數(shù)量,隨機的大小,隨機的坐標。
通過隨機數(shù),產(chǎn)生隨機數(shù)量的熒光點,這時候熒光點的坐標和半徑也是隨機生成的(詳見熒光點類的構(gòu)造方法)
4)關(guān)于邏輯處理
邏輯的處理就很簡單了,我們只需要在onTouchEvent()方法里處理觸摸事件,生成隨機的熒光點就行了。
@Override public boolean onTouchEvent(MotionEvent event) { int action = event.getAction(); mTouchPoint.x = event.getX(); mTouchPoint.y = event.getY(); switch (action){ //手指按下的時候,在手指附近區(qū)域生成熒光點 case MotionEvent.ACTION_DOWN: mStartPoint.x = mTouchPoint.x; mStartPoint.y = mTouchPoint.y; createRandomPoints(); invalidate(); break; //手指移動,繼續(xù)生成熒光點 case MotionEvent.ACTION_MOVE: createRandomPoints(); invalidate(); break; case MotionEvent.ACTION_UP: if(getDistance(mTouchPoint.x,mTouchPoint.y,mStartPoint.x,mStartPoint.y) >= UNLOCK_DISTANCE) Global.Broadcast(getContext(),""); break; case MotionEvent.ACTION_CANCEL: if(getDistance(mTouchPoint.x,mTouchPoint.y,mStartPoint.x,mStartPoint.y) >= UNLOCK_DISTANCE) Global.Broadcast(getContext(),""); break; default: break; } return true; }
碼完,比較簡單,如有錯漏,歡迎指正
代碼傳送門:Android實現(xiàn)熒光效果
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android使用Messenger實現(xiàn)service與activity交互
這篇文章主要介紹了android使用Messenger實現(xiàn)service與activity交互的相關(guān)資料,需要的朋友可以參考下2016-06-06Android TextView實現(xiàn)跑馬燈效果的方法
這篇文章主要介紹了Android TextView跑馬燈效果實現(xiàn)方法,涉及Android布局文件中相關(guān)屬性的設(shè)置技巧,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-01-01Android 如何獲取手機總內(nèi)存和可用內(nèi)存等信息
這篇文章主要介紹了Android系統(tǒng)檢測程序內(nèi)存占用各種方法,并對內(nèi)存信息的詳細介紹,需要的朋友可以參考下2016-07-07flutter ExpansionTile 層級菜單的實現(xiàn)
這篇文章主要介紹了flutter ExpansionTile 層級菜單的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-07-07Android MVVM架構(gòu)實現(xiàn)RecyclerView列表詳解流程
MVVM是Model-View-ViewModel的簡寫。它本質(zhì)上就是MVC 的改進版。MVVM 就是將其中的View 的狀態(tài)和行為抽象化,讓我們將視圖 UI 和業(yè)務(wù)邏輯分開2021-10-10Android viewpager無限輪播獲取網(wǎng)絡(luò)圖片功能
這篇文章主要為大家詳細介紹了Android viewpager無限輪播獲取網(wǎng)絡(luò)圖片功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-09-09