您好,登錄后才能下訂單哦!
小編給大家分享一下Android實(shí)現(xiàn)鎖屏熒光效果的方法,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
前言
這是幾個(gè)月前寫的博文,睡前看了覺得有些敷衍,還是改了再發(fā)吧。
之前的博客做了個(gè)鎖屏應(yīng)用,在以前各種酷炫的鎖屏效果是很流行的,有時(shí)候會(huì)去鎖屏市場(chǎng)看看哪些自己喜歡的特效,發(fā)現(xiàn)有個(gè)很酷炫的熒光解鎖的效果,于是想著能否自己實(shí)現(xiàn)一下。
鎖屏效果:
原理:
鎖屏的原理在前些篇章已經(jīng)有做介紹了,這里主要講熒光這種效果的實(shí)現(xiàn)。
原理要點(diǎn):
1)關(guān)于熒光點(diǎn),每一個(gè)熒光店都是我們一個(gè)對(duì)象實(shí)體,因此我們將其單獨(dú)構(gòu)造為一個(gè)類,它具有自己的一些屬性,比如熒光開始時(shí)間,熒光點(diǎn)的半徑,熒光點(diǎn)的生命周期等。
/** * 熒光點(diǎn) */ private class FluorescencePointF{ public PointF mPointF; //熒光點(diǎn)坐標(biāo) public long mStartTime; //開始時(shí)間 private float mRadius; //熒光點(diǎn)半徑 private final float MAX_RADIUS = Constant.sScaleX * 15; //熒光點(diǎn)最大半徑 private final float MIN_RADIUS = Constant.sScaleX * 8; //熒光點(diǎn)最小半徑 private final long SHOW_TIME = 600; //熒光維持時(shí)間 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); } /** * 熒光點(diǎn)是否生存 * @return */ public boolean isAlive(){ return System.currentTimeMillis() - mStartTime <= SHOW_TIME; } }
2)關(guān)于熒光發(fā)光的實(shí)現(xiàn)
從鎖屏主題的效果我們可以看到,熒光點(diǎn)都是先發(fā)光閃亮,后來隨著半徑逐漸變小,亮度逐漸減弱。
光亮效果我們可以通過RadialGradient類渲染來實(shí)現(xiàn),同時(shí)我們可以通過逐漸改變半徑大小,來讓熒光點(diǎ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)于熒光點(diǎn)錯(cuò)落閃亮的效果
實(shí)現(xiàn)了一個(gè)熒光點(diǎn)如何發(fā)光的效果,接下來我們要實(shí)現(xiàn)的是一堆熒光點(diǎn),為了讓熒光效果看起來自然,我們當(dāng)然不能同時(shí)產(chǎn)生一堆熒光點(diǎn),我們要造成一種“隨機(jī)”的效果,即隨機(jī)的產(chǎn)生的時(shí)機(jī),隨機(jī)的數(shù)量,隨機(jī)的大小,隨機(jī)的坐標(biāo)。
通過隨機(jī)數(shù),產(chǎn)生隨機(jī)數(shù)量的熒光點(diǎn),這時(shí)候熒光點(diǎn)的坐標(biāo)和半徑也是隨機(jī)生成的(詳見熒光點(diǎn)類的構(gòu)造方法)
4)關(guān)于邏輯處理
邏輯的處理就很簡(jiǎn)單了,我們只需要在onTouchEvent()方法里處理觸摸事件,生成隨機(jī)的熒光點(diǎn)就行了。
@Override public boolean onTouchEvent(MotionEvent event) { int action = event.getAction(); mTouchPoint.x = event.getX(); mTouchPoint.y = event.getY(); switch (action){ //手指按下的時(shí)候,在手指附近區(qū)域生成熒光點(diǎn) case MotionEvent.ACTION_DOWN: mStartPoint.x = mTouchPoint.x; mStartPoint.y = mTouchPoint.y; createRandomPoints(); invalidate(); break; //手指移動(dòng),繼續(xù)生成熒光點(diǎn) 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實(shí)現(xiàn)鎖屏熒光效果的方法”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。