Android实现锁屏荧光效果
作者:Lin_Zero 发布时间:2023-09-02 03:12:03
标签:Android,锁屏,荧光
前言
这是几个月前写的博文,睡前看了觉得有些敷衍,还是改了再发吧。
之前的博客做了个锁屏应用,在以前各种酷炫的锁屏效果是很流行的,有时候会去锁屏市场看看哪些自己喜欢的特效,发现有个很酷炫的荧光解锁的效果,于是想着能否自己实现一下。
锁屏效果:
原理:
锁屏的原理在前些篇章已经有做介绍了,这里主要讲荧光这种效果的实现。
原理要点:
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;
}
码完,比较简单,如有错漏,欢迎指正
代码传送门:Android实现荧光效果
来源:https://blog.csdn.net/z82367825/article/details/52226113
0
投稿
猜你喜欢
- 这个东西我已经用了有段时间了,从开始写文章就在用这个,主要原因还是因为我比较懒。懒得去寻找图片,同时又怕万一惹来版权争议。。。跟我所有的文章
- 1. 概述官方JavaDocsApi: javax.swing.JPanelJPanel,面板。JPanel 是在开发中使用频率非常高的一般
- 用DataFormatString格式化GridView在 GridView里面显示数据,要显示的数据有好多位小数,就想让它只显示两位小数,
- 序言for循环语句是java循环语句中最常用的循环语句,一般用在循环次数已知的情况下使用。for循环语句的语法格式如下:java语言 for
- namespace ConsoleApplication1{ using System; &n
- 方法的递归调用1. 基本介绍:简单地说,递归就是方法自己调用自己,每次调用时传入不同的变量,递归有助于编程者解决复杂问题的同时让代码变得简洁
- /// <summary> /// 队列多线程,T 代表处理的单个类型~&nbs
- 前言:使用 interrupt 来通知线程停止运行,而不是强制停止!普通情况停止线程public class Right
- 前言文件上传是项目开发中最常见的功能之一 ,SpringMVC 可以很好的支持文件上传,但是SpringMVC上下文中默认没有装配Multi
- (1)不需要传递参数,也不需要返回参数ThreadStart是一个委托,这个委托的定义为void ThreadStart(),没有参数与返回
- 这篇文章写的非常好,深入浅出,关键还是一位大三学生自己剖析的心得。这是我喜欢此文的原因。下面请看正文:作为一个大三的预备程序员,我学习and
- 我们在代码中经常使用using保障非托管资源的释放 static void Main(string[] args){
- 本文所述实例为使用伪随机数进行用户密码加密,这段代码为核心部分主要代码,需要配合其它的程序实现,感兴趣的读者可以自己进一步加以完善,不费话了
- C# 匿名函数、lambda表达式、Linq查询一、匿名函数的使用匿名函数是一个“内联”语句或表达式
- 什么是雪花算法雪花算法的本质为生成一个64位长度的具有自增性的分布式全局唯一id。在64bits中,会对不同段的位进行划分。可分为:符号段时
- java对象拷贝详解及实例Java赋值是复制对象引用,如果我们想要得到一个对象的副本,使用赋值操作是无法达到目的的:@Testpublic
- 本文实例为大家分享了java实现学生成绩管理系统的具体代码,供大家参考,具体内容如下/* *@copyright by LzyRa
- 网上的操作方式是我没有进行尝试,感兴趣的可以试试nohup java -Dserver.port=8848 -Dlogging.level.
- 1.以G71列车为例,首先对车次站台进行占位编码(从1开始到最后一站递加)对以上占位简单描述以下:G71总共18个站点那么我们的单个座位的座
- /// <summary> /// 转义字符