Android實(shí)現(xiàn)鎖屏熒光效果
前言
這是幾個(gè)月前寫(xiě)的博文,睡前看了覺(jué)得有些敷衍,還是改了再發(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è)類(lèi),它具有自己的一些屬性,比如熒光開(kāi)始時(shí)間,熒光點(diǎn)的半徑,熒光點(diǎn)的生命周期等。
/**
* 熒光點(diǎn)
*/
private class FluorescencePointF{
public PointF mPointF; //熒光點(diǎn)坐標(biāo)
public long mStartTime; //開(kāi)始時(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ā)光閃亮,后來(lái)隨著半徑逐漸變小,亮度逐漸減弱。
光亮效果我們可以通過(guò)RadialGradient類(lèi)渲染來(lái)實(shí)現(xiàn),同時(shí)我們可以通過(guò)逐漸改變半徑大小,來(lái)讓熒光點(diǎn)看起來(lái)慢慢縮小。
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ā)光的效果,接下來(lái)我們要實(shí)現(xiàn)的是一堆熒光點(diǎn),為了讓熒光效果看起來(lái)自然,我們當(dāng)然不能同時(shí)產(chǎn)生一堆熒光點(diǎn),我們要造成一種“隨機(jī)”的效果,即隨機(jī)的產(chǎn)生的時(shí)機(jī),隨機(jī)的數(shù)量,隨機(jī)的大小,隨機(jī)的坐標(biāo)。
通過(guò)隨機(jī)數(shù),產(chǎn)生隨機(jī)數(shù)量的熒光點(diǎn),這時(shí)候熒光點(diǎn)的坐標(biāo)和半徑也是隨機(jī)生成的(詳見(jiàn)熒光點(diǎn)類(lèi)的構(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;
}
碼完,比較簡(jiǎn)單,如有錯(cuò)漏,歡迎指正
代碼傳送門(mén):Android實(shí)現(xiàn)熒光效果
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
神奇的listView實(shí)現(xiàn)自動(dòng)顯示隱藏布局Android代碼
這篇文章主要介紹了神奇的listView實(shí)現(xiàn)自動(dòng)顯示隱藏布局Android代碼實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09
Android Jetpack組件支持庫(kù)DataBinding與ViewModel與LiveData及Room
Jetpack是一個(gè)由多個(gè)技術(shù)庫(kù)組成的套件,可幫助開(kāi)發(fā)者遵循最佳做法,減少樣板代碼并編寫(xiě)可在各種Android版本和設(shè)備中一致運(yùn)行的代碼,讓開(kāi)發(fā)者精力集中編寫(xiě)重要的代碼2022-09-09
Android時(shí)間日期拾取器學(xué)習(xí)使用(DatePicker、TimePicker)
這篇文章主要為大家詳細(xì)介紹了Android提供的DatePicker日期拾取器和TimePicker時(shí)間拾取器的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-02-02
Android實(shí)現(xiàn)開(kāi)機(jī)自動(dòng)啟動(dòng)Service或app的方法
這篇文章主要介紹了Android實(shí)現(xiàn)開(kāi)機(jī)自動(dòng)啟動(dòng)Service或app的方法,結(jié)合實(shí)例形式分析了Android開(kāi)機(jī)自啟動(dòng)程序的具體步驟與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2016-07-07
使用Android WebSocket實(shí)現(xiàn)即時(shí)通訊功能
即時(shí)通訊(Instant Messaging)最重要的毫無(wú)疑問(wèn)就是即時(shí),不能有明顯的延遲,要實(shí)現(xiàn)IM的功能其實(shí)并不難,目前有很多第三方,比如極光的JMessage,都比較容易實(shí)現(xiàn)。本文通過(guò)實(shí)例代碼給大家分享Android WebSocket實(shí)現(xiàn)即時(shí)通訊功能,一起看看吧2019-10-10
Android 自定義 View 中使用 Spannable的實(shí)例詳解
這篇文章主要介紹了Android 自定義 View 中使用 Spannable的相關(guān)知識(shí),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05
Android Bluetooth藍(lán)牙技術(shù)初體驗(yàn)
這篇文章主要介紹了Android Bluetooth藍(lán)牙技術(shù)初體驗(yàn)的相關(guān)資料,需要的朋友可以參考下2016-02-02

