1.
View Animation£¨Tween Animation£©
View Animation£¨Tween Animation£©£º²¹¼ä¶¯»£¬¸ø³öÁ½¸ö¹Ø¼üÖ¡£¬Í¨¹ýһЩËã·¨½«¸ø¶¨ÊôÐÔÖµÔÚ¸ø¶¨µÄʱ¼äÄÚÔÚÁ½¸ö¹Ø¼üÖ¡¼ä½¥±ä¡£
View animationÖ»ÄÜÓ¦ÓÃÓÚView¶ÔÏ󣬶øÇÒÖ»Ö§³ÖÒ»²¿·ÖÊôÐÔ£¬ÈçÖ§³ÖËõ·ÅÐýת¶ø²»Ö§³Ö±³¾°ÑÕÉ«µÄ¸Ä±ä¡£
¶øÇÒ¶ÔÓÚView animation£¬ËüÖ»ÊǸıäÁËView¶ÔÏó»æÖƵÄλÖ㬶øÃ»ÓиıäView¶ÔÏó±¾Éí£¬±ÈÈ磬ÄãÓÐÒ»¸öButton£¬×ø±ê£¨100,100£©£¬Width:200,Height:50£¬¶øÄãÓÐÒ»¸ö¶¯»Ê¹Æä±äΪWidth£º100£¬Height£º100£¬Äã»á·¢ÏÖ¶¯»¹ý³ÌÖд¥·¢°´Å¥µã»÷µÄÇøÓòÈÔÊÇ(100,100)-(300,150)¡£
View Animation¾ÍÊÇһϵÁÐViewÐÎ×´µÄ±ä»»£¬Èç´óСµÄËõ·Å£¬Í¸Ã÷¶ÈµÄ¸Ä±ä£¬Î»Öõĸı䣬¶¯»µÄ¶¨Òå¼È¿ÉÒÔÓôúÂ붨ÒåÒ²¿ÉÒÔÓÃXML¶¨Ò壬µ±È»£¬½¨ÒéÓÃXML¶¨Òå¡£
¿ÉÒÔ¸øÒ»¸öViewͬʱÉèÖöà¸ö¶¯»£¬±ÈÈç´Ó͸Ã÷ÖÁ²»Í¸Ã÷µÄµÈëЧ¹û£¬Óë´ÓСµ½´óµÄ·Å´óЧ¹û£¬ÕâЩ¶¯»¿ÉÒÔͬʱ½øÐУ¬Ò²¿ÉÒÔÔÚÒ»¸öÍê³ÉÖ®ºó¿ªÊ¼ÁíÒ»¸ö¡£
ÓÃXML¶¨ÒåµÄ¶¯»·ÅÔÚ/res/anim/Îļþ¼ÐÄÚ£¬XMLÎļþµÄ¸ùÔªËØ¿ÉÒÔΪ<alpha>,<scale>,<translate>,<rotate>,interpolatorÔªËØ»ò<set>(±íʾÒÔÉϼ¸¸ö¶¯»µÄ¼¯ºÏ£¬set¿ÉÒÔǶÌ×)¡£Ä¬ÈÏÇé¿öÏ£¬ËùÓж¯»ÊÇͬʱ½øÐеģ¬¿ÉÒÔͨ¹ýstartOffsetÊôÐÔÉèÖø÷¸ö¶¯»µÄ¿ªÊ¼Æ«ÒÆ£¨¿ªÊ¼Ê±¼ä£©À´´ïµ½¶¯»Ë³Ðò²¥·ÅµÄЧ¹û¡£
¿ÉÒÔͨ¹ýÉèÖÃinterpolatorÊôÐԸı䶯»½¥±äµÄ·½Ê½£¬ÈçAccelerateInterpolator£¬¿ªÊ¼Ê±Âý£¬È»ºóÖ𽥼ӿ졣ĬÈÏΪAccelerateDecelerateInterpolator¡£
¶¨ÒåºÃ¶¯»µÄXMLÎļþºó£¬¿ÉÒÔͨ¹ýÀàËÆÏÂÃæµÄ´úÂë¶ÔÖ¸¶¨ViewÓ¦Óö¯»¡£
ImageView spaceshipImage = (ImageView)findViewById(R.id.spaceshipImage); Animation hyperspaceJumpAnimation=AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump); spaceshipImage.startAnimation(hyperspaceJumpAnimation); |
2. Drawable Animation£¨Frame Animation£©
Drawable Animation£¨Frame Animation£©£ºÖ¡¶¯»£¬¾ÍÏñGIFͼƬ£¬Í¨¹ýһϵÁÐDrawableÒÀ´ÎÏÔʾÀ´Ä£Ä⶯»µÄЧ¹û¡£ÔÚXMLÖе͍Ò巽ʽÈçÏ£º
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
2 android:oneshot="true">
3 <item android:drawable="@drawable/rocket_thrust1"
android:duration="200" />
5 <item android:drawable="@drawable/rocket_thrust2"
android:duration="200" />
6 <item android:drawable="@drawable/rocket_thrust3"
android:duration="200" />
7 </animation-list>
|
±ØÐëÒÔ<animation-list>Ϊ¸ùÔªËØ£¬ÒÔ<item>±íʾҪÂÖ»»ÏÔʾµÄͼƬ£¬durationÊôÐÔ±íʾ¸÷ÏîÏÔʾµÄʱ¼ä¡£XMLÎļþÒª·ÅÔÚ/res/drawable/Ŀ¼Ï¡£Ê¾Àý£º
protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.main); imageView = (ImageView) findViewById(R.id.imageView1); imageView.setBackgroundResource(R.drawable.drawable_anim); anim = (AnimationDrawable) imageView.getBackground(); }
public boolean onTouchEvent(MotionEvent event)
{
if (event.getAction() == MotionEvent.ACTION_DOWN)
{
anim.stop();
anim.start();
return true;
}
return super.onTouchEvent(event);
} |
ÎÒÔÚʵÑéÖÐÓöµ½Á½µãÎÊÌ⣺
1.ÒªÔÚ´úÂëÖе÷ÓÃImageviewµÄsetBackgroundResource·½·¨£¬Èç¹ûÖ±½ÓÔÚXML²¼¾ÖÎļþÖÐÉèÖÃÆäsrcÊôÐÔµ±´¥·¢¶¯»Ê±»áFC¡£
2.ÔÚ¶¯»start()֮ǰҪÏÈstop()£¬²»È»ÔÚµÚÒ»´Î¶¯»Ö®ºó»áÍ£ÔÚ×îºóÒ»Ö¡£¬ÕâÑù¶¯»¾ÍÖ»»á´¥·¢Ò»´Î¡£
3.×îºóÒ»µãÊÇSDKÖÐÌáµ½µÄ£¬²»ÒªÔÚonCreateÖе÷ÓÃstart£¬ÒòΪAnimationDrawable»¹Ã»ÓÐÍêÈ«¸úWindowÏà¹ØÁª£¬Èç¹ûÏëÒª½çÃæÏÔʾʱ¾Í¿ªÊ¼¶¯»µÄ»°£¬¿ÉÒÔÔÚonWindowFoucsChanged()Öе÷ÓÃstart()¡£
3. Property Animation
ÊôÐÔ¶¯»£¬Õâ¸öÊÇÔÚAndroid 3.0ÖвÅÒý½øµÄ£¬ÒÔǰѧWPFʱÀïÃæµÄ¶¯»»úÖÆºÃÏñ¾ÍÊÇÕâ¸ö£¬Ëü¸ü¸ÄµÄÊǶÔÏóµÄʵ¼ÊÊôÐÔ£¬ÔÚView
Animation£¨Tween Animation£©ÖУ¬Æä¸Ä±äµÄÊÇViewµÄ»æÖÆÐ§¹û£¬ÕæÕýµÄViewµÄÊôÐÔ±£³Ö²»±ä£¬±ÈÈçÎÞÂÛÄãÔÚ¶Ô»°ÖÐÈçºÎËõ·ÅButtonµÄ´óС£¬ButtonµÄÓÐЧµã»÷ÇøÓò»¹ÊÇûÓÐÓ¦Óö¯»Ê±µÄÇøÓò£¬ÆäλÖÃÓë´óС¶¼²»±ä¡£¶øÔÚProperty
AnimationÖУ¬¸Ä±äµÄÊǶÔÏóµÄʵ¼ÊÊôÐÔ£¬ÈçButtonµÄËõ·Å£¬ButtonµÄλÖÃÓë´óСÊôÐÔÖµ¶¼¸Ä±äÁË¡£¶øÇÒProperty
Animation²»Ö¹¿ÉÒÔÓ¦ÓÃÓÚView£¬»¹¿ÉÒÔÓ¦ÓÃÓÚÈκζÔÏó¡£Property AnimationÖ»ÊDZíʾһ¸öÖµÔÚÒ»¶Îʱ¼äÄڵĸı䣬µ±Öµ¸Ä±äʱҪ×öʲôÊÂÇéÍêÈ«ÊÇÄã×Ô¼º¾ö¶¨µÄ¡£
ÔÚProperty AnimationÖУ¬¿ÉÒÔ¶Ô¶¯»Ó¦ÓÃÒÔÏÂÊôÐÔ£º
1.Duration£º¶¯»µÄ³ÖÐøÊ±¼ä
2.TimeInterpolation£ºÊôÐÔÖµµÄ¼ÆË㷽ʽ£¬ÈçÏÈ¿ìºóÂý
3.TypeEvaluator£º¸ù¾ÝÊôÐԵĿªÊ¼¡¢½áÊøÖµÓëTimeInterpolation¼ÆËã³öµÄÒò×Ó¼ÆËã³öµ±Ç°Ê±¼äµÄÊôÐÔÖµ
4.Repeat Country and behavoir£ºÖظ´´ÎÊýÓ뷽ʽ£¬Èç²¥·Å3´Î¡¢5´Î¡¢ÎÞÏÞÑ»·£¬¿ÉÒԴ˶¯»Ò»Ö±Öظ´£¬»ò²¥·ÅÍêʱÔÙ·´Ïò²¥·Å
5.Animation sets£º¶¯»¼¯ºÏ£¬¼´¿ÉÒÔͬʱ¶ÔÒ»¸ö¶ÔÏóÓ¦Óü¸¸ö¶¯»£¬ÕâЩ¶¯»¿ÉÒÔͬʱ²¥·ÅÒ²¿ÉÒÔ¶Ô²»Í¬¶¯»ÉèÖò»Í¬¿ªÊ¼Æ«ÒÆ
6.Frame refreash delay£º¶àÉÙʱ¼äË¢ÐÂÒ»´Î£¬¼´Ã¿¸ô¶àÉÙʱ¼ä¼ÆËãÒ»´ÎÊôÐÔÖµ£¬Ä¬ÈÏΪ10ms£¬×îÖÕË¢ÐÂʱ¼ä»¹ÊÜϵͳ½ø³Ìµ÷¶ÈÓëÓ²¼þµÄÓ°Ïì
3.1 Property AnimationµÄ¹¤×÷·½Ê½
¶ÔÓÚÏÂͼµÄ¶¯»£¬Õâ¸ö¶ÔÏóµÄX×ø±êÔÚ40msÄÚ´Ó0ÒÆ¶¯µ½40 pixel.°´Ä¬ÈϵÄ10msË¢ÐÂÒ»´Î£¬Õâ¸ö¶ÔÏó»áÒÆ¶¯4´Î£¬Ã¿´ÎÒÆ¶¯40/4=10pixel¡£

Ò²¿ÉÒԸıäÊôÐÔÖµµÄ¸Ä±ä·½·¨£¬¼´ÉèÖò»Í¬µÄinterpolation£¬ÔÚÏÂͼÖÐÔ˶¯ËÙ¶ÈÏÈÖð½¥Ôö´óÔÙÖð½¥¼õС

ÏÂͼÏÔʾÁËÓëÉÏÊö¶¯»Ïà¹ØµÄ¹Ø¼ü¶ÔÏó

ValueAnimator¼´±íʾһ¸ö¶¯»£¬°üº¬¶¯»µÄ¿ªÊ¼Öµ£¬½áÊøÖµ£¬³ÖÐøÊ±¼äµÈÊôÐÔ¡£
ValueAnimator·â×°ÁËÒ»¸öTimeInterpolator£¬TimeInterpolator¶¨ÒåÁËÊôÐÔÖµÔÚ¿ªÊ¼ÖµÓë½áÊøÖµÖ®¼äµÄ²åÖµ·½·¨¡£
ValueAnimator»¹·â×°ÁËÒ»¸öTypeAnimator£¬¸ù¾Ý¿ªÊ¼¡¢½áÊøÖµÓëTimeIniterpolator¼ÆËãµÃµ½µÄÖµ¼ÆËã³öÊôÐÔÖµ¡£
ValueAnimator¸ù¾Ý¶¯»ÒѽøÐеÄʱ¼ä¸ú¶¯»×Üʱ¼ä£¨duration£©µÄ±È¼ÆËã³öÒ»¸öʱ¼äÒò×Ó£¨0~1£©£¬È»ºó¸ù¾ÝTimeInterpolator¼ÆËã³öÁíÒ»¸öÒò×Ó£¬×îºóTypeAnimatorͨ¹ýÕâ¸öÒò×Ó¼ÆËã³öÊôÐÔÖµ£¬ÈçÉÏÀýÖÐ10msʱ£º
Ê×ÏȼÆËã³öʱ¼äÒò×Ó£¬¼´¾¹ýµÄʱ¼ä°Ù·Ö±È£ºt=10ms/40ms=0.25
¾²åÖµ¼ÆËã(inteplator)ºóµÄ²åÖµÒò×Ó:´óԼΪ0.15£¬ÉÏÊöÀý×ÓÖÐÓÃÁËAccelerateDecelerateInterpolator£¬¼ÆË㹫ʽΪ£¨input¼´ÎªÊ±¼äÒò×Ó£©£º
(Math.cos((input + 1) * Math.PI) / 2.0f) + 0.5f; |
×îºó¸ù¾ÝTypeEvaluator¼ÆËã³öÔÚ10msʱµÄÊôÐÔÖµ£º0.15*£¨40-0£©=6pixel¡£ÉÏÀýÖÐTypeEvaluatorΪFloatEvaluator£¬¼ÆËã·½·¨Îª
£º
public Float evaluate(float fraction, Number startValue, Number endValue) { float startFloat = startValue.floatValue(); return startFloat + fraction * (endValue.floatValue() - startFloat); } |
²ÎÊý·Ö±ðΪÉÏÒ»²½µÄ²åÖµÒò×Ó£¬¿ªÊ¼ÖµÓë½áÊøÖµ¡£
3.2 ValueAnimator
ValueAnimator°üº¬Property Animation¶¯»µÄËùÓкËÐŦÄÜ£¬È綯»Ê±¼ä£¬¿ªÊ¼¡¢½áÊøÊôÐÔÖµ£¬ÏàӦʱ¼äÊôÐÔÖµ¼ÆËã·½·¨µÈ¡£Ó¦ÓÃProperty
AnimationÓÐÁ½¸ö²½¾Û£º
1.¼ÆËãÊôÐÔÖµ
2.¸ù¾ÝÊôÐÔÖµÖ´ÐÐÏàÓ¦µÄ¶¯×÷£¬Èç¸Ä±ä¶ÔÏóµÄijһÊôÐÔ¡£
ValuAnimiatorÖ»Íê³ÉÁ˵ÚÒ»²½¹¤×÷£¬Èç¹ûÒªÍê³ÉµÚ¶þ²½£¬ÐèҪʵÏÖValueAnimator.onUpdateListener½Ó¿Ú£¬È磺
ValueAnimator animation = ValueAnimator.ofFloat(0f, 1f); animation.setDuration(1000); animation.addUpdateListener(new AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { Log.i("update", ((Float) animation.getAnimatedValue()).toString()); } }); animation.setInterpolator(new CycleInterpolator(3)); animation.start(); |
´ËʾÀýÖÐÖ»ÊÇÏòLogcatÊä³öÁËһЩÐÅÏ¢£¬¿ÉÒÔ¸ÄΪÏë×öµÄ¹¤×÷¡£
Animator.AnimatorListener
onAnimationStart() onAnimationEnd()
onAnimationRepeat()
onAnimationCance
|
ValueAnimator.AnimatorUpdateListener
onAnimationUpdate()¡¡¡¡//ͨ¹ý¼àÌýÕâ¸öʼþÔÚÊôÐÔµÄÖµ¸üÐÂʱִÐÐÏàÓ¦µÄ²Ù×÷£¬¶ÔÓÚValueAnimatorÒ»°ãÒª¼àÌý´ËʼþÖ´ÐÐÏàÓ¦µÄ¶¯×÷£¬²»È»AnimationûÒâÒ壨¿ÉÓÃÓÚ¼ÆÊ±£©£¬ÔÚObjectAnimator£¨¼Ì³Ð×ÔValueAnimator£©Öлá×Ô¶¯¸üÐÂÊôÐÔ£¬ÈçÎÞ±ØÒª²»±Ø¼àÌý¡£ÔÚº¯ÊýÖлᴫµÝÒ»¸öValueAnimator²ÎÊý£¬Í¨¹ý´Ë²ÎÊýµÄgetAnimatedValue()È¡µÃµ±Ç°¶¯»ÊôÐÔÖµ¡£
¿ÉÒԼ̳ÐAnimatorListenerAdapter¶ø²»ÊÇʵÏÖAnimatorListener½Ó¿ÚÀ´¼ò»¯²Ù×÷£¬Õâ¸öÀà¶ÔAnimatorListenerÖеĺ¯Êý¶¼¶¨ÒåÁËÒ»¸ö¿Õº¯ÊýÌ壬ÕâÑùÎÒÃǾÍÖ»Óö¨ÒåÏë¼àÌýµÄʼþ¶ø²»ÓÃʵÏÖÿ¸öº¯ÊýÈ´Ö»¶¨ÒåÒ»¿Õº¯ÊýÌå¡£
ObjectAnimator oa=ObjectAnimator.ofFloat(tv, "alpha", 0f, 1f); oa.setDuration(3000); oa.addListener(new AnimatorListenerAdapter(){ public void on AnimationEnd(Animator animation){ Log.i("Animation","end"); } }); oa.start(); |
3.3 ObjectAnimator
¼Ì³Ð×ÔValueAnimator£¬ÒªÖ¸¶¨Ò»¸ö¶ÔÏ󼰸öÔÏóµÄÒ»¸öÊôÐÔ£¬µ±ÊôÐÔÖµ¼ÆËãÍê³Éʱ×Ô¶¯ÉèÖÃΪ¸Ã¶ÔÏóµÄÏàÓ¦ÊôÐÔ£¬¼´Íê³ÉÁËProperty
AnimationµÄÈ«²¿Á½²½²Ù×÷¡£Êµ¼ÊÓ¦ÓÃÖÐÒ»°ã¶¼»áÓÃObjectAnimatorÀ´¸Ä±äijһ¶ÔÏóµÄijһÊôÐÔ£¬µ«ÓÃObjectAnimatorÓÐÒ»¶¨µÄÏÞÖÆ£¬ÒªÏëʹÓÃObjectAnimator£¬Ó¦¸ÃÂú×ãÒÔÏÂÌõ¼þ£º
1. ¶ÔÏóÓ¦¸ÃÓÐÒ»¸ösetterº¯Êý£ºset<PropertyName>£¨ÍÕ·åÃüÃû·¨£©
2. ÈçÉÏÃæµÄÀý×ÓÖУ¬ÏñofFloatÖ®ÀàµÄ¹¤³¡·½·¨£¬µÚÒ»¸ö²ÎÊýΪ¶ÔÏóÃû£¬µÚ¶þ¸öΪÊôÐÔÃû£¬ºóÃæµÄ²ÎÊýΪ¿É±ä²ÎÊý£¬Èç¹ûvalues¡²ÎÊýÖ»ÉèÖÃÁËÒ»¸öÖµµÄ»°£¬ÄÇô»á¼Ù¶¨ÎªÄ¿µÄÖµ£¬ÊôÐÔÖµµÄ±ä»¯·¶Î§Îªµ±Ç°Öµµ½Ä¿µÄÖµ£¬ÎªÁË»ñµÃµ±Ç°Öµ£¬¸Ã¶ÔÏóÒªÓÐÏàÓ¦ÊôÐÔµÄgetter·½·¨£ºget<PropertyName>
3. Èç¹ûÓÐgetter·½·¨£¬ÆäÓ¦·µ»ØÖµÀàÐÍÓ¦ÓëÏàÓ¦µÄsetter·½·¨µÄ²ÎÊýÀàÐÍÒ»Ö¡£
Èç¹ûÉÏÊöÌõ¼þ²»Âú×㣬Ôò²»ÄÜÓÃObjectAnimator£¬Ó¦ÓÃValueAnimator´úÌæ¡£
tv=(TextView)findViewById(R.id.textview1); btn=(Button)findViewById(R.id.button1); btn.setOnClickListener(new OnClickListener() { ¡¡¡¡@Override ¡¡¡¡public void onClick(View v) { ¡¡¡¡¡¡¡¡ObjectAnimator oa=ObjectAnimator.ofFloat(tv, "alpha", 0f, 1f); ¡¡¡¡¡¡¡¡oa.setDuration(3000); ¡¡¡¡¡¡¡¡oa.start(); ¡¡¡¡} }); |
°ÑÒ»¸öTextViewµÄ͸Ã÷¶ÈÔÚ3ÃëÄÚ´Ó0±äÖÁ1¡£
¸ù¾ÝÓ¦Óö¯»µÄ¶ÔÏó»òÊôÐԵIJ»Í¬£¬¿ÉÄÜÐèÒªÔÚonAnimationUpdateº¯ÊýÖе÷ÓÃinvalidate()º¯ÊýË¢ÐÂÊÓͼ¡£
3.4 ͨ¹ýAnimationSetÓ¦Óöà¸ö¶¯»
AnimationSetÌṩÁËÒ»¸ö°Ñ¶à¸ö¶¯»×éºÏ³ÉÒ»¸ö×éºÏµÄ»úÖÆ£¬²¢¿ÉÉèÖÃ×éÖж¯»µÄʱÐò¹ØÏµ£¬Èçͬʱ²¥·Å£¬Ë³Ðò²¥·ÅµÈ¡£
ÒÔÏÂÀý×ÓͬʱӦÓÃ5¸ö¶¯»£º
1.²¥·Åanim1£»
2.ͬʱ²¥·Åanim2,anim3,anim4£»
3.²¥·Åanim5¡£
AnimatorSet bouncer = new AnimatorSet();
2 bouncer.play(anim1).before(anim2);
3 bouncer.play(anim2).with(anim3);
4 bouncer.play(anim2).with(anim4)
5 bouncer.play(anim5).after(amin2);
6 animatorSet.start();
|
3.5 TypeEvalutors
¸ù¾ÝÊôÐԵĿªÊ¼¡¢½áÊøÖµÓëTimeInterpolation¼ÆËã³öµÄÒò×Ó¼ÆËã³öµ±Ç°Ê±¼äµÄÊôÐÔÖµ£¬androidÌṩÁËÒÔϼ¸¸öevalutor£º
1.IntEvaluator£ºÊôÐÔµÄÖµÀàÐÍΪint£»
2.FloatEvaluator£ºÊôÐÔµÄÖµÀàÐÍΪfloat£»
3.ArgbEvaluator£ºÊôÐÔµÄÖµÀàÐÍΪʮÁù½øÖÆÑÕɫֵ£»
4.TypeEvaluator£ºÒ»¸ö½Ó¿Ú£¬¿ÉÒÔͨ¹ýʵÏָýӿÚ×Ô¶¨ÒåEvaluator¡£
×Ô¶¨ÒåTypeEvalutorºÜ¼òµ¥£¬Ö»ÐèҪʵÏÖÒ»¸ö·½·¨£¬ÈçFloatEvalutorµÄ¶¨Ò壺
public class FloatEvaluator implements TypeEvaluator {
2 public Object evaluate(float fraction, Object startValue, Object endValue) {
3 float startFloat = ((Number) startValue).floatValue();
4 return startFloat + fraction * (((Number) endValue).floatValue() - startFloat);
5 }
6 } |
¸ù¾Ý¶¯»Ö´ÐеÄʱ¼ä¸úÓ¦ÓõÄInterplator£¬»á¼ÆËã³öÒ»¸ö0~1Ö®¼äµÄÒò×Ó£¬¼´evaluteº¯ÊýÖеÄfraction²ÎÊý£¬Í¨¹ýÉÏÊöFloatEvaluatorÓ¦¸ÃºÜºÃ¿´³öÆäÒâ˼¡£
3.6 TimeInterplator
time interplator¶¨ÒåÁËÊôÐÔÖµ±ä»¯µÄ·½Ê½£¬ÈçÏßÐÔ¾ùÔȸı䣬¿ªÊ¼ÂýÈ»ºóÖ𽥿ìµÈ¡£ÔÚProperty
AnimationÖÐÊÇTimeInterplator£¬ÔÚView AnimationÖÐÊÇInterplator£¬ÕâÁ½¸öÊÇÒ»ÑùµÄ£¬ÔÚ3.0֮ǰֻÓÐInterplator£¬3.0Ö®ºóʵÏÖ´úÂë×ªÒÆÖÁÁËTimeInterplator¡£Interplator¼Ì³Ð×ÔTimeInterplator£¬ÄÚ²¿Ã»ÓÐÈÎºÎÆäËû´úÂë¡£
1.AccelerateInterpolator¡¡¡¡¡¡¡¡¡¡ ¼ÓËÙ£¬¿ªÊ¼Ê±ÂýÖмä¼ÓËÙ
2.DecelerateInterpolator¡¡¡¡¡¡ ¡¡¡¡ ¼õËÙ£¬¿ªÊ¼Ê±¿ìÈ»ºó¼õËÙ
3.AccelerateDecelerateInterolator¡¡ ÏȼÓËÙºó¼õËÙ£¬¿ªÊ¼½áÊøÊ±Âý£¬Öмä¼ÓËÙ
4.AnticipateInterpolator¡¡¡¡¡¡¡¡¡¡¡¡ ·´Ïò £¬ÏÈÏòÏà·´·½Ïò¸Ä±äÒ»¶ÎÔÙ¼ÓËÙ²¥·Å
5.AnticipateOvershootInterpolator¡¡ ·´Ïò¼Ó³¬Ô½£¬ÏÈÏòÏà·´·½Ïò¸Ä±ä£¬ÔÙ¼ÓËÙ²¥·Å£¬»á³¬³öÄ¿µÄֵȻºó»ºÂýÒÆ¶¯ÖÁÄ¿µÄÖµ
6.BounceInterpolator¡¡¡¡¡¡¡¡¡¡¡¡¡¡ ÌøÔ¾£¬¿ìµ½Ä¿µÄֵʱֵ»áÌøÔ¾£¬ÈçÄ¿µÄÖµ100£¬ºóÃæµÄÖµ¿ÉÄÜÒÀ´ÎΪ85£¬77£¬70£¬80£¬90£¬100
7.CycleIinterpolator¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ Ñ»·£¬¶¯»Ñ»·Ò»¶¨´ÎÊý£¬ÖµµÄ¸Ä±äΪһÕýÏÒº¯Êý£ºMath.sin(2
* mCycles * Math.PI * input)
8.LinearInterpolator¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ ÏßÐÔ£¬ÏßÐÔ¾ùÔȸıä
9.OvershottInterpolator¡¡¡¡¡¡¡¡¡¡¡¡ ³¬Ô½£¬×îºó³¬³öÄ¿µÄֵȻºó»ºÂý¸Ä±äµ½Ä¿µÄÖµ
10.TimeInterpolator¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ Ò»¸ö½Ó¿Ú£¬ÔÊÐíÄã×Ô¶¨Òåinterpolator£¬ÒÔÉϼ¸¸ö¶¼ÊÇʵÏÖÁËÕâ¸ö½Ó¿Ú
3.7 µ±Layout¸Ä±äʱӦÓö¯»
ViewGroupÖеÄ×ÓÔªËØ¿ÉÒÔͨ¹ýsetVisibilityʹÆäVisible¡¢Invisible»òGone£¬µ±ÓÐ×ÓÔªËØ¿É¼ûÐԸıäʱ£¬¿ÉÒÔÏòÆäÓ¦Óö¯»£¬Í¨¹ýLayoutTransitionÀàÓ¦ÓôËÀද»£º
transition.setAnimator(LayoutTransition.DISAPPEARING, customDisappearingAnim); |
ͨ¹ýsetAnimatorÓ¦Óö¯»£¬µÚÒ»¸ö²ÎÊý±íʾӦÓõÄÇé¾³£¬¿ÉÒÔÒÔÏÂ4ÖÖÀàÐÍ£º
1.APPEARING¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡µ±Ò»¸öÔªËØ±äΪVisibleʱ¶ÔÆäÓ¦Óõ͝»
2.CHANGE_APPEARING¡¡¡¡¡¡µ±Ò»¸öÔªËØ±äΪVisibleʱ£¬ÒòÏµÍ³ÒªÖØÐ²¼¾ÖÓÐÒ»Ð©ÔªËØÐèÒªÒÆ¶¯£¬ÕâÐ©ÒªÒÆ¶¯µÄÔªËØÓ¦Óõ͝»
3.DISAPPEARING¡¡¡¡¡¡¡¡¡¡¡¡µ±Ò»¸öÔªËØ±äΪInVisibleʱ¶ÔÆäÓ¦Óõ͝»
4.CHANGE_DISAPPEARING¡¡µ±Ò»¸öÔªËØ±äΪGoneʱ£¬ÒòÏµÍ³ÒªÖØÐ²¼¾ÖÓÐÒ»Ð©ÔªËØÐèÒªÒÆ¶¯£¬ÕâÐ©ÒªÒÆ¶¯µÄÔªËØÓ¦Óõ͝»
disappearing from the container.
µÚ¶þ¸ö²ÎÊýΪһAnimator¡£
mTransitioner.setStagger(LayoutTransition.CHANGE_APPEARING, 30); |
´Ëº¯ÊýÉèÖö¯»³ÖÐøÊ±¼ä£¬²ÎÊý·Ö±ðΪÀàÐÍÓëʱ¼ä¡£
3.8 Keyframes
keyFrameÊÇÒ»¸ö ʱ¼ä/Öµ ¶Ô£¬Í¨¹ýËü¿ÉÒÔ¶¨ÒåÒ»¸öÔÚÌØ¶¨Ê±¼äµÄÌØ¶¨×´Ì¬£¬¶øÇÒÔÚÁ½¸ökeyFrameÖ®¼ä¿ÉÒÔ¶¨Ò岻ͬµÄInterpolator£¬¾ÍÏ൱¶à¸ö¶¯»µÄÆ´½Ó£¬µÚÒ»¸ö¶¯»µÄ½áÊøµãÊǵڶþ¸ö¶¯»µÄ¿ªÊ¼µã¡£KeyFrameÊdzéÏóÀ࣬Ҫͨ¹ýofInt(),ofFloat(),ofObject()»ñµÃÊʵ±µÄKeyFrame£¬È»ºóͨ¹ýPropertyValuesHolder.ofKeyframe»ñµÃPropertyValuesHolder¶ÔÏó£¬ÈçÒÔÏÂÀý×Ó£º
Keyframe kf0 = Keyframe.ofInt(0, 400); Keyframe kf1 = Keyframe.ofInt(0.25f, 200); Keyframe kf2 = Keyframe.ofInt(0.5f, 400); Keyframe kf4 = Keyframe.ofInt(0.75f, 100); Keyframe kf3 = Keyframe.ofInt(1f, 500); PropertyValuesHolder pvhRotation = PropertyValuesHolder.ofKeyframe("width", kf0, kf1, kf2, kf4, kf3); ObjectAnimator rotationAnim = ObjectAnimator.ofPropertyValuesHolder(btn2, pvhRotation); rotationAnim.setDuration(2000); |
ÉÏÊö´úÂëµÄÒâ˼Ϊ£ºÉèÖÃbtn¶ÔÏóµÄwidthÊôÐÔֵʹÆä£º
1.¿ªÊ¼Ê± Width=400
2.¶¯»¿ªÊ¼1/4ʱ Width=200
3.¶¯»¿ªÊ¼1/2ʱ Width=400
4.¶¯»¿ªÊ¼3/4ʱ Width=100
5.¶¯»½áÊøÊ± Width=500
µÚÒ»¸ö²ÎÊýΪʱ¼ä°Ù·Ö±È£¬µÚ¶þ¸ö²ÎÊýÊÇÔÚµÚÒ»¸ö²ÎÊýµÄʱ¼äʱµÄÊôÐÔÖµ¡£
¶¨ÒåÁËһЩKeyframeºó£¬Í¨¹ýPropertyValuesHolderÀàµÄ·½·¨ofKeyframe·â×°£¬È»ºóͨ¹ýObjectAnimator.ofPropertyValuesHolder»ñµÃAnimator¡£
ÓÃÏÂÃæµÄ´úÂë¿ÉÒÔʵÏÖͬÑùµÄЧ¹û£º
ObjectAnimator oa=ObjectAnimator.ofInt(btn2, "width", 400,200,400,100,500); oa.setDuration(2000); oa.start(); |
3.9 Animating Views
ÔÚView AnimationÖУ¬¶ÔViewÓ¦ÓÃAnimation²¢Ã»ÓиıäViewµÄÊôÐÔ£¬¶¯»µÄʵÏÖÊÇͨ¹ýÆäParent
ViewʵÏֵģ¬ÔÚView±»drawnʱParents View¸Ä±äËüµÄ»æÖƲÎÊý£¬drawºóÔٸıä²ÎÊýinvalidate£¬ÕâÑùËäÈ»ViewµÄ´óС»òÐýת½Ç¶ÈµÈ¸Ä±äÁË£¬µ«ViewµÄʵ¼ÊÊôÐÔû±ä£¬ËùÒÔÓÐÐ§ÇøÓò»¹ÊÇÓ¦Óö¯»Ö®Ç°µÄÇøÓò£¬±ÈÈçÄã°ÑÒ»°´Å¥·Å´óÁ½±¶£¬µ«»¹ÊÇ·Å´óÕâǰµÄÇøÓò¿ÉÒÔ´¥·¢µã»÷ʼþ¡£ÎªÁ˸ıäÕâÒ»µã£¬ÔÚAndroid
3.0ÖиøViewÔö¼ÓÁËһЩ²ÎÊý²¢¶ÔÕâЩ²ÎÊýÔö¼ÓÁËÏàÓ¦µÄgetter/setterº¯Êý£¨ObjectAnimatorÒªÓÃÕâЩº¯Êý¸Ä±äÕâЩÊôÐÔ£©£º
1.translationX,translationY:ת»»×ø±ê£¨control
where the View is located as a delta from its left and
top coordinates which are set by its layout container.£©
2.rotation,rotationX,rotationY:Ðýת£¬rotationÓÃÓÚ2DÐýת½Ç¶È£¬3DÖÐÓõ½ºóÁ½¸ö
3.scaleX,scaleY:Ëõ·Å
4.x,y:ViewµÄ×îÖÕ×ø±ê£¨utility properties to
describe the final location of the View in its container,
as a sum of the left and top values and translationX
and translationY values.£©
5.alpha:͸Ã÷¶È
¸úλÖÃÓйصIJÎÊýÓÐ3¸ö£¬ÒÔX×ø±êΪÀý£¬¿ÉÒÔͨ¹ýgetLeft(),getX(),getTranslateX()»ñµÃ£¬ÈôÓÐÒ»Button
btn2£¬²¼¾ÖʱÆä×ø±êΪ£¨40,0£©£º
//Ó¦Óö¯»Ö®Ç°btn2.getLeft(); //40btn2.getX(); //40btn2.getTranslationX();
//0//Ó¦ÓÃtranslationX¶¯»ObjectAnimator oa=ObjectAnimator.ofFloat(btn2,"translationX", 200); oa.setDuration(2000); oa.start();/*Ó¦ÓÃtranslationX¶¯»ºó btn2.getLeft(); //40 btn2.getX(); //240 btn2.getTranslationX(); //200*/
//Ó¦ÓÃX¶¯»£¬¼ÙÉèûÓÐÓ¦ÓÃ֮ǰµÄtranslationX¶¯»ObjectAnimator oa=ObjectAnimator.ofFloat(btn2, "x", 200); oa.setDuration(2000); oa.start();/*Ó¦ÓÃX¶¯»ºó btn2.getLeft(); //40 btn2.getX(); //200 btn2.getTranslationX(); //160*/ |
ÎÞÂÛÔõÑùÓ¦Óö¯»£¬ÔÀ´µÄ²¼¾ÖʱµÄλÖÃͨ¹ýgetLeft()»ñµÃ£¬±£³Ö²»±ä£»
XÊÇView×îÖÕµÄλÖã»
translationXΪ×îÖÕλÖÃÓë²¼¾Öʱ³õʼλÖÃÕâ²î¡£
ËùÒÔÈô¾ÍÓÃtranslationX¼´ÎªÔÚÔÀ´»ù´¡ÉÏÒÆ¶¯¶àÉÙ£¬XΪ×îÖÕ¶àÉÙ
getX()µÄֵΪgetLeft()ÓëgetTranslationX()µÄºÍ
¶ÔÓÚX¶¯»£¬Ô´´úÂëÊÇÕâÑùµÄ£º
case X: info.mTranslationX = value - mView.mLeft; break; |
Property AnimationÒ²¿ÉÒÔÔÚXMLÖж¨Òå
1.<set> - AnimatorSet
2.<animator> - ValueAnimator
3.<objectAnimator> - ObjectAnimator
XMLÎļþÓ¦·Å´ó/res/animator/ÖУ¬Í¨¹ýÒÔÏ·½Ê½Ó¦Óö¯»£º
AnimatorSet set = (AnimatorSet) AnimatorInflater.loadAnimator(myContext, R.anim.property_animator); set.setTarget(myObject); set.start(); |
3.10 ViewPropertyAnimator
Èç¹ûÐèÒª¶ÔÒ»¸öViewµÄ¶à¸öÊôÐÔ½øÐж¯»¿ÉÒÔÓÃViewPropertyAnimatorÀ࣬¸ÃÀà¶Ô¶àÊôÐÔ¶¯»½øÐÐÁËÓÅ»¯£¬»áºÏ²¢Ò»Ð©invalidate()À´¼õÉÙË¢ÐÂÊÓͼ£¬¸ÃÀàÔÚ3.1ÖÐÒýÈë¡£
ÒÔÏÂÁ½¶Î´úÂëʵÏÖͬÑùµÄЧ¹û£º¡¡
PropertyValuesHolder pvhX = PropertyValuesHolder.ofFloat("x", 50f); PropertyValuesHolder pvhY = PropertyValuesHolder.ofFloat("y", 100f); ObjectAnimator.ofPropertyValuesHolder(myView, pvhX, pvyY).start(); |
myView.animate().x(50f).y(100f); |
|