假期结束,各位收收心,来看看今天推荐给大家的一个SearchView动画库吧,简直酷炫。CJJ同学牺牲了陪伴女友(好像并没有)游玩的时间,假期就宅在家写这个,这份专注与努力,令人钦佩,必须向各位推荐一下他的最新成果呀~
先来看看各个动画的实现效果:
设计者:Nick
实现类:JJDotGoPathController
设计者:Oleg Frolov
实现类:JJScaleCircleAndTailController
设计者:sandeep virk
实现类:JJBarWithErrorIconController
设计者:Jurre Houtkamp
实现类:JJScaleCircleAndTailController
设计者:Rahul Bhosale
实现类:JJChangeArrowController
设计者:Nicolás J. Engler
实现类:JJCircleToLineAlphaController
设计者:Boris Kirov
实现类:JJCircleToBarController
设计者:Anish Chandran
实现类:JJCircleToSimpleLineController
设计者:Antonio Di Nardo
实现类:这个之前已在作者另一个项目中实现
https://github.com/android-cjj/MaterialSearchView
使用非常简单,有兴趣的点击阅读原文去GitHub项目主页了解,以下是CJJ同学的更多实现思路介绍。
立马进入主题,几乎每个App都有搜索功能,然而形式千篇一律。举个例子,来看看微信
显示一个搜索的图标,点击跳到另一个界面,输入要搜索的内容
现在大部分App都是这种方式了。我是希望能有App把这个功能做得酷炫点,毕竟它也是用户经常要用到的,给用户良好的体验还是很重要的。
为此,我实现了别人设计的一些SearchView酷炫效果,可能不是很精致,你就勉强看看吧。
如果你看完上面那些动画,喜欢上它,想知道他们是怎么实现的,没问题,这就手把手教你撩一个绚丽的SearchViewAnim,呵呵,有点吹大了,讲讲我怎么实现的吧。
仔细观察第一个动画效果(JJDotGoPathController)
是由一个圆圈和一条直线(尾巴)构成的,开始动画时,尾巴慢慢消失成一点,然后这一点(dot) 进入圆圈内时,泛起波纹,在圈内四处逗留,然后在圆圈中心点停留闪烁,短暂地思考了下人生,又冲出去乖乖做一条尾巴。
咳,这是一个顿悟生命的dot啊!
相信大家通过我形象的描述已经知道效果是怎样了,现在就把刚刚的描叙画出来吧。
重写onDraw(Canvas canvas)
方法,利用画笔Paint在画布Canvas上绘制一个普通的的视图,如下:
这里有两种画法:
1.横向画圆、画直线后,旋转画布45度
canvas.rotate(45, cx, cy);
canvas.drawLine(cx + cr, cy, cx + cr * 2, cy, paint);
canvas.drawCircle(cx, cy, cr, paint);
2.直接算出坐标点绘制
canvas.drawCircle(cx, cy, cr, paint);
canvas.drawLine(cx + cr * sign, cy + cr * sign, scx, cy + cr * 2 * sign, paint);
这一步比较简单,就不多说了。
因为运行轨迹是固定的,我们把经过的路径设置给Path,再构造PathMeasure
函数(不知道PathMeasure用法的同学自己搜索学习),使用getLength
可获取dot运行路径的长度,getPosTan
可根据distance获取dot的坐标点pos[].
写成代码就是:
//创建0~mPathMeasure.getLength()的过度动画值
ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, mPathMeasure.getLength());
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
mPro = (float) valueAnimator.getAnimatedValue();
if (null != pathMeasure)
//获取当前点坐标保存到mPos[]
pathMeasure.getPosTan(mPro, mPos, null);
//调用ondraw()函数
getSearchView().invalidate();
}
});
至于dot进入圈圈时泛起的波浪效果,其实就是曲线的不断扩大而已,这里我们可以利用贝塞尔函数quadTo()
,不断改变控制点来实现该效果。
(3)收尾Reset
因为结束动画之后,视图和开始时一样,所以我们并不需要绘制Reset时的动画,只需重置状态就可以了,在有些情况下,比如动画停止后是箭头的效果,就需要逆向绘制SearchView的过程了。
其他动画效果也是这样,一步一步把复杂的效果简化,最后你发现无非就是画线、画曲线、画弧、画圆这些,我就偷个懒,不讲剩下效果的的实现方式了,自己看看源码,可能比我吹水有用的多。
写这些花费的时间、精力还是挺多的,因为需要一些数学计算(我数学烂)和不断的调试才能绘制满意的效果,所以建议如果项目需要,可以在别人实现的轮子上改改就好。我们都知道,一个App只能有一种风格,所以加入很多样式的动画是没必要的,修改一种适合自己的就好。
水平有限及写的随意,该库还是有不少问题,也希望你能PR,一起来完善它。
如果你喜欢这个东东的话,可以关注我github
https://github.com/android-cjj
也可以关注我微博Android_CJJ
http://weibo.com/chenjijun2011
点击阅读原文,可直接访问该项目GitHub地址。