这篇文章是关于 android 飘心动画(直播点赞)效果
相关知识点的整理,应为我对动画相关的部分,不是很熟悉,所以对于第一篇文章上面所涉及的只是进行了总结和整理。
1.android 自定义view之 onMeasure()
可以说重载onMeasure(),onLayout(),onDraw()三个函数构建了自定义View的外观形象。再加上onTouchEvent()等重载视图的行为,可以构建任何我们需要的可感知到的自定义View。
其中mode的解释说明:
mode共有三种情况,取值分别为MeasureSpec.UNSPECIFIED, MeasureSpec.EXACTLY, MeasureSpec.AT_MOST。
MeasureSpec.EXACTLY是精确尺寸,当我们将控件的layout_width或layout_height指定为具体数值时如andorid:layout_width=”50dip”,或者为FILL_PARENT是,都是控件大小已经确定的情况,都是精确尺寸。
MeasureSpec.AT_MOST是最大尺寸,当控件的layout_width或layout_height指定为WRAP_CONTENT时,控件大小一般随着控件的子空间或内容进行变化,此时控件尺寸只要不超过父控件允许的最大尺寸即可。因此,此时的mode是AT_MOST,size给出了父控件允许的最大尺寸。
MeasureSpec.UNSPECIFIED是未指定尺寸,这种情况不多,一般都是父控件是AdapterView,通过measure方法传入的模式。
因此,在重写onMeasure方法时要根据模式不同进行尺寸计算。
下面代码就是一种比较典型的方式:
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
setMeasuredDimension(getMeasuredLength(widthMeasureSpec, true), getMeasuredLength(heightMeasureSpec, false));
}
private int getMeasuredLength(int length, boolean isWidth) {
int specMode = MeasureSpec.getMode(length);
int specSize = MeasureSpec.getSize(length);
int size;
int padding = isWidth ? getPaddingLeft() + getPaddingRight()
: getPaddingTop() + getPaddingBottom();
if (specMode == MeasureSpec.EXACTLY) {
size = specSize;
} else {
size = isWidth ? padding + mWave.length / 4 : DEFAULT_HEIGHT
+ padding;
if (specMode == MeasureSpec.AT_MOST) {
size = Math.min(size, specSize);
}
}
return size;
}
相关链接地址:http://blog.csdn.net/pi9nc/article/details/18764863
2.android 动画插值器
2.1插值器的文字解释:
http://blog.csdn.net/jason0539/article/details/16370405
Interpolator用于动画中的时间插值,其作用就是把0到1的浮点值变化映射到另一个浮点值变化。
(1) AccelerateDecelerateInterpolator 在动画开始与结束的地方速率改变比较慢,在中间的时候加速
(2) AccelerateInterpolator 在动画开始的地方速率改变比较慢,然后开始加速
(3) AnticipateInterpolator 开始的时候向后然后向前甩
(4) AnticipateOvershootInterpolator 开始的时候向后然后向前甩一定值后返回最后的值
(5) BounceInterpolator 动画结束的时候弹起
(6) CycleInterpolator 动画循环播放特定的次数,速率改变沿着正弦曲线
(7) DecelerateInterpolator 在动画开始的地方快然后慢
(8) LinearInterpolator 以常量速率改变
(9.) OvershootInterpolator 向前甩一定值后再回到原来位置
2.2插值器的图表解释:
http://www.cnblogs.com/mengdd/p/3346003.html
2.3插值器的简单使用(最好自己动手写一遍)
https://github.com/walfud/HelloInterpolator
2.4自定义插值器(高级用法):
http://www.cnblogs.com/wondertwo/p/5327586.html
3.android 动画 path 和 pathMeasure
Path 的基础讲解:
http://blog.csdn.net/cquwentao/article/details/51363475
Path 和pathMeasure 的进阶:
http://blog.csdn.net/cquwentao/article/details/51436852
PathMeasure
PathMeasure主要用来测量path,通过它,我们可以得到路径上特定的点的坐标等等。先看看他的基本方法。
(1) 构造方法
public PathMeasure()
public PathMeasure(Path path, boolean forceClosed)
如上,有两个方法,第一个就不讲解了,第二个方法中有两个参数;
path:需要测量的path
forceClosed:是否关闭path
(2) setPath
public void setPath(Path path, boolean forceClosed)
这里就是指定需要测量的path,基本和上面的第二个构造函数类似。
(3) getLength
返回当前path的总长度。
(4) getMatrix
public boolean getMatrix(float distance, Matrix matrix, int flags)
这个方法和上面的其实类似,只是他返回的是一个处理好的matrix,但是这个matrix是以左上角作为旋转点,所以需要将这个点移动到中心点。
其中还多了一个参数flags,指的是这个martrix需要什么信息。flags的值有如下两个
PathMeasure.POSITION_MATRIX_FLAG:位置信息
pathMeasure.TANGENT_MATRIX_FLAG:切边信息,方位角信息,使得图片按path旋转。
4.线程安全的累加类 atomicinteger
atomicinteger类的作用:特别适用于高并发访问。
AtomicInteger,一个提供原子操作的Integer的类。在Java语言中,++i和i++操作并不是线程安全的,在使用的时候,不可避免的会用到synchronized关键字。而AtomicInteger则通过一种线程安全的加减操作接口。
相关地址:
http://www.cnblogs.com/Gordon-YangYiBao/archive/2012/08/07/2626422.html