1.Android 3步搞定事件分发机制,再也不用担心onTouch和onTouchEvent&dispatchTouchEvent
https://blog.csdn.net/WHB20081815/article/details/62888575
2.Android 滑动冲突的完美解决方案 listview和scroView
https://blog.csdn.net/WHB20081815/article/details/88617041
3.Android 深入理解 View 的绘制流程和机制
https://blog.csdn.net/WHB20081815/article/details/62236641
4.Android 5.0 6.0 以及7.0新特性 MD风格 敏感权限 文件访问
https://blog.csdn.net/WHB20081815/article/details/70244065
5.Android 万能适配方案和UI屏幕适配 不同分辨率 最全面 最易懂的
https://blog.csdn.net/WHB20081815/article/details/76937801
6.Android 2分钟刷Android 8.0系统 和 8.0适配 完美方案
https://blog.csdn.net/WHB20081815/article/details/75669925
7.Android快速理解Activity、View及Window&WindowManager之间关系
https://blog.csdn.net/WHB20081815/article/details/62419059
3.0以前2种动画方式:
两种实现动画效果的方式,逐帧动画(frame-by-frame animation)和补间动画(tweened animation)。
1.逐帧动画的工作原理很简单,其实就是将一个完整的动画拆分成一张张单独的图片,然后通过顺序的播放排列好的图片来实现,类似电影
2.补间动画则是可以对View进行一系列的动画操作,包括淡入淡出、缩放、平移、旋转四种。
Android开发团队决定在3.0版本当中引入属性动画这个功能,它的灵活性更好
1.可以不仅仅操作view,还可以操作里面的对象
2.对View的背景色进行动态地改变
3.补间动画还有一个致命的缺陷,就是它只是改变了View的显示效果而已,而不会真正去改变View的属性
ValueAnimator是整个属性动画机制当中最核心的一个类,而初始值和结束值之间的动画过渡就是由ValueAnimator这个类来负责计算的。除此之外,ValueAnimator还负责管理动画的播放次数、播放模式、以及对动画设置监听器等,确实是一个非常重要的类。
TypeEvaluator(估值器) :替代ValueAnimator.ofFloat()方法就是实现了初始值与结束值之间的平滑过度
插值器(Interpolator):anim.setInterpolator(new DecelerateAccelerateInterpolator());
public final class ObjectAnimator extends ValueAnimator
public class ValueAnimator extends Animator
ValueAnimator用法:操作一个对象
Point point1 = new Point(0, 0);
Point point2 = new Point(300, 300);
ValueAnimator anim = ValueAnimator.ofObject(new PointEvaluator(), point1, point2);
好处:不需要操作的对象的属性一定要有getter和setter方法,你可以自己根据当前动画的计算值,来操作任何属性
mBlueBall
public void verticalRun(View view)
{
ValueAnimator animator = ValueAnimator.ofFloat(0, mScreenHeight
- mBlueBall.getHeight());
animator.setTarget(mBlueBall);
animator.setDuration(1000).start();
}
ObjectAnimator 用法:可以操作属性
当过渡的效果不满足,自定定义估值器:public class PointEvaluator implements TypeEvaluator {
ObjectAnimator moveIn = ObjectAnimator.ofFloat(this, "translationX", -500f, 0f);
ObjectAnimator anim2 = ObjectAnimator.ofObject(this, "color", new ColorEvaluator(),
"#0000FF", "#FF0000");
AnimatorSet
/**用于把不同的动画进行组合*/
AnimatorSet animSet = new AnimatorSet();
animSet.play(anim).with(anim2).before(moveIn);//属性动画的组合
实现一个动画更改多个效果:使用propertyValuesHolder:
可以用animSet.play(anim).with(anim2)替代
public void propertyValuesHolder(View view)
{
PropertyValuesHolder pvhX = PropertyValuesHolder.ofFloat("alpha", 1f,
0f, 1f);
PropertyValuesHolder pvhY = PropertyValuesHolder.ofFloat("scaleX", 1f,
0, 1f);
PropertyValuesHolder pvhZ = PropertyValuesHolder.ofFloat("scaleY", 1f,
0, 1f);
ObjectAnimator.ofPropertyValuesHolder(view, pvhX, pvhY,pvhZ).setDuration(1000).start();
}
//用法2
PropertyValuesHolder pv1 = PropertyValuesHolder.ofFloat("scaleX", 1, 0);
PropertyValuesHolder pv2 = PropertyValuesHolder.ofFloat("scaleY", 1, 0);
PropertyValuesHolder alph = PropertyValuesHolder.ofFloat("alpha", 0, 1);
ObjectAnimator ob1 = ObjectAnimator.ofPropertyValuesHolder(rl, pv1);
ObjectAnimator oa = ObjectAnimator.ofPropertyValuesHolder(rl, alph);
ObjectAnimator oa1 = ObjectAnimator.ofPropertyValuesHolder(rl, pv2);
AnimatorSet animSet = new AnimatorSet();
animSet.play(ob1).after(oa);
animSet.play(ob1).with(oa1);
animSet.setDuration(4000);
animSet.start();
/***
* PropertyValuesHolder的用法
* @param animType
*/
private void startParentScaleAnim(final int animType) {
PropertyValuesHolder pv1 = PropertyValuesHolder.ofFloat("scaleX", 1, 0);
PropertyValuesHolder pv2 = PropertyValuesHolder.ofFloat("scaleY", 1, 0);
//方式One
ObjectAnimator.ofPropertyValuesHolder(mBlueBall, pv2,pv1).setDuration(5000).start();
//two
ObjectAnimator ob1 = ObjectAnimator.ofPropertyValuesHolder(mBlueBall, pv1);
ObjectAnimator oa1 = ObjectAnimator.ofPropertyValuesHolder(mBlueBall, pv2);
AnimatorSet animSet = new AnimatorSet();
animSet.play(ob1).with(oa1);
animSet.setDuration(5000);
animSet.start();
}
动画的监听
/**添加监听事件
* new AnimatorListenerAdapter 好处,可以只监听某个动画的事件
* new Animator.AnimatorListener 所有动画的监听
* */
moveIn.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationCancel(Animator animation) {
super.onAnimationCancel(animation);
}
moveIn.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
ViewPropertyAnimator
大家注意到,在使用ViewPropertyAnimator时,我们自始至终没有调用过start()方法,这是因为新的接口中使用了隐式启动动画的功能,只要我们将动画定义完成之后,动画就会自动启动。并且这个机制对于组合动画也同样有效,只要我们不断地连缀新的方法,那么动画就不会立刻执行,等到所有在ViewPropertyAnimator上设置的方法都执行完毕后,动画就会自动启动。当然如果不想使用这一默认机制的话,我们也可以显式地调用start()方法来启动动画。
ViewPropertyAnimator的所有接口都是使用连缀的语法来设计的,每个方法的返回值都是它自身的实例,因此调用完一个方法之后可以直接连缀调用它的另一个方法,这样把所有的功能都串接起来,我们甚至可以仅通过一行代码就完成任意复杂度的动画功能。
AS源代码地址:不知道为什么传不上