android 字体荧光效果,Android实现锁屏荧光效果

前言

这是几个月前写的博文,睡前看了觉得有些敷衍,还是改了再发吧。

之前的博客做了个锁屏应用,在以前各种酷炫的锁屏效果是很流行的,有时候会去锁屏市场看看哪些自己喜欢的特效,发现有个很酷炫的荧光解锁的效果,于是想着能否自己实现一下。

锁屏效果:

bf0ee175c2ddf14074e7795e36306e2b.gif

原理:

锁屏的原理在前些篇章已经有做介绍了,这里主要讲荧光这种效果的实现。

原理要点:

1)关于荧光点,每一个荧光店都是我们一个对象实体,因此我们将其单独构造为一个类,它具有自己的一些属性,比如荧光开始时间,荧光点的半径,荧光点的生命周期等。

/**

* 荧光点

*/

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(); //减速

/**

* 构造方法

*/

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)关于荧光发光的实现

从锁屏主题的效果我们可以看到,荧光点都是先发光闪亮,后来随着半径逐渐变小,亮度逐渐减弱。

光亮效果我们可以通过RadialGradient类渲染来实现,同时我们可以通过逐渐改变半径大小,来让荧光点看起来慢慢缩小。

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)关于荧光点错落闪亮的效果

实现了一个荧光点如何发光的效果,接下来我们要实现的是一堆荧光点,为了让荧光效果看起来自然,我们当然不能同时产生一堆荧光点,我们要造成一种“随机”的效果,即随机的产生的时机,随机的数量,随机的大小,随机的坐标。

通过随机数,产生随机数量的荧光点,这时候荧光点的坐标和半径也是随机生成的(详见荧光点类的构造方法)

4)关于逻辑处理

逻辑的处理就很简单了,我们只需要在onTouchEvent()方法里处理触摸事件,生成随机的荧光点就行了。

@Override

public boolean onTouchEvent(MotionEvent event) {

int action = event.getAction();

mTouchPoint.x = event.getX();

mTouchPoint.y = event.getY();

switch (action){

//手指按下的时候,在手指附近区域生成荧光点

case MotionEvent.ACTION_DOWN:

mStartPoint.x = mTouchPoint.x;

mStartPoint.y = mTouchPoint.y;

createRandomPoints();

invalidate();

break;

//手指移动,继续生成荧光点

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;

}

码完,比较简单,如有错漏,欢迎指正

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值