Androidã¢ããªã±ãŒã·ã§ã³ã®éçºæéã®ã»ãšãã©ã¯ããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã§æ©èœããªãããšã«è²»ãããŠããŸãããã¥ãŒãã¹ããŒããŠãã³ãŒãã®èšè¿°ãéå§ããã ãã§ããç§ãã¡ã®ã»ãšãã©ã¯ããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ãããŸãæ°ã«ããŠããªãããšã«æ°ã¥ããŸããããããŠãããã¯æ ¹æ¬çã«ééã£ãŠãããšæããŸããã¢ãã€ã«ã¢ããªã®éçºè ã¯ãUI / UXã«ã泚æãæãå¿ èŠããããŸãã ãã¢ãã€ã«UIã®ãšãã¹ããŒãã«ãªãããšèšã£ãŠããã®ã§ã¯ãããŸãããããã¶ã€ã³èšèªãšãã®æŠå¿µãç解ããå¿ èŠããããŸãã
ç§ã¯ä»¥åããããªã¢ã«ãã¶ã€ã³ã®åœ±ã«é¢ããèšäºãæžããå€ãã®è¯ãã¬ãã¥ãŒãåããŸãããã¿ãªãããããããšãããããŸããããAndroidã§ã·ã£ããŠããã¹ã¿ãŒãããã§ã¯ãAndroidã§ã®ä»°è§ãšã·ã£ããŠã«ã€ããŠèª¬æããŠããŸããããã§ããªãŒãã³ãœãŒã¹ã®UIã©ã€ãã©ãªã«ããããè¿œå ããæ¹æ³ã瀺ããŸããã ïŒã¹ã±ãŒãªã³ã°ã¬ã€ã¢ãŠãïŒã
ãã®èšäºã§ã¯ãStateListAnimatorã䜿çšããŠã©ã€ãã©ãªãæ¹åãããã®æ¹æ³ã段éçã«èª¬æããŸãã
ã³ã³ãã³ã
ãã®èšäºã§ã¯ã次ã®ãããã¯ã«ã€ããŠèª¬æããŸãã
- æç»å¯èœãªç¶æ
- StateListDrawable
- ããããã£ã®ã¢ãã¡ãŒã·ã§ã³
- StateListAnimator
- StateListAnimatorã䜿çšããScalingLayout
æç»å¯èœãªç¶æ
Androidã«ã¯ãDrawableã®17ã®ç°ãªãç¶æ ããããŸãã
ç§ãã¡ã¯ãããã®ããã€ãã«äŒã£ãããšããªããããããŸãããç§ã¯ãã¹ãŠã®å·ãæãäžããã€ããã¯ãããŸãããã»ãšãã©ã®å Žåãæã ã䜿çšãã
pressed
ãenabled
ãwindows focused
ãchecked
æã
ã¯æç»å¯èœã®ç¶æ
ã宣èšããªãå Žåã®ããã«ãD.ãããããä»®å®ãããŠããAndroidã®ã§ã¯ããã©ã«ãã§ãã®ç¶æ
ã
ç¬èªã®StateListDrawableãäœæããã«ã¯ããããã®ç¶æ ãç解ããå¿ èŠããããŸãã
StateListDrawable
ããã¯åºæ¬çã«æç»å¯èœãªã¢ã€ãã ã®ãªã¹ãã§ãããåã¢ã€ãã ã«ã¯ç¬èªã®ç¶æ ããããŸããStateListDrawableãäœæããã«ã¯ããã©ã«ãã«XMLãã¡ã€ã«ãäœæããå¿ èŠããããŸã
res/drawable
ã
<item android:drawable="@drawable/i" android:state_pressed="true"/>
ãã¡ãã®ååã§ãã2ã€ã®ããããã£ããããŸãããããŒã¢ãã«ãšã¹ããŒãã
<selector>
<item
android:drawable="@drawable/p"
android:state_pressed="true"/>
<item
android:drawable="@drawable/default"/>
</selector>
ããã¯StateListDrawableã§ããåã«è¿°ã¹ãããã«ãèŠçŽ ã®ç¶æ ã宣èšããªãå Žåãããã¯ãããããã©ã«ãã®ç¶æ ã§ããããšãæå³ããŸãã
ShapeDrawableã䜿çšã§ããŸããïŒ
ã¯ããandroidïŒdrawableã䜿çšãã代ããã«ãèŠçŽ ã«ä»»æã®åœ¢ç¶ãè¿œå ã§ããŸãããããShapeDrawableãæã€èŠçŽ ã§ãã
StateListDrawable
APIã¬ãã«1ããStateListDrawableã䜿çšã§ããŸãããããã£ãŠãStateListDrawableã«ã¯APIã¬ãã«ã®å¶éã¯ãããŸããã
<View
android:layout_width="50dp"
android:layout_height="50dp"
android:foreground="@drawable/state_list_drawable"
android:clickable="true"/>
ããã§å šéšã§ããããã§ããã¥ãŒã«ç¶æ ããããŸãããŠãŒã¶ãŒãã¯ãªãã¯ãããšãè²ãå€ãããŸãããŠãŒã¶ãŒããªãªãŒã¹ãããšãããã©ã«ãã®ç¶æ ãšè²ã«ãªããŸãã
ããããã¡ãã£ãšåŸ ã£ãŠãã ãããã¯ãªãã¯å¯èœïŒãªããã®å±æ§ãè¿œå ããã®ã§ããïŒãŸãããããè¿œå ããå¿ èŠããããŸããïŒã¯ãããã ããã«ã¹ã¿ã ãã¥ãŒã®å Žåã®ã¿ãèŠã€ããã®ã«æéãããããŸãããã¿ã³ã¯ããã©ã«ãã§ã¯ãªãã¯å¯èœã§ãããããã¯ãªãã¯å¯èœãè¿œå ããªããŠãæ£åžžã«æ©èœããŸããããªãããªã©ãã¥ãŒãImageViewã®ãã«ã¹ã¿ã ãã¥ãŒãããStateListDrawableã䜿çšãããå Žåããããããªãã¯è¿œå ããå¿ èŠãã¯ãªãã¯å¯èœãªå±æ§ãã
StateListDrawable
ãã®ã³ãããã«StateListDrawableãè¿œå ããŸãããããã¯ãäžèšã®äŸã«äŒŒãŠããŸãããŠãŒã¶ãŒãã¬ã€ã¢ãŠããã¯ãªãã¯ãããšãè²ãä»ããããŸããããããStateListAnimatorã§ãããæ¹åããŸãããã
StateListAnimator
FloatingActionButtonãã¯ãªãã¯ãããšãã¢ãã¡ãŒã·ã§ã³ã®ããã«ãã®Zå€ãå¢å ããããšã«æ³šæããŠãã ãããããã¯ãããã°ç»é¢å€ã®StateListAnimatorã§ããäžéšã®ãããªã¢ã«ãã¶ã€ã³ãŠã£ãžã§ããã«ã¯ãç¬èªã®StateListAnimatorãå«ãŸããŠããŸãã
StackOverflowã«é¢ãã質åã§ãããæ確ã«ããŸãããã
ïŒããªããããã¿ã³ããããŒããŒ/ã·ã£ããŠãåé€ããæ¹æ³ïŒã
Material DesignãŠã£ãžã§ããå ã«ç¬èªã®StateListAnimatorãããå Žåã¯ãnullã«èšå®ããŠãã®é¢æ°ãåé€ã§ããŸãïŒæšå¥šãããŸãããçç±ã«ããèšèšãããŸããïŒãããã§ãçãã¯ã¯ããã«è«ççã«èãããŸãã
ïŒLollipopã«ã¯stateListAnimator
ããã¿ã³ã®é«ããåŠçããŠåœ±ãçæãããšããåä»ãªå°ããªé¢æ°ããããŸãã
åé€ããŠåœ±ãåãé€ã ãŸãstateListAnimator
ã
ãããè¡ãæ¹æ³ã«ã¯ããã€ãã®ãªãã·ã§ã³ããããŸãã
ã³ãŒãå ïŒ
button.setStateListAnimatorïŒnullïŒ;ïŒ
ã§ã¯ãã©ãããã°ãããäœæã§ããŸããïŒ
StateListAnimatorãç解ããã«ã¯ãããããã£ã¢ãã¡ãŒã·ã§ã³ãç解ããå¿ èŠããããŸããç§ã¯ããŠããªããã®èšäºã®ããããã£ã®ã¢ãã¡ãŒã·ã§ã³ã«ãã€ãã³ã°ã«è¡ããŸããããããå°ãªããšãç§ã¯ããªãã«åºæ¬ã瀺ããããšæããŸãã
ããããã£ã®ã¢ãã¡ãŒã·ã§ã³
ããã¯ããªããžã§ã¯ãã®ããããã£ã®æãç°¡åãªäŸã§ããXã¯ããããã£ã§ãã
class MyObject{
private int x;
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
}
ããããã£ã¢ãã¡ãŒã·ã§ã³ã·ã¹ãã ã¯ãã»ãšãã©ãã¹ãŠã®ãã®ãã¢ãã¡ãŒã·ã§ã³åã§ããå ç¢ãªãã¬ãŒã ã¯ãŒã¯ã§ããç»é¢ã«è¡šç€ºãããŠãããã©ããã«é¢ä¿ãªããæéã®çµéã«äŒŽããªããžã§ã¯ãããããã£ã®å€æŽã®ã¢ãã¡ãŒã·ã§ã³ãæå®ã§ããŸããããããã£ã¢ãã¡ãŒã·ã§ã³ã¯ãæå®ãããæéã«ããã£ãŠããããã£ïŒãªããžã§ã¯ãã®ãã£ãŒã«ãïŒã®å€ãå€æŽããŸãã
Xã¯ããããã£ã§ãã Tã¯æéã§ããã¢ãã¡ãŒã·ã§ã³äžãXããããã£ã¯æå®ãããæéã«æŽæ°ãããŸããäžè¬ã«ãããã¯ããããã£ã¢ãã¡ãŒã·ã§ã³ã®ä»çµã¿ã§ããããã¯ã¹ã®ä»£ããã«ããã¥ãŒãŸãã¯ä»»æã®ãªããžã§ã¯ããå«ããããšãã§ããŸãã
ValueAnimatorããããã£ãã¢ãã¡ãŒã·ã§ã³åããããã®åºæ¬ã¯ã©ã¹ã§ããValueAnimatorãæŽæ°ããããããã£ã®å€æŽãç£èŠãããªã¹ããŒãèšå®ã§ããŸãã
ObjectAnimatorã¯ãããç¶æ¿ããã¯ã©ã¹ã§ã
ValueAnimator
ã以äžã®æ¹ãé©ããŠããå Žåã¯ãObjectAnimatorã䜿çšã§ããŸãã
- ããªãã¯æã£ãŠãããªããžã§ã¯ãïŒããã€ãã®ããããã£ãæã€ä»»æã®ã¯ã©ã¹ãïŒã
- ValueAnimatorãªã¹ããŒãèŠãããããŸããã
- ãªããžã§ã¯ãã®ããããã£ãèªåçã«æŽæ°ãããã
ãããã£ãŠããã¥ãŒïŒãªããžã§ã¯ãïŒãããããã¥ãŒããããã£ïŒx座æšãy座æšãå転ãå€æããŸãã¯ãã¥ãŒã«ã²ãã¿ãŒ/ã»ãã¿ãŒããããã®ä»ã®ããããã£ïŒãæŽæ°ããå Žåã¯ãObjectAnimatorã䜿çšã§ããŸãã StateListAnimatorã®äœæãç¶ããŸãããã
<selector>
<item android:state_pressed="true">
<objectAnimator
android:duration="200"
android:propertyName="translationZ"
android:valueTo="6dp"
android:valueType="floatType" />
</item>
<item>
<objectAnimator
android:duration="200"
android:propertyName="translationZ"
android:valueTo="0dp"
android:valueType="floatType"/>
</item>
</selector>
FABãã¿ã³ãæŒããŠæŸããšããã®ãtranslationZãããããã£ãã¢ãã¡ãŒã·ã§ã³åãããŸãã
åã«è¿°ã¹ãããã«ãã¢ãã¡ãŒã¿ãŒã®å€åã芳å¯ããããšãªãããªããžã§ã¯ãããããã£ãçŽæ¥äœ¿çšã§ããŸããåãã¥ãŒã«ã¯translationZããããã£ããããŸãããã®ããã«ããŠãObjectAnimatorã䜿çšããŠtranslationZãçŽæ¥ã¢ãã¡ãŒã·ã§ã³åã§ããŸãã
è€æ°
<
objectAnimator>
ã®ãçµã¿åãããŠ<
set>
ãã«ããããšãã§ããŸãããã1ã€ã®ããããã£Viewãå€æŽããŸããããã¹ã±ãŒã«Xããã³ã¹ã±ãŒã«Yã
ãããçµæã§ãïŒãŠãŒã¶ãŒãã¯ãªãã¯ãããšãã«ãå¢å ããããã«ãªããŸããããããŠããããã³ãããã§ãã
ã§ä»ã®ããããã£ãå®çŸ©ããããšãã§ããŸã
animator.xml
ã ObjectAnimatorã®äœ¿çšã®è©³çŽ°ã«ã€ããŠã¯ããã¡ããã芧ãã ããã
ããã§å šéšã§ããValueAnimatorãšObjectAnimatorã«ã€ããŠãã£ãšæžãã€ããã§ããããã¯ããªããžã§ã¯ããã¢ãã¡ãŒã·ã§ã³åããããã®åªããAPIã§ãã
ããããŒã³ãŒãã£ã³ã°ïŒ