ODDéçºã«ã¤ãã¦
ãã®è¨äºã¯ å¦çã¨ã³ã¸ã㢠Advent Calendar 3æ¥ç®ã®è¨äºã§ã。
ODD
Oyakodon Driven Development
ãµããããã¾ãã®ãã ãã親å丼
çåã¨é¶èãéããã使ãã風å³è±ããªã ãã§ä»ä¸ãã親å丼ã§ããã好ã¿ã§å¥æ·»ã®ä¸å³åè¾åãããã¦ã楽ãã¿ãã ããã
ã»ãã³ã¤ã¬ãã³ã§å£²ã£ã¦ãããã®è¦ªå丼、ãããã¡ãã£ãã¡ãç¾å³ãããã§ãã。
ããã£ã¨ç»åãã©ã«ãæ¢ããã ãã§ããããªæã
ã¦ã、æ®éã«ãã¾ãã好ããªã ããªãã§ããã©ã。
ã³ã³ããã®è¦ªå丼ãªã®ã«ãµãããåçåµã§ï½¤å風ã ãã軽ãé¦ã絶å¦ãªä¸åã«ãªã£ã¦ãã¾ã。
ã¾ã、親ã®é³¥ã¯ããªããªã¨ãã¦é常ã«ç¾å³ãã、æã
ç¦ãç®ããããªã©é¦ã°ãããæãããã¾ã。
ã»ãã¨ç¾å³ããã®ã§ãã²é£ã¹ã¦ã¿ã¦ãã ãã。
å°ã幸ãã«ãªãè²·ãæ¹
ã»ãµããããã¾ãã®è¦ªå丼
ã»ãã ã¨ãããã®ãµã©ã
ã»ã»ãã³ãã¬ãã¢ã å風ãã¬ãã·ã³ã°
ã»èã¾ã
ãããã»ããã§è²·ãã¨é常ã«å¹¸ãã«ãªãã¾ã。
ãã°ãä»æ§ã«å¤ããã¾ã。
æå¾ã«
ã¶ã£ã¡ããä¸çªã®ããããã¯tabelog.com
ããã§ã。
誰ãé£ãã¦è¡ã£ã¦ãã ãã。
ããã
DroidKaigiã®CFPæ¸ãã
DroidKaigiã®CFPåéãå§ã¾ã£ã¦ãã®ã§åºãã¾ãã!!!!
ã¨ãããã、Viewã®ç´°ãããã¨ã«ã¤ãã¦è©±ããããªã¼ã£ã¦æã£ã¦ãã®ã§ããã辺ãã¢ãã£ã¦ã¾ã。
ããããkyoubashi.dexã§è©±ããå
容ã«ãã©ã¹Î±ããå
容ãã¡ããã¨è³æä½ã£ã¦çºè¡¨ãããããªã£ã¦ï½¡
æ¦è¦
ValueAnimatorã«ä»éããInterpolatorãTypeEvaluterãªã©ä¸åº¦ç¥è¦ã¾ã¨ãããã¤ã、
IllustratorããPathã¸ã®ç°¡åãªç§»æ¤ãå¯è½ã«ããEXTKã®JSã®Scriptã®ç´¹ä»ï½¤
å®éã®ã³ã¼ã、å®æããViewãè¸ã¾ãã¤ã¤ç´¹ä»ãã¾ã。
ã§ï½¤æ°ããViewããµã¯ãã¨ç´¹ä»
ã¾ãå¤ãªãã®ãä½ã£ã¦ãã¾ã£ã⦠pic.twitter.com/Ok92CSBCZo
— ã㢠(@amyu_san) 2015, 10æ 15
ä»ã¾ã§ã®ã¯ã³ã³ãã¸ãã«amyu.hatenadiary.com
æå¾ã«
ã¾ã 10人ããåºãã¦ããªããããã®ã§...。
èªåãã¡ããã¨é¸ã°ãããè³æä½ãã¾ã!!
(絶対ã«Rã®ååã¯åºããªãã¨ããå¼·ãæå¿)
RecyclerViewã®preloadãç´ æµã ããã£ã¦ãã話
preload
ã»Listå½¢å¼ã§1è¡ã1ç»é¢ã®ImageView
ã»æ¬¡ã®è¡ã®ImageViewãå
ã«æç»ãã¦ãããã
ã¨ããæãã§ã¹ã ã¼ãºã«é«ç»è³ªãªç»åãæç»ãããã¨ã«ãã£ã¦ï½¤ã¹ãã¬ã¹ãä¸ããªãããã«Listãããã¨è¨ãã話。
ListViewã§ã®å®è£
ããããªãã£ã。
ããããgetView()ã¾ãããã©ãããã£ã¦ããã¤ããã ãï½¤æ ¹æ¬çã«ListViewããããããªãã¨ãããªãããã ã£ã。
RecyclerViewã§ã®å®è£
LinearLayoutManager | Android Developers
LinearLayoutManagerã®getExtraLayoutSpaceãå®è£
ãããã¨ã«ãã£ã¦preloadãå®ç¾ã§ãã。
ããã¥ã¡ã³ãèªä½ã«ã
You can override this method to implement your custom layout pre-cache logic.
ã¨ï½¤ããããã«pre-cacheå¨ããã¤ã¸ãã。
ãã 、å½ç¶ããã©ã¼ãã³ã¹ã³ã¹ããä¸ãããã¨ãã注æã。
ã¨ãããã¨ã§ï½¤å®è£
ããLinearLayoutManagerããã¡ã。
ããã«RecyclerView#setItemViewCacheSizeã§ãã£ãã·ã¥ãµã¤ãºãããã©ã«ãã®1ããå¢ãããã¨ã«ãã£ã¦ViewPagerã®PageCacheã®ããã«ãã£ãã·ã¥ãããã¨ãåºæ¥ã。
ããªãç´ æµæ©è½ï½¡
ãããããã©ã¼ãã³ã¹ã³ã¹ããä¸ããã、çµæ§ãã¼ãé¢ãã¯ãªã¢ãã¦ãããããããªããã¨ããæå¾
ãããªããã¦ãã。
æå¾ã«
ListViewã ã¨ããªãã®å·¥æ°ãããã¦å®è£
ããªãã¨ãããªãã¨ããã ã£ãã、RecyclerViewããã£ããããã§ï½¤çµæ§çéã§å®è£
ã§ãã。
å¤åä»å¾ããããªæãã§ListViewã ã¨åºæ¥ãªãï¼ã£ã¦ããã¨ããããRecyclerViewã使ããã¨è¨ãæµãã«ãªããã¨ãããã®ããªã¨æã£ãã。
ã¯ã¼é£ãã。
å ¬éããViewé
WaveSwipeRefreshLayout
BeerSwipeRefreshLayout
PlayPauseButton
ColoringLoading
CustomViewãä½ãã¨ãã®ãã³ãã¬ã¼ããAndroidåå¿è ãèãã
CustomViewãä½ãæ©ä¼ãå¤ãä»æ¥ãã®ãã。
ããã§èããã®ãAPIå¶éã ã£ãã、ããã©ã¼ãã³ã¹ã®äºã ã£ãããªãã§ã。
APIå¶éã¯ã©ããããããªããããã¹ããã¨ãã¦ï½¤ããã©ã¼ãã³ã¹ã¯åºæ¥ãã ã対ç、è¯ããã¦ããããã¨èãã¦ãã¾ã。
å¤çºããinvalidate();
ValueAnimatorãªã©ä½¿ã£ã¦ããã¨AnimatorUpdateListenerã®onAnimationUpdateã§invalidate();ããã®ã¾ã¾ãµã¯ãã¨æ¸ããã¿ã¼ã³ããããã¨æãã¾ã。
ãããªæãã«ï½¡
ValueAnimator animator = ValueAnimator.ofFloat(0.f, 1.f); animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { invalidate(); } }); animator.setDuration(10000); animator.start();
ãã®æ、invalidateãå¼ã°ããééã¯å¤§ä½17msã§58FPSãããã«ãªã£ã¦ãã¾ã。
60FPSãããåºã¦ãå ´åã¯æ»ããã«æç»ãã¦ããã¨ããã¦ãã¾ãã、Viewã«ãã£ã¦ã¯ããã¾ã§ã®FPSãå¿
è¦ã¨ãã¦ããªãæãå¤ãã¨æãã¾ã。
ã¾ã、è¤éãªAnimationãããæ、ValueAnimatorã¯ä¸ã¤ã¨ã¯éããè¤æ°ä½¿ãã¾ã。
ãã®éãã¹ã¦ã®ValueAnimatorã§invalidateã17msééã§å¼ã¶ã¨ç¡é§ã«onDrawãå¼ã°ãæç»ãããªãè¨ç®ãèµ°ããã¨ã«ãªãã¾ã。
ã¤ã±ãªããã¨ã§ã。
ç»é¢ãéãã¦ãå¼ã°ããinvalidate();
Viewã®ã©ã¤ããµã¤ã¯ã«ã§ããonDetachedFromWindow()ãå¼ã°ãã¦ãValueAnimatorã«addUpdateListenerããAnimatorUpdateListenerã¯çãç¶ãã¦ãã¾ã。
onDetachedFromWindow()ãå¼ã°ããæã«ã¯onDrawã¯å¼ã°ããªãã®ã§ãã、AnimatorUpdateListenerã®onAnimationUpdateã§ãã¦ããå¦çã¯Durationã®é、å¼ã°ãç¶ãã¾ã。
RepeatãããããªAnimatorã§ã¯å¸¸ã«å¦çãèµ°ãç¶ãã¦ãã¾ãã¾ã。
ç¡é§ãªè¨ç®ã¯ããã©ã¼ãã³ã¹ãä¸ããè¦å ã«ãªãã®ã§ã©ãã«ãããã»ããããã§ã。
åãèããæå¼·ã®TemplateCustomView
åºæ¬çã«ã¯Overrideããinvalidateã®å¦çãã´ãã§ã´ãã§ãã¾ãã。
ä»åã¯æ«å®ã§30mséé以ä¸ã§ã®æ´æ°ããsuper.invalidate();ãå¼ã°ãªãããã«ãã¦ãã¾ã。
å人çãªä¸»è¦³ã§ãã、 30FPSãããã¢ã¬ã°éåæãæããªãã¨æãã¾ã。
ã¾ã、ä¸å¿onDetachedFromWindowãå¼ã°ããæã«ã¯å³å¹ã§returnãããããã«ãã¦ã»ãã®å°ãã ãããã©ã¼ãã³ã¹ã«è²¢ç®ããã。
onDetachedFromWindow()å
ã®å¦çã§ã¯Animatorã®Cancelå¦çãå¿
é ã§å
¥ããããã«ãã¦ãã¾ã。
è¤éãªæç»ã«ãªãã°ãªãã»ã©ï½¤onAnimationUpdateã§ããå¦çãéããªããã¨ãããã®ã§å¿
é ã¨è¨ãã¾ã。
ã¨ï½¤ã¾ãããããèãã¦æ¸ãã¦ã¯ã¿ããã§ãã、ãã®Viewãä¸çªé©ãã¦ãã®ã£ã¦ï½¤Handlerã§åããinvalidateã¨ã©ããã®Animatorããå¼ã°ããinvalidate、ãã®ä»ãªããé©å½ã«å¼ã°ããinvalidateãå¶å¾¡ããã¨ãã«å½¹ã«ç«ã¡ã¾ã。
ä¸ã¤ã ãã®Animatorã®invalidateã ã¨ï½¤30msåã®æç»ããªãã¨ãããåºã¦ãããããã®ã§ï½¤ViewCompat.postInvalidateOnAnimation(View)ã使ãã®ãè¯ããã¨ï½¡
ãã 、postInvalidateOnAnimation(View)ã®ããã ãã«support libraryå°å
¥ããã®ãå«ã ã¨ãã人ã¯ããå°ãããããèããã»ããããããªã£ã¦æãã¾ã。
ã²ã¨ã¤ã®Viewã®ããã©ã¼ãã³ã¹ã«ãã ããã¨
ä¸ã¤ã®Viewã表示ããã¦ããæéã¯ä¸ã¤ã®ç»é¢ã表示ããã¦ããæéããå§åçã«å°ãªãã§ã。
ãã®ãã、å°å
¥ããã¨ãã«ããã©ã¼ãã³ã¹ãè¦ããã¨ãå°ãªãã¨æãã¾ã。
ãã 、ãããããã使ã£ã¦ãããããããããªã、ã¨ããç¶æ³ã«åãã¦ä»èªåã®æã£ã¦ããç¥èã§æé«ã®Viewãä½ã£ã¦å
¬éãããã¨ã¯é常ã«ææ義ã ã¨æãã¾ã。
æå¾ã«
çµå± onDrawå
ã§ã¤ã³ã¹ã¿ã³ã¹ãä½æããªãã¨ãããã«å½ããåã®ãã¨ãããã°ç¢ºå®ã«ä¸å®ä»¥ä¸ã®ããã©ã¼ãã³ã¹ãæ
ä¿åºæ¥ã¨ããã¨æãã¾ã。
ããã§ããä¸æ©è¸ã¿è¾¼ãã ã¡ã³ããã³ã¹ããããã¨ã§ã¤ã±ã¡ã³ãªViewã¸ã¨æè¯ã§ãã¾ãã!!!!
ããã!!!!!!!!!
Path#opã®éã«ããã£ã¦æãåºããªãã£ã
Viewä½ãã«æ¬ ãããªãPath。
API19ãã追å ãããPath#opã触ã£ã¦ã¿ããã¨ã«ã¤ãã¦ï½¡
Path#opã§ä½ãåºæ¥ãã
å人çãªæè¦ã§ãã、ç°ãªã2ã¤ã®Pathãå¼ãç®ããã、UnionãããXORããããããã¨ãåºæ¥ã便å©ãªãã¤ã§ã。
ä¾ãã°ï½¤
ãã®ããã«Pathã§ãã¹ã¦æç»ãã¦ãããã®ã«å¯¾ãã¦ï½¤Bottleå
ã®"ä¸ã®ãã®ãæ¸ã"ã¨ãããã¨ãè¨ç®ãã¦å度座æ¨ãè¨ç®ãç´ãã¨ããã®ã¯ããªã骨ãæãã¾ã。
Path#cubicToãªã©ãã¸ã§æ²ç·ã使ã£ã¦ãå ´åã¯ããªãã®å´åã§ã。
ããã§ï½¤Pathå士ã®å¼ãç®ãè¡ããã¨ã«ãã£ã¦ç°¡åã«å®ç¾ããããã§ã。
ä»åã®é£²ã¿ç©ãå¢ãããæ¸ã£ããããAnimationã§ã¯ä»¥ä¸ã®ããã«ãªã£ã¦ãã¾ã。
mBottleBeerPath.op(mOpPath, Path.Op.DIFFERENCE); mGlassBeerPath.op(mOpPath, Path.Op.DIFFERENCE); canvas.drawPath(mGlassPath, mGlassPaint); canvas.drawPath(mGlassBeerPath, mBeerPaint); canvas.drawPath(mBottlePath, mBottlePaint); canvas.drawPath(mBottleBeerPath, mBeerPaint);
ã¤ã¡ã¼ã¸çã«ã¯
ãããªæãã§ãã。
ããã£ã¦æãåºããªãé
Rectã§opããã¨op対象ã®LinePathãåæã«Closeããã¦è¿·æã¨ãã話
— ãã¿ã
ã¼ (@amyu_san) June 23, 2015
ã³ã¬ã§ã。
public class OpSampleView extends View { private Path mMainPath; private Path mOpPath; private Paint mMainPaint; public OpSampleView(Context context) { this(context, null, 0); } public OpSampleView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public OpSampleView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } private void init() { setUpPaint(); setUpPath(); } private void setUpPaint() { mMainPaint = new Paint(); mMainPaint.setColor(Color.BLUE); mMainPaint.setStyle(Paint.Style.STROKE); mMainPaint.setStrokeWidth(20); } private void setUpPath() { mMainPath = new Path(); mOpPath = new Path(); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { mMainPath.reset(); mMainPath.moveTo(w / 2, h / 2); mMainPath.lineTo(w / 2 - 300, h / 2 - 300); mMainPath.lineTo(w / 2 + 300, h / 2 - 300); mOpPath.addRect(0, 0, w / 2, h, Path.Direction.CCW); super.onSizeChanged(w, h, oldw, oldh); } @Override protected void onDraw(Canvas canvas) { //mMainPath.op(mOpPath, Path.Op.DIFFERENCE); canvas.drawPath(mMainPath, mMainPaint); } }
ãã®ããã«é©å½ã«Closeãã¦ãªãPathã®ã¿ã§æç»ããç·ãããã¾ã。
å½ç¶Closeãã¦ããªãã®ã§ä¸è§å½¢ã¯åºæ¥ä¸ããã¾ãã。
å¥ã«ä¸è§å½¢ãä½ããã¨ãæãã§ããªãã®ã§å½ããåã§ã。
ã§ï½¤æ¬¡ããåé¡ãªãã¨ã§ã。
@Override protected void onDraw(Canvas canvas) { mMainPath.op(mOpPath, Path.Op.DIFFERENCE); canvas.drawPath(mMainPath, mMainPaint); }
mMainPath.op(mOpPath, Path.Op.DIFFERENCE);ããã³ã¡ã³ããå¤ã、左ååãé¸æãã¦ããmOpPathã§opããã¨...
ãããªæãã«æãã§ããªãå½¢ãæç»ããã¦ãã¾ã£ã¦ãããã§ã...
åæã«Closeããã¦é常ã«å°ã£ã¦ã¾ã。
ãã¼ã、ã³ã¬ã»ãã¨ã©ãããã。
ããçç±ã¨ã解決æ¹æ³ç¥ã£ã¦ããæ¹ãããæãã¦ä¸ãã...
æ«å®ãªè§£æ±ºç
ç·ã¯å³å½¢!!!!
ããã°ã£ã¦1å¨ããã¦å³å½¢ã¨ããã°ã¡ããã¨æç»ããã¾ã。
æå¾ã«
Path#opã¯ããªã便å©ã§ãã使ããã®ãAPI19ããã¨ããããªãéããã¦ãã¾ã。
ããããå¾®å¦ã«ä½¿ãã¥ããã¨ããã ã£ãã、"op"ã¨ããã°ã°ãã«ããåèªã ã£ããã¨é常ã«éãæ·±ããªã£ã¦ãã¾ã。
ã»ãã¨èª°ãç¥è¦ããããæãã¦ä¸ãã。
ã³ã¼ã©1æ¬ä¸ãã¾ã。
ããã
èªç¶ãªæãã®æ¡å¤§ç¸®å°ã® Interpolator
ã°ã©ãã¯ãããªæã
ã³ã¼ãã¯ãããªæã
gist.github.com
åãç»å ´ããæã®ãµã³ãã«ã«å½ã¦ããã¤www.youtube.com
æå¾ã«
ç´ æ´ãããInterpolator
åè
æ¸è¡°ãª Interpolator
åã«ä½ã£ãæ¸è¡°ãª Interpolator ã。
å¤å使ããã³ããçµæ§ããããã ã、便å©ã£ã½ããã¤ï½¡
å人çã«yã®Maxå¤ãé«éããæ°ãããã、ããå°ãå¼·ãã«æ¸è¡°ãããã»ããè¯ãããªã¨æã£ãã。
å¼ãã¡ããã¡ããå¤ããã°ã¤ã±ãã®ã§é©å½ã«ä½ã£ããã¤ã±ãã¯ã。
æå¾ã«
Grapher使ãã°10åãããã§Interpolatorä½ãã¦æå¼·
åè
TypeEvaluator ã使ã£ãç°¡å㪠ValueAnimator
TypeEvaluatorãããªã便å©ã ã£ãã®ã§ã½ã¬ã«ã¤ãã¦
TypeEvaluatorã¨ã¯
TypeEvaluator | Android Developers
ã³ã¬ã§ã。
ç°¡åã«æ¸ãã¨...
ValueAnimator.ofFloat(0.f,1.f);
ã«ããValueAnimatorã¯ã»ããããDurationã®éã«0.fãã1.fã¾ã§ã®å¤ãåãåããã¨ãåºæ¥ã¾ãã。
ä¾ãã°ä¸ã®ç¶æ
ã ã¨setDuration(1000)ã®å ´å、10msã®ægetAnimatorValuesã§0.01fãåå¾ã§ããã¿ãããª(Interpolatorãy=xãªæ)
ã³ã¬ã、åä¸ã®æ°åå士ãªã楽ãªãã§ãã、ä¾ãã°
float[][] hoge
ãªå¤æ¬¡å
é
åã®ãã®ãå¼æ°ã«æ¸¡ã、ããæãã«å¤ãåãåãããã¨ããæã«TypeEvaluatorãæ´»èºãã¾ã。
ä¾ãã°
float[][] hoge = {{0,0},{10,10},{100,100}}; float[][] hoge2 = {{0,0},{100,100},{0,0}};
ã§1000msã®éã«hogeããhoge2ã«å¤ã移åãããValueAnimatorã®å ´å、æä¾ããã¦ããValueAnimator.of~ ã§ã¯å¯¾å¿ã§ãã¾ãã。
(500msã®æã«{{0,0},{55,55},{50,50}}ãªå¤ãåå¾ããã)
ã®ã§ï½¤TypeEvaluatorãããã®ä¸èº«ã®å¦çãæ¸ãã¨ãã£ãæãã«ãªã£ã¦ãã¾ã。
ã¨ãããã、使ãæ¹ã¨ãã³ã¼ãè¦ãã°å³ãããããã¨æãã®ã§ãµã³ãã«ãã©ãã。
ã§ï½¤TypeEvaluatorãããã®é¨å
public static class WaveTypeEvaluator implements TypeEvaluator<float[][]> { @Override public float[][] evaluate(float v, float[][] start, float[][] end) { float[][] newValue = new float[start.length][start[0].length]; for (int i = 0; i < start.length; i++) { for (int j = 0; j < start[i].length; j++) { newValue[i][j] = start[i][j] + (end[i][j] - start[i][j]) * v; } } return newValue; } }
forã®ä¸ã«lengthã使ããªã¨ãè¨ãããã³ãã¯ç½®ãã¦ããã¦ï½¡
çµè«æ¸ãã¨ï½¤èªåã§æéã«å¯¾ããå¤ãè¨å®ã§ããã¨ããæãã§ã。
ãªã¬ãªã¬TypeEvaluatorã ã£ããåºæ¬çã«ä½ã§ãæãã¦é常ã«è¯ãã§ãã!!!!!
ä¾ãã°ï½¤ä»åã¯å¤æ¬¡å é åãä¾ã«ãã¦ãã¾ãã、ä½ã£ãModelClassãå¼æ°ã«æ¸¡ãã¦
public static class WaveTypeEvaluator implements TypeEvaluator<MyPoint> { @Override public MyPoint evaluate(float v, MyPoint start, MyPoint end) { MyPoint newPoint = new MyPoint(); newPoint.setX(start.getX() + (end.getX() - start.getX()) * v); return newPaint; } }
ãããªæãã«ã¤ã±ããã§ãã。
便å©ï½¡
ã¤ãã§ã«ãã®Viewã¯ãããªæã
ã¯ã¼ç´ æ´ãããTypeEvaluator。
ã¾ã、ValueAnimatorã¨å°ãã ã仲è¯ãæ
£ãã¾ãã。
æå¾ã«
TypeEvaluator、å¤æ¬¡å
é
åã ããããªãã¦ï½¤ããã¤ã¸ãã°ãã¤ã³ã¿ã¼ãã¬ã¤ã©ã¼ããå®ã¯ãã®ä¸ã«çµããã¨ãåºæ¥ããã¨ï½¤æ®éã«ä¾¿å©ã§ãã。
ãã£ã¨ï½¤Viewã®ã«ã¹ã¿ãã¤ãºãã¦ãã£ã¦ç¥è¦ããããã。
ãã¨ï½¤å
å®æ¬²ãã。
ã§ã¯ã§ã¯ã¼
Interpolator ãä½ã£ããªãã㪠View ã® Animation
Interpolatorãä½ãã¨ãããããã®ã¯ã°ã°ã£ã¦ãã ãã!
ä¸çªåä»ãªAnimationã®å¤åçã®å¼ãã©ããã£ã¦ä½ã£ã¦ãããããªã¼ã¨æãã®ã§ããã辺ã詳ããæ¸ãã¦ããã¾ã。
Interpolatorã®ä½æ
android.view.animation.Interpolatorãå®è£
ããã°Interpolatorã«ãªãã¾ã。
ã§ï½¤ getInterpolation(float v) ã®ä¸èº«ãå®è£
ãã¦ããæãã«ãªãã¾ã。
ä¾ãã°BounceInterpolatorã®ã³ã¼ãã§ã¯
42 public float getInterpolation(float t) { 43 // _b(t) = t * t * 8 44 // bs(t) = _b(t) for t < 0.3535 45 // bs(t) = _b(t - 0.54719) + 0.7 for t < 0.7408 46 // bs(t) = _b(t - 0.8526) + 0.9 for t < 0.9644 47 // bs(t) = _b(t - 1.0435) + 0.95 for t <= 1.0 48 // b(t) = bs(t * 1.1226) 49 t *= 1.1226f; 50 if (t < 0.3535f) return bounce(t); 51 else if (t < 0.7408f) return bounce(t - 0.54719f) + 0.7f; 52 else if (t < 0.9644f) return bounce(t - 0.8526f) + 0.9f; 53 else return bounce(t - 1.0435f) + 0.95f; 54 }
ãããªæãã«ãªã£ã¦ãã、ã³ã¬ãè¦æ
£ããå¼ã«ç´ãã¨
ãããªæãã«ãªãããã§ã。
ã°ã©ãã¨å¼ã¿ã¦ããããã¨åãããã§ãã、ããå
¨é¨2次æ¹ç¨å¼ãªãã§ãã。
æéã§Maxã1ãªæ¨ªè»¸ï½¤ç¸¦è»¸ã1ã§100%ãªæã(2ã ã¨200%ã§åã«ãªãæè¦)ã§ã¤ãããã¨æãã¾ã。
ãã、åºæ¬çã«é«3ã¾ã§ã®æ°å¦ã§ä½è£ã§ã¤ã±ããã§ãã!!
ç´ æ´ãããé«æ ¡æ°å¦ï½¡
é«æ ¡æ°å¦ã®ç´ æ´ãããã¯ç½®ãã¨ãã¦ï½¤æ¬¡ã«ãµã¯ãã¨ãµã³ãã«ä½ã£ã¦ã¿ã¾ã。
æ¡å¤§ãã¦ï½¤å ã«æ»ã、ãã®å¾ãã¦ã³ããããããªInterpolator
BounceInterpolatorãå°ããã¯ããã¦ããã£ã¦ï½¤ãããªæãã®ã°ã©ããä½æãã¾ã。
æ°å¼ã¯ãããªæãã§ï½¡
ã°ã©ãã®æ¹ãã¿ã¦ããããã°åãããã§ããx=0.5ã®æã«y=1.3ã«ãªãããã«ãªã£ã¦ãã¾ã。
ãã®ãã、è¨å®ããDuration * 0.5çµã£ãé ã«å
ã®å¤§ãããã130%大ãããªãã¾ã。
ã§ï½¤ãã®å¾ã¯ï½¤ã¾ã、ãã³ãã³ã¨ãªãããã§ãã!!!!!
sinæ³¢ãé«æ ¡æ°å¦ã§ï½¤ãã¼é«æ ¡æ°å¦ç´ æ´ããã。
ãã、å®éã©ãããåãã«ãªãã®ãã¨ããã¨ï½¤www.youtube.com
ã³ã¬ã®æã®é¨åã®Animationã«ãªãã¾ã。
ä¸å¿ä»åä½ã£ãInterpolatorã¯ãããªæã。
gist.github.com
ä½ã£ãã°ã©ãããå¼ãæ¸ãåããã ãã§ãã。
ä»ã«ãä½ã£ã
æå¾ã«
Interpolatorã®ä½ãç´ æ´ãããã£ã¦ï½¤Interpolatorã極ããã°ããªãAnimationããªããã«åºæ¥ãã¨ããã¨ããã§ã!!!!
ããªãè¯ãã§ã!!!
Interpolatorã使ãããªãã¦ãªãã£ããã、Viewã®æ¡å¤§ç¸®å°ã¯ï½¤æ¡å¤§ã®ã¢ãã¡ã¼ã·ã§ã³ãçµãã£ããã¨ã«ç¸®å°ã®ã¢ãã¡ã¼ã·ã§ã³ãå
¥ãã、ã¨ãã£ãæãã«å®è£
ãã¦ãã¾ãã。
ããã!! ãããªç°¡åã«Interpolatorä½ã£ã¦Animatorãªã©ã«ã»ããããã ãã§ï½¤ãªãããªæãåºããAnimationãä½ããã£ã¦è¯ããªãã§ãã!!!!
大ä½ã2次æ¹ç¨å¼ãã、æ£å¼¦æ³¢ãªã©ï½¤ããç¨åº¦ã¯ææ¥ã§ãã£ãã°ã©ãã§ä½ããã¨ããã®ãã»ãã¨ãã«è¯ãã§ãã。
ãã¨ï½¤ãµã³ãã«ã§æ¸ããåç»ã®Viewã¯ãã®ãã¡å
¨é¨ã³ã¼ãå
¬éããã¨æãã¾ã。
ä»ã¯éã®åãåãã¦å
¬éã§ããªãã®ã§ï½¤å¾
ã£ã¦ã¦ãã ãã!!!
Interpolatorè·äººã«ä¿ºã¯ãªã!!!!
ããã