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


猜你喜欢
- 前言日志接口(slf4j)slf4j是对所有日志框架制定的一种规范、标准、接口,并不是一个框架的具体的实现,因为接口并不能独立使用,需要和具
- 一、Intent的用途Intent主要有以下几种重要用途: 1. 启动Activity:可以将Intent对象传递给startActivit
- DebugLZQ在网上搜索相关文件加密的程序,发现给出的基本都是针对“字符创”、“文本”的加密与解密。对视频文件、图片等一般文件的加密解密程
- ELK是三款软件的简称,分别是Elasticsearch、Logstash、Kibana组成,在发展的过程中,又有新成员Beats的加入,所
- 本篇将从以下几个方面讲述反射的知识:class 的使用方法的反射构造函数的反射成员变量的反射一、什么是class类在面向对象的世界里,万物皆
- 接着上一篇继续,老铁们1.检查数组的有序性给定一个整型数组, 判断是否该数组是有序的(升序) public static bo
- 前言该篇介绍的内容如题,就是利用redis实现接口的限流( 某时间范围内 最大的访问次数 ) 。正文 惯例,
- 随着时间的推移现在的软件要求显示的内容越来越多,所以要在小的屏幕上能够更好的显示更多的内容,首先我们会想到底部菜单栏,但是有时候想网易新闻要
- 这一节我们先写一个简单点的Demo来测试易宝支付的流程,熟悉这个流程后,再做实际的开发,因为是一个Demo,所以我没有考虑一些设计模式的东西
- 前言众所周知,RxJava2 中当链式调用中抛出异常时,如果没有对应的 Consumer 去处理异常,则这个异常会被抛出到虚拟机中去,And
- ajax简介 Ajax 即“Asynchronous Javascript An
- 文件资源操作Spring 定义了一个 org.springframework.core.io.Resource 接口,Resource 接口
- 单个异常捕捉val handler = CoroutineExceptionHandler { coroutineContext, thro
- 1. C#实现复数类我们在进行信号分析的时候,难免会使用到复数。但是遗憾的是,C#没有自带的复数类,以下提供了一种复数类的构建方法。复数相比
- 使用flatMap列出子目录前面已经看到如何列出指定目录下的文件了。我们再来看下如何遍历指定目录的直接子目录(深度为1),先实现一个简单的版
- > 因为我的工作要用kotlin所以今天在这里给大家总结一下关于全局语言切换的kotlin语言实现实现,很简单,希望在这里可以帮助到有
- 引言异步蓝图节点:在蓝图节点的右上角有时钟图标。注意:异步节点可以在EventGraph/Macros中使用,但是无法在蓝图函数中使用。AI
- 一、什么是外观模式定义:为子系统中的一组接口提供一个一致的界面,用来访问子系统中的一群接口。外观模式组成:Facade:负责子系统的的封装调
- 开发一个需要常住后台的App其实是一件非常头疼的事情,不仅要应对国内各大厂商的ROM,还需要应对各类的安全管家...虽然不断的研究各式各样的
- 不论你是否关注,Java Web应用都或多或少的使用了线程池来处理请求。线程池的实现细节可能会被忽视,但是有关于线程池的使用和调优迟早是需要