Android-荧光效果
来源:互联网 发布:上海市人口普查数据 编辑:程序博客网 时间:2024/04/30 03:55
前言:
这是几个月前写的博文,睡前看了觉得有些敷衍,还是改了再发吧。
之前的博客做了个锁屏应用,在以前各种酷炫的锁屏效果是很流行的,有时候会去锁屏市场看看哪些自己喜欢的特效,发现有个很酷炫的荧光解锁的效果,于是想着能否自己实现一下。
锁屏效果:
原理:
锁屏的原理在前些篇章已经有做介绍了,这里主要讲荧光这种效果的实现。
原理要点:
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; }
码完,比较简单,如有错漏,欢迎指正
代码传送门:http://download.csdn.net/download/z82367825/9460355
2 0
- Android-荧光效果
- Android ProgressBar 进度条荧光效果
- Android ProgressBar 进度条荧光效果
- Android ProgressBar 进度条荧光效果
- 荧光效果
- 取消Android ListView 下拉到两端发荧光的效果
- 【Android图像处理】荧光绿滤镜(效果)
- 荧光字效果
- Android关闭ListView,ScrollView等自带的蓝色荧光效果
- 荧光棒
- 【编程游戏】贺岁霓虹灯。(参观187楼xuyiazl的霓虹灯,荧光效果目前只在IE有效)
- 原子荧光光谱仪整理
- 演唱会荧光棒场控原理
- “纳米荧光炸弹”诞生记
- IV11荧光数码管显示器制作
- 关于荧光共定位分析
- android效果
- 《让荧光舞一直挥舞下去》
- 【动态规划】Vijos P1037 搭建双塔
- 【动态规划】Vijos P1104 采药(NOIP2005普及组第三题)
- 【动态规划】Vijos P1313 金明的预算方案(NOIP提高组2006第二题)
- html改成jsp页面,中文出现乱码
- hadoop HA模式重新格式化出现错误:INFO ipc.Client: Retrying connect to server:***:8485. Already
- Android-荧光效果
- 【动态规划】【归并】Vijos P1412 多人背包
- 【STL】【模拟】Codeforces 696A Lorenzo Von Matterhorn
- 【动态规划】【二分】【最长上升子序列】Vijos P1028 魔族密码
- 【动态规划】【最长公共子序列】Vijos P1111 小胖的水果
- 【动态规划】Vijos P1680 距离
- 【动态规划】Vijos P1616 迎接仪式
- POJ3666 离散化的dp
- 【动态规划】Vijos P1121 马拦过河卒