
ã倿¹ãäœããããŸããã§ããã-ãºãŒã æ©èœãåãããã¥ãŒãäœæãããã€ã³ãæ°ã«å¿ããŠã©ã³ã¯ããšã«ãŠãŒã¶ãŒã忣ããããšããã¢ã€ãã¢ãçãŸããŸããã ãã以åã¯ããã®ã¬ãã«ã®ç¬èªã®ãã¥ãŒãäœæããçµéšããªãã£ããããã¿ã¹ã¯ã¯åå¿è
ã«ãšã£ãŠã¯é¢çœããŠç°¡åã«æããŸããã...
ãã®èšäºã§ã¯ãAndroid SDKãšã¿ã¹ã¯åŽïŒã¯ã©ã¹ã¿ãªã³ã°ã¢ã«ãŽãªãºã ïŒã®äž¡æ¹ã§çŽé¢ããåé¡ã«ã€ããŠèª¬æããŸãã ãã®èšäºã®äž»ãªç®çã¯ããããããã«ã¹ã¿ã ãã¥ãŒãã®äœææ¹æ³ãæããããšã§ã¯ãªããäœææã«çºçããå¯èœæ§ã®ããåé¡ã瀺ãããšã§ãã
ãã®ãããã¯ã¯ããã®ãããªãã®ãäœæããçµéšãã»ãšãã©ãªãïŒãŸãã¯ãŸã£ãããªãïŒäººãããã³Android SDKã®ãæè»æ§ããåããŠä¿¡ãã
èè
ã®èå³ãåŒã人ã«ãšã£ãŠè峿·±ããã®ã«ãªããŸãã
1.ä»çµã¿ã¯ïŒ
äœåã®ãã¢ãèŠãïŒGIFïŒ æåã«ããã¥ãŒã®äœææ¹æ³ãç°¡åã«èª¬æããŸãã
éå±€ïŒç¬èªã®ãã¥ãŒã¯ç·è²ã§ããŒã¯ãããŠããŸãïŒ
RankingsListView

ããŒãã«ã®å
é ã«ã¯ã
RankingsListView
ïŒ
ScrollView
åŸç¶ïŒããããŸãã ã¹ã¯ããŒã«ã管çãïŒäºæããããã¡ãïŒïŒããºãŒã ãããŸãã
RankingView
ãããªã¹ããäœæããŸãã
RankingView

RankingView
ã¯ã©ã³ã¯ïŒå·ŠïŒãš
UsersView
ïŒå³ïŒã衚瀺ãããŸãã
UsersView

UsersView
ãã
UsersView
ããŠãŒã¶ãŒã®è¡šç€ºãšããŠãŒã¶ãŒãã°ã«ãŒãã«çµåããã³åé¢ããã¢ãã¡ãŒã·ã§ã³ã®è¡šç€ºã«åãçµãã§ããŸãã
GroupView

ãŠãŒã¶ãŒãšãŠãŒã¶ãŒã°ã«ãŒãã®äž¡æ¹ã
GroupView
ãšåŒã°ããåäžã®ãã¥ãŒã«è¡šç€ºãã
GroupView
ã ã°ã«ãŒãã§ã¯ãªã1人ã®ãŠãŒã¶ãŒã衚瀺ãããŠããå Žåã«ã®ã¿ãç·è²ã®åã¯ãããŸããïŒãã®äžã«ã°ã«ãŒãå
ã®ãŠãŒã¶ãŒæ°ã衚瀺ãããŸãïŒã ããŠãå³åŽã«ã¯ãïŒ
ãèšå·ã®ä»ãããŠãŒã¶ãŒ/ã°ã«ãŒãã¹ã³ã¢ã€ã³ãžã±ãŒã¿ãŒããããŸãã
ããããéå±ãªéšåã§ãç§ãã¡ã¯åé¡ã«ç®ãåããŸãã
ps ãçµè«ãã®ãœãŒã¹ãžã®ãªã³ã¯ã
2. Android SDKãããªããšã²ãŒã ããã¬ã€ãããã©Goog ...èŠã
ç¡å®³ãªç¶æ
ããå§ããŸãããã
2.1ã DataBinding
ã䜿çšããŠã«ã¹ã¿ã View
å
ã§ããŒã¯ã¢ãããèšåŒµããã
DataBinding
ãšãã®ã³ãŒãçæã¯é©ãã¹ãåããããŸãïŒ
WidgetGroupViewBinding binding; ⊠binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
ãã®ããŒã¯ã¢ãããã©ããªã«è€éã§ãã£ãŠããããŒã¯ã¢ããã«ç€ºãããŠãããã¹ãŠã®ãã¥ãŒã¯
id
ã«ãã£ãŠ2è¡ããã³
binding
倿°ãä»ããŠã¢ã¯ã»ã¹ã§ããŸãã ãã以äžïŒ
@ BindView (R.id.tb_progress) View loadingView; @BindView (R.id.tb_user) View userView; @BindView (R.id.iv_avatar) ImageView avatarView; @BindView (R.id.tv_name) TextView nameView; @BindView (R.id.l_error) View errorView; @BindView (R.id.l_container) ViewGroup containerLayout;
...ãããŠã
ButterKnife
ãããª12è¡ä»¥äžã ããããã¡ãã£ãšåŸ
ã£ãŠãã ããïŒ
setContentView()
ã¯
Activity
ã¡ãœããã§ãã ãããŠããã¥ãŒã¯äœãããŸãã
çŸåšã®ãã¥ãŒå
ã«ããŒã¯ã¢ããã远å ããã«ã¯ãã³ã³ã¹ãã©ã¯ã¿ãŒå
ãªã©ã§
inflate(getContext(), R.layout.my_view_layout, this)
ã¡ãœãã
inflate(getContext(), R.layout.my_view_layout, this)
ãåŒã³åºãå¿
èŠããããŸãã æåŸã®ãã©ã°ã¯è峿·±ãã§ãã çŸåšã®ãã¥ãŒã«ããŒã¯ã¢ãããã¥ãŒã
远å ããŸãã ããã«ãããããŒã¯ã¢ããã§äŸãã°
LinearLayout
ãªã©ã®ã«ãŒãã¿ã°ãããã
LinearLayout
ããç¶æ¿ããããã¥ãŒå
ã§
inflate(âŠ)
ã䜿çšããããšãããšãéå±€å
ã«2ã€ã®LinearLayoutãååŸãããŸã...
...ããã¯ã
LinearLayout
ã®1ã€ãåé·ã§ãããããå¿«é©ã§ã¯ãããŸããããéåžžã«è«ççã§ãã ã©ãããïŒ ãããåé¿ããã®ã¯ç°¡åã§ãã
ããã§èª¬æããããã« ãããŒã¯ã¢ããå
ã§
<merge>
ã䜿çšããŠããã¥ãŒå
ã«ããã¹ããã¹ãŠã®ãã®ã§ã©ããããå¿
èŠããããŸãã
ãããïŒ
DataBinding
ã¯
<merge>
ãµããŒãããŸããã ãã®ã«ãŒãã¿ã°ã¯
<layout>
ã§ããå¿
èŠãããããã®å
éšã«ã¯
<merge>
ã§ã¯ãªãåäžã®åèŠçŽ ãååšããå¿
èŠããããŸãïŒå®éã
<data>
ãååšããå¯èœæ§ããããŸãããããã¯ãŸã£ããå¥ã®è©±ã§ãïŒã
ãã®çµæãçŸæç¹ã§ã¯ã远å ã®ã¬ã€ã¢ãŠããäœæããã«ç¬èªã®ãã¥ãŒã§
DataBinding
ã䜿çšããæ¹æ³ã¯ãããŸãããããã¯ãããã©ãŒãã³ã¹ã«æè¯ã®åœ±é¿ãäžããŸããã ButterKnifeã¯ãŸã ç§ãã¡ã®ãã¹ãŠã§ãã
UPD ïŒ
code.google.comã§ã®æ©èœãªã¯ãšã¹ã ã
2.2ã æž¬å®ãšã¬ã€ã¢ãŠãã®ãã¹
ãã¥ãŒã®äœæçµéšããªãã£ãã«ããããããããã®ãããã¯ã«é¢ãã人ç®ãåŒãèšäºãæã
èªãã§ããã
ããã¥ãŒãã©ã®ããã«æããããããšãããããã¯ã«é¢ããããã¥ã¡ã³ãã®ã»ã¯ã·ã§ã³ãèŠãŸããã åŸè
ãä¿¡ãããªãããã¹ãŠãå¯èœãªéãåçŽã§ãïŒ
onMeasure()
æ°åonMeasure()
ãŠãµã€ãºã決å®ããŸããonLayout()
ã¯ãã³ã³ããå
ã«ã¢ã€ãã ãé
眮ããããã«åŒã³åºãããŸããonDraw()
ãåŒã³åºãããŠã¬ã³ããªã³ã°ãããŸãã
ãŸãéåžžã«ç°¡åã§ãã ãã®ãããç§èªèº«ã®èŠè§£ãå®çŸããããšã¯é£ãããªããšä¿¡ããŠããŸããã ããããããã¯ãããŸããïŒãã¿ãã¬ïŒèè
ã¯ãæ¬æã®åŸåã®onLayoutã¡ãœãããã倧ããªåé¡ãã€ããã§ãããïŒã ãã¥ãŒãäœæããåŸã«æšæž¬ãããã³ããšã«ãŒã«ã®ãªã¹ããæ¬¡ã«ç€ºããŸãã
onMeasure()
ã¯ãµã€ãžã³ã°ã®ã¿ãç®çãšããŠããŸãã ä»ã«äœããå
¥ããããšã¯å
šãæå³ããããŸããã ãã®çç±ã¯ãã¡ãœãããè€æ°ååŒã³åºãããã ãã§ãªãã onLayout()
åã«å床åŒã³åºãããããçŸåšã®èšç®ãµã€ãºãæçµãã©ããã確å®ã«å€æã§ããªãããã§ããããŸãã
- ããã€ãã®ä¿¡ããããªãçç±ã§ã«ã¹ã¿ã ãã¥ãŒã®èšäºã§èšåãããŠããªã
onLayout()
ã onLayout()
åã«åŒã³åºãããŸããã芪ã«ãã£ãŠåŒã³åºãããlayout()
ã¡ãœããå
ã§åŒã³åºãããŸãã äžçªäžã®è¡ã¯ã layout()
ãsetFrame()
ãåŒã³åºãããããonSizeChanged()
ãåŒã³åºããïŒ setFrame()
çµäºããåŸïŒ onLayout()
åŒã³åºãããããšã§ãã ã€ãŸãã onSizeChanged()
ã¡ãœããå
ã§ã¯ããã¥ãŒå
ã®ãã¹ãŠã®åãã¥ãŒãå¿
èŠã«å¿ããŠé
眮ãããŠãããšããäºå®ã«äŸæ ããããšã¯ã§ããŸããã ããã«ã onSizeChanged()
ã¯onSizeChanged()
ã onSizeChanged()
ãŸã åŒã³åºãããŠããŸããã
onLayout()
å
ã§onLayout()
èªåã§measureChildren()
åŒã³åºãããšãã§ããŸãã ã€ãŸããå¿
èŠã«å¿ããŠã枬å®ãã¹ãããã«æ°åå®è¡ã§ããŸãã
onLayout()
ã®æåŸã®ã¡ãœããã¯ã onLayout()
ãæ®ãã»ãonLayout()
è¯ãã§ãã ãã以å€ã®å Žåã¯ãåãã¥ãŒãonSizeChanged()
ã§2åonSizeChanged()
åŒã³åºãããç¶æ³ãäœæã§ããŸãã éãæªãå Žåã¯ãå®å
šã«ã«ãŒãããŠã16msïŒçµå±60 fpsïŒ requestLayout()
ãåŒã³åºãããããã«ããããšãã§ããŸãïŒãã¿ãã¬ïŒäœè
ã¯ããã§èªåèªèº«ãæã¡ãŸããããããã«ã€ããŠã¯åŸã§è©³ãã説æããŸãïŒ
ãã¥ãŒã®ãããã¯ã«ã€ããŠèªãã èšäºã§ã¯ããããã®ã¡ãœããã®ãã®ãããªèª¬æãèŠãããšã¯ãããŸããã ããã«ééããªããããããã«ã¹ã¿ã ãã¥ãŒã¯ã©ãã®æåã®ã«ãŒã«ã§ã
onLayout()
ïŒé€å€;äœ¿çšæžã¿ïŒã«ã€ããŠã¯è©±ããªãã§ãã ããã
ç§ã®å Žåã
UsersView.onLayout()
å
ã§ããã¥ãŒã®Y座æšãå€åããŸããããã«ãããäžéšã®ãã¥ãŒã衚瀺ãããä»ã®ãã¥ãŒãé衚瀺ã«ãªãã...ã«ã€ãªãããŸãïŒå³äžã«æ³šæïŒã
...åºé¢å³ãã¯ãªããããŸãã ããã¯é ãé¢ãããšããã§ã®ã¿èµ·ãããŸããã ç§ã¯æãã«ããããåããªããã°ãªããŸããã§ããããåšã®ãã¥ãŒã¯ãçŸåšã®äœçœ®Yã§ã¯èŠªã«ååãã衚瀺ãããªããšå€æããããã§ãããããã£ãŠã
Bitmap drawingCache;
ããªãã³ã°ã§ããŸã
Bitmap drawingCache;
ã ããã§ã
measureChildren()
å
ã®
onLayout()
ã®åœ¢ã§ãéåžžã«è¿œå ã®ã枬å®ãã¹ããå©ãã«ãªããŸãããããã«ããããã¥ãŒã¯Y座æšã倿ŽããåŸã«ãã£ãã·ã¥ã忀èšããŸããã
2.3ã ScrollView
ã¯åã®ScrollView
èš±å¯ããŸãã
ãããããããªãã®å€ãã¯ã
layout_height=match_parent
ScrollView
èŠçŽ ã®é«ããèšå®ããå¿
èŠã«ééããå³åº§ã«å€±æããŸãããçµæã¯
wrap_content
å Žåãšåãã§ãã£ãããã
fillViewport
ãã©ã°ã®èª¬æããã
ãã®ãããªèšäºãèŠã€ããŸã
ããïŒ ãããŠä»ã質åïŒ
fillViewport
ãã©ã°ãšåãçµæãéæããããåã®é«ããåçã«å€æŽããæ¹æ³ã¯ïŒ
é çªã«è¡ããŸãããã èŠçŽ ã®é«ããã©ã®ããã«å€æŽã§ããŸããïŒ ãã¡ããã
LayoutParams.height
ãéããŠããã以äžäœãããŸããã åé¡ã¯è§£æ±ºããŸãããïŒ ãã é«ãã¯å€æŽãããŠããŸããã ã©ãããã®ïŒ åãã¥ãŒã§
onMeasure()
ãæ€èšããçµæã
ScrollView
åã«ãã©ã¡ãŒã¿ãŒã®èšå®
height
ãã
height
ãç¡èŠãããŸãã
UNSPECIFIED
ãã«çãã
mode
onMeasure()
ãéä¿¡ããæ¬¡ã«ã
EXACTLY
ãããã³
height
å€ã§
onMeasure()
ãéä¿¡ãããšããçµè«ã«éããŸããã
ScrollView
ã®ãµã€ãºã«çããïŒ
fillViewport
èšå®ãããŠããå ŽåïŒã ãŸã
height
ãã¥ãŒã®
height
ã倿Žããå¯äžã®æ¹æ³ã¯ãã®
LayoutParams
ã倿Žããããšãª
LayoutParams
ãåã¯å€æŽãããŸããã
ç§ã¯2ã€ã®è§£æ±ºçãèŠã€ããŸããïŒ
ScrollView
éåžžã«LayoutParams
ã LayoutParams
ãç¡èŠããããã onMeasure()
ã¡ãœãããæžãæããŠã onMeasure()
ã远å ããããšãã§ããŸãã
if (MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.UNSPECIFIED && getLayoutParams().height > 0) { heightMeasureSpec = MeasureSpec.makeMeasureSpec( getLayoutParams().height, MeasureSpec.EXACTLY); }
ãããã£ãŠã ScrollView
ã圌ã®ããã«æ©èœãããŸãã ããããããã®ããã«æ¯åãµãã¯ã©ã¹ãäœæããã®ã¯èªç¶ã§ã-è¯ãèãã§ã¯ãããŸããã åFrameLayout
ãã©ã®ã¯ã©ã¹ã§ããå¿
èŠããããã¯ããããŸããïŒ FrameLayout
ã LinearLayout
ã RelativeLayout
ãªã©ã å¯èœãªåLayout
ãšãµãã¯ã©ã¹ã«å¯ŸããŠè¡ãã«ã¯-ãã¿ã ãããã£ãŠãããã«ãœãªã¥ãŒã·ã§ã³çªå·2ããããŸãã
- åã
FrameLayout
ã©ãããããã®FrameLayout
åã®ãµã€ãºã倿ŽããŸãã
ç§ã䜿çšãããã®ã¢ãããŒãçªå·2ããããŠããã¯ãã¿ã³ãšåããã ãã ãããããæ¬åœã«æå¹ãªæ¹æ³ïŒããã¯ïŒãã©ããã¯ããããŸããã 远å ã®
FrameLayout
㯠FrameLayout
å°éããããããããããã®ããã¯ã¯æ©èœããŸãããã
ScrollView.onLayout()
å
ã§ã¯
ãããã ScrollView.onLayout()
ã²ãŒã ãçºçããåã®ãµã€ãºãéšåçã«ããèšç®ããŸããã ããã¯åãªãæšæž¬ã«éããŸããããã¹ã¯ããŒã«ã®åé¡ã説æããããšã¯ã§ããŸããïŒãã¿ãã¬ïŒåé¡ã«ã€ããŠã¯åŸã§èª¬æããŸãïŒã
ããããã
ScrollView
ã«ã¯ãã°ãã©ãã«ãŒäžã®åäŸã®äžå€ã®ãµã€ãº
ã«åé¡ããããŸãããAndroidã§éåžžçºçããããã«ã2014幎以éã¯æ°ããã¹ããŒã¿ã¹ã®ãŸãŸã§ãã
2.4ã background
è¿ãã®äžžãè§
被éšè
ïŒå·Šäžãšå·ŠäžïŒïŒ
ããã¯ãã£ãšç°¡åã«èŠãããããããŸãã-
<shape>
ã§
drawable
ãã
background
ãèšå®ããã°
drawable
ã§ã... ã¿ã¹ã¯ã¯ãè²ãããã°ã©ã ã§å€æŽãããäžžã¿ã垯ã³ããšããžãæåãšæåŸã®èŠçŽ ã«ã®ã¿è¿œå ãããããšã§ãã
å¥åŠãªããšã«ã
ShapeDrawable
ã¯ã©ã¹ã«
ShapeDrawable
ãäºæ³ãããããã«äžžãè§ãæäœããããã®ã¡ãœããããããŸããã ãããã幞ããªããšã«ã
RoundRectShape
ãš
PaintDrawable
çžç¶äºº
ïŒãã®ã¯ã©ã¹ãå¿
èŠãªçç±-å°ããªãã§ãã ãããããªãã¯ã·ã§ãã¯ãåããŠããŸãïŒã«ã¯ãæ¬ èœããŠããã¡ãœããããããŸãã ããã«ãããã»ãšãã©ãã¹ãŠã®ã¢ããªã±ãŒã·ã§ã³ã®åé¡ã¯è§£æ±ºããããšèŠãªãããŸããããã®ã¿ã¹ã¯ã®åé¡ã§ã¯ãããŸããã
ã¿ã¹ã¯ã®è©³çްã¯ãæå€§ã®
zoom in
ãäœã§ãå¯èœã§ãããšããããšã§ããã€ãŸãã
background
ãã¥ãŒãåŒã䌞ã°ããã...
Logcat: W/OpenGLRenderer: Path too large to be rendered into a texture
äžå®ã®ãµã€ãºãè¶
ãããšã
background
ã衚瀺ãããªããªãã ãã§ãã èŠåãããããããã«ãäžéšã®
Path
倧ããããŠãã¯ã¹ãã£ã«æç»ã§ããŸããã æ
å ±æºãå°ã調ã¹ãŠã¿ããšããã®åå¿ããã¹ãŠã責ããããšã«ãªã£ãŠãããšããçµè«ã«éããŸããã
canvas.drawPath(mPath, paint);
...
mPath
è§äžžé·æ¹åœ¢ãé
眮ãããŸãã
mPath.addRoundRect(mInnerRect, mInnerRadii, Path.Direction.CCW);
ãã®åé¡ã解決ããã«ã¯ãããšãã°
ColorDrawable
ãç¶æ¿ãã
drawPath()
åŒã³åºããã«
draw()
ã¡ãœãããåŒã³åºããŸãã
canvas.clipPath(roundedPath);
ããããæ®å¿µãªããããã®ã¢ãããŒãã«ã¯æ¯èŒçéå€§ãªæ¬ ç¹ããã
canvas.clipPath()
ïŒ
canvas.clipPath()
ã¢ã³ããšã€ãªã¢ã¹ã®åœ±é¿ãåããŸãã ã ãã ãããããè¡ãå¥ã®æ¹æ³ããªãå Žåãããã«æºè¶³ããå¿
èŠããããŸãã
2.5ã FrameLayout
å
ã«View
ãFrameLayout
UsersView
ãå®è£
ããããšãããšããã®ã¿ã¹ã¯ã«çŽé¢ããŸããããã®äžã§ãGroupViewã¯OYè»žã«æ²¿ã£ãä»»æã®å Žæã«é
眮ã§ããŸãã
æåã«æãæµ®ããã ã®ã¯ïŒãããŠ
FrameLayout
å
ã§ãã¥ãŒãç§»åããå¯äžã®å¯èœãªæ¹æ³ã ãšæã£ãããšïŒã
topMargin
ã䜿çšããŠ
topMargin
ãã©ã¡ãŒã¿ãŒã倿Žããããš
topMargin
ã ããã¯ãstackoverflowã«å¯Ÿããã»ãšãã©ã®åçïŒ1ã2ã3ïŒã«ãã£ãŠèšŒæãããŠããŸãã
ãã®ã¢ãããŒãã®æ¬ ç¹ã¯ã
LayoutParams
ã倿Žãããš
requestLayout()
ãåŒã³åºãããããšã§ããããã¯ãã¬ã€ã¢ãŠããã¹èªäœãããè¯ãæéïŒæ¬¡ã®16msãã¬ãŒã ïŒãŸã§é
å»¶ããŠããç¹ã«
GroupView
å
ã®ãã¹ãŠã®
GroupView
ã«å¯ŸããŠåŒã³åºãããå Žåãéåžžã«é«äŸ¡ãªæäœã§ãã
ãããã幞ããªããšã«ãå¥ã®æ¹æ³ããããŸã
View.setY()
ïŒ
stackoverflowãžã®åç ïŒã ã¢ãã¡ãŒã·ã§ã³ããäžå€ã®
Layout
å
ã®åäŸã«æé©ã§ãã
requestLayout()
åŒã³åºããŸãããããã¥ãŒèªäœã®ãã£ãŒã«ãã®ã¿ã䜿çšããïŒãã¹ïŒã¬ã€ã¢ãŠãã®ãã§ãŒãºã®ã¿ã«åœ±é¿ããŸãã ãŸããæ°ãããã¥ãŒäœçœ®ã®èšç®
onLayout()
ã¯ã
onLayout()
ãåŒã³åºãåã«
onLayout()
çŽæ¥è¡ãããããã
requestLayout()
ã¯ãŸã£ããå¿
èŠãããŸããã
2.6ã ãã©ã³ãã®ã€ã³ãã³ãã確èªããŸããïŒ ããïŒ ãããŠåœŒãã¯ããªããèŠãïŒ Â© includeFontPadding
ãŠãŒã¶ãŒãã°ã«ãŒãã«çµåããããšãã°ã«ãŒãå
ã®ãŠãŒã¶ãŒæ°ã衚瀺ããã¢ã€ã³ã³ã远å ãããŸãã åœŒå¥³ã¯æ¬¡ã®ããã«ãªããŸãã

ãããŠãããã圌女ã®ä»¥åã®å§¿ã§ãã

éãã«æ°ã¥ããŸãããïŒ 2æç®ã®åçãèŠããšäžå¿«æã¯ãããŸããïŒ ãããããªããããªãã¯ç§ãçè§£ããŠããŸãã é·ãéããã®ã¢ã€ã³ã³ãèŠããšãæã£ãã»ã©é
åçã«èŠããªãçç±ãçè§£ã§ããŸããã§ããã ãã€ã³ããæŸã£ãŠãããã¹ãã®å·Š/å³/äž/äžã®ãã¯ã»ã«æ°ãèšç®ãããšæšæž¬ããŠãç§ã¯çç±ãçè§£ããŸãã-ããã¹ãã¯äžå€®ã«é
眮ãããŠããŸããã ããã¹ãã®éèŠæ§ã«é¢ããŠæããã«äœããééã£ãŠããŸãã ã¯ãïŒ..ããã éåãæ£ããèšå®ãããä»ã®ãã©ã¡ãŒã¿ãŒãèšå®ãããŸããã ãã¹ãŠãå®ç§ã«èŠããŸããã
äžè¬ã«ãç§ã¯èŠããããšã¯ãããŸããã解決çã¯éåžžã«ç°¡åã§ããããšã倿ããŸããããããããŸã£ããçè§£ããŠããªãã£ããšããçç±ã ãã§ããã«èŠã€ããããšãã§ããŸããã§ããã ãšããã§ããã
ã«ããœãªã¥ãŒã·ã§ã³ãžã®ãªã³ã¯ããããŸã ã èŠããã«ããã©ã³ãèªäœã«ã¯ããã£ã³ã°ãããããããéäžå€®æãã®çç±ã§ããã
includeFontPadding=false
ãã©ã¡ãŒã¿ãŒã
TextView
ã«è¿œå ãããšãåé¡ã¯å®å
šã«ãªããªããŸããã
2.7ã ViewPropertyAnimator
ã¯reverse()
ã¡ãœããããããŸãã
ã©ã³ã¯ã¢ã€ã³ã³ãç¹å®ã®ãµã€ãºã§é衚瀺ã«ããã¢ãã¡ãŒã·ã§ã³ãäœæãããã£ãã®ã§ãã æ¬¡ã®ããã«ãªããŸãã
ã¢ãã¡ãŒã·ã§ã³ã®éå§æéãæ±ºå®ããã«ã¯ãçŸåšã®ãµã€ãºããã¹ãŠã®ãã¥ãŒã«åãããŠå¿
èŠãªãµã€ãºãšæ¯èŒããå¿
èŠã«å¿ããŠ
view.animate().setDuration(fadeDuration).alpha(0 or 1)
ãŸãã
ãã ããããã¯é«é
fade
ã¢ãã¡ãŒã·ã§ã³ã§ã®ã¿æå¹ã§ãã ãã ãã
fade
ãé
ãå Žåã
zoom out
åŸã«ã·ã£ãŒãã«
zoom in
ãšããã¥ãŒã®ã¢ã«ãã¡ãã£ãã«ã¯1ãŸãã¯0ã§ã¯ãªããããšãã°0.5ã«ãªããŸãã ãã®ãããã¢ãã¡ãŒã·ã§ã³ã¯åã
fadeDuration
ã«å¯ŸããŠ0.5ãã0ãŸã§åçãããŸãã ã¢ãã¡ãŒã·ã§ã³ã2åé
ããªã£ãããã«èŠããŸãã
view.animate()
åŒã³åºãåã«
view.setAlpha(0 or 1)
ãããªãã®ã远å ããã®ã¯è¯ã解決çã§ã¯ãããŸããã ãã¥ãŒã¯é«éãºãŒã ã§ã¡ãã€ãå§ããŸãã
çæ³çã«ã¯ã
setReverseDuration()
ïŒãã©ã¡ãŒã¿ãªã
setReverseDuration()
ã®åœ¢åŒã®ã¡ãœãããããã¯ãã§ããããã¯ããããã
fade
ã¢ãã¡ãŒã·ã§ã³ã500
setReverseDuration()
åçããã®ã§ããªããŒã¹ã¢ãã¡ãŒã·ã§ã³ãåãéãåçããŸããã ããããããã¯æ®å¿µãªããšã§ã¯ãããŸããã ç§ãèŠã€ããå¯äžã®æ¹æ³ã¯ããã³ã§ãã®ãããªããšãããããšã§ããã ç§ã®å Žåãã¢ãã¡ãŒã·ã§ã³ã¯éåžžã«ã·ã³ãã«ã ã£ãã®ã§ãããã§ç§ã¯é衚瀺ã«ã§ããŸããïŒ
final float realDuration = iconView.getAlpha() * animationDuration;
...ãããŠããã¯ã·ã§ãŒã®ããã«ïŒ
final float realDuration = (1 - iconView.getAlpha()) * animationDuration;
ããã§ã¯ããã€ãã®ããã«ïŒ
view.animate().setDuration((long) realDuration)
-ããã ãã§ãã
UPD ïŒ
code.google.comã§ã®æ©èœãªã¯ãšã¹ã ã
2.8ã ScaleGestureDetector
ïŒå¥åããã³ãããå¥åããºãŒã ãïŒ
ScaleGestureDetector
API
ScaleGestureDetector
éåžžã«åªããŠã
listener
ããã³ã°ãããŠã€ãã³ããåŸ
æ©ãããã¹ãŠã®
onTouchEvent()
ãã£ãã¯ã¿ãŒèªäœ
onTouchEvent()
æž¡ã
onTouchEvent()
ãã ããã ãããããã¹ãŠãããã»ã©ãã©è²ã§ã¯ãããŸããã
2.8.1ã å°ããªã¡ã¢
ãŸãã ScaleGestureDetector
èªäœãš
ScaleGestureDetector
éã§
onTouchEvent()
ã€ãã³ããåºå¥ããæ¹æ³ã¯ã©ãã«ãèšèŒãããŠããŸããïŒçµå±ã
ScrollView
ã®åå«ã§ãã
RankingsListView
å
ã§çºçããŸãïŒã ãã®çµæãã¡ãœããã¯æ¬¡ã®ããã«ãªããŸãã
@Override public boolean onTouchEvent(MotionEvent ev) { scaleDetector.onTouchEvent(ev); super.onTouchEvent(ev); return true; }
ãããã£ãŠããã¹ãŠã®stackoverflow-answersïŒ
äŸ ïŒãå®è¡ããããšããå§ãããŸãã ãã ãããã®ã¢ãããŒãã«ã¯æ¬ ç¹ããããŸãã ãã³ãããŠãã¹ã¯ããŒã«ã¯çºçããŸãã äºçްãªããšã®ããã«æãããããããŸããããå®éãèŠæ ããããããããšãããšãã«èª€ã£ãŠãã¥ãŒãããã£ãŠããŸãã®ã¯éåžžã«äžå¿«ã§ãã
super.onTouchEvent()
ãš
scaleDetector.onTouchEvent()
éã®è²¬ä»»ãåºå¥ããè€éãªãœãªã¥ãŒã·ã§ã³ãæ¢ãããã®é·ããŠéå±ãªæ€çŽ¢ãæ¢ãæºåãã§ããŠããŸãã...ãããŠå®éã«æ€çŽ¢ããŸãã...ããããçµæã¯éåžžã«ã·ã³ãã«ã§ããïŒ
@Override public boolean onTouchEvent(MotionEvent ev) { scaleDetector.onTouchEvent(ev); if (ev.getPointerCount() == 1) { super.onTouchEvent(ev); } return true; }
çŽ æŽãããã§ãã
super.onTouchEvent()
ã¯ãæåã«
super.onTouchEvent()
ã
id
æã®
id
远跡ããªããããæ1ã§ã¹ã¯ããŒã«ãéå§ããæ2ã§ã¹ã¯ããŒã«ãçµäºããŠãã倧äžå€«ã§ãã æ®å¿µãªãããAndroid SDKãåã³ãã€ãŒã«ã«ã¹ãã£ãã¯ãå
¥ããããšã確信ããŠããã®ã§ããœãŒã¹ãã°ãŒã°ã«ã§èª¿ã¹ãŠã¿ãŠãããã詊ããŠã¿ãŸããã ç§ãèšããããšã¯ãAndroid SDKã¯
æã«ã¯é©ã
ãšããŠæ©èœããããšã§ãã
第äºã« ãããããªãããã¯ãæé©åçŸæ£ã«èŠããã§ãããªããããªãã¯åäŸã®æèŠã®ââ倧ãããæ³šææ·±ãç£èŠããå¿
èŠããããŸãã æ¢ã«ãåç¥ã®ããã«ããã³ãã§
ScrollView
åã®å
åŽã®åã®é«ãã
ScrollView
ãŸãã ãã®åã¯
LinearLayout
ããã®åã¯
layout_weight=1
èšå®ãããŸãã èšãæãããšããããã¯ãã¹ãŠåãé«ãã§ã...ã§ã¯ãããŸããã
ããã¯ãŸã£ããç®ç«ã€ããšã¯ãããŸãããããã¯ã»ã«ã¯åååäœã§ããããããã®åãã¥ãŒã¯åžžã«åãé«ãã«ãªããšã¯éããŸããã ã€ãŸãã
LinearLayout
ã®é«ãã1001ã§ãåã2ã€ããå Žåããã®ãã¡ã®1ã€ã¯501ã§ããã1ã€ã¯500ã§ãããããç®ã§ç¢ºèªããããšã¯ã»ãšãã©äžå¯èœã§ããã鿥çãªçµæãçããå¯èœæ§ããããŸãã
ViewPropertyAnimator
ãš
reverse()
ã«ã€ããŠè©±ãããšããã©ã³ã¯ã¢ã€ã³ã³ãé衚瀺ã«ããã¢ãã¡ãŒã·ã§ã³ã瀺ããŸããã ãã§ãã¯èªäœã¯ç°¡å
TextView
ã2ã€ã®
TextView
ãš
ImageView
é«ãã
onLayout()
ã«ãŸãšããããããäžåºŠã«çŸåšã®ãã¥ãŒã«åãŸããªãå Žåã¯ã
fade
ã®
ImageView
é衚瀺ã«ã
ImageView
ã ãŸãããã®åèšã®é«ãïŒãããããé«ãã®ãããå€ãïŒãå€ãããªãããšã«ã泚æããŠãã ããã ãã®çµæããããå€ã500ãã¯ã»ã«ã®å Žåã説æãããŠããã±ãŒã¹ã§ã¯ã500ãã¥ãŒãµã ãã€ã«ã®1ã€ãã¢ã€ã³ã³ã§é衚瀺ã«ãªãã2çªç®ã®501ãµã€ãºã¯é衚瀺ã«ãªããŸãã
ç¶æ³ã¯ãŸãã§ãããããŸãéèŠã§ã¯ãããŸããïŒé衚瀺ã§ãªãã¢ã€ã³ã³ãšé衚瀺ã®ã¢ã€ã³ã³ãåæã«æ€åºããããã«ããŠã¹ãéåžžã«ãã£ããåããã®ã¯ããã»ã©ç°¡åã§ã¯ãããŸããã§ããïŒé£ããã¯ãããŸããã§ããïŒïŒã ãã ãããã®åäœãæ°ã«å
¥ããªãå Žåã¯ãä¿®æ£ããæ¹æ³ã¯1ã€ãããããŸãã
getHeight()
ã䜿çšããŠãããå€ãšç
§åããªãã§ãã ããã
onSizeChanged()
å
ã®
onSizeChanged()
ããã¹ãŠã®åã®æå°ãµã€ãºãèŠã€ããå
šå¡ã«ãã®æ°å€ãšãããå€ãæ¯èŒããããéç¥ããŸãã ç§ã¯ããã
shared height
ãšåŒã³ãç§ã«ãšã£ãŠã¯ãã®ããã«èŠããŸãïŒ
private void updateChildsSharedHeight() { int minChildHeight = Integer.MAX_VALUE; for (int i = 0; i < binding.lRankings.getChildCount(); ++i) { minChildHeight = Math.min(minChildHeight, binding.lRankings.getChildAt(i).getMeasuredHeight()); } for (int i = 0; i < binding.lRankings.getChildCount(); ++i) { RankingView child = (RankingView) binding.lRankings.getChildAt(i); child.setSharedHeight(minChildHeight); } }
ãŸãããããå€ãšã®èª¿æŽèªäœã¯æ¬¡ã®ãšããã§ãã
int requiredHeight = binding.tvScore.getHeight() + binding.tvTitle.getHeight() + binding.ivIcon.getHeight(); boolean shouldHideIcon = requiredHeight > sharedHeight;
UPD ïŒ
code.google.comã§ã®æ©èœãªã¯ãšã¹ã ã
2.8.2ã åé¡
ãããŠã
ScaleGestureDetector
ã«ã€ããŠã®
ScaleGestureDetector
ã§ã¯ãªãããã®åé¡ã«ã€ããŠè©±ããŸãããã
2.8.2.1ã æå°ãã³ã
I and and and and and and and and-fro ...åœŒïŒæå°ãã³ãïŒã¯ç¡å¹ã«ãªããŸããã ã³ãŒãã£ã³ã°äžã«ãããã³ããããªã¬ãŒããããã®æå°è·é¢ãã«ã€ããŠã¯ãŸã ç¥ããŸããã§ããã®ã§ããã°ãå°ã調ã¹ãŠããããã³ãŒãã®åŠšå®³ãäœãã確èªããå¿
èŠããããŸããã ãã°ã«ããã°ãæã®éã®è·é¢ã510ãã¯ã»ã«æªæºã®å Žåã
ScaleGestureDetector
åã«ã¿ãããžã®å¿çã忢ãã
onScaleEnd()
ã€ãã³ããéä¿¡ããŸãã äœããã®çš®é¡ã®ãæå°éã®ãã³ããããããšããæ
å ±ã¯ãããã¯ã«ãã¹ã¿ãã¯ãªãŒããŒãããŒã«ãååšããŸããã§ããã ãšãã¥ã¬ãŒã¿ã§ãããã°ãè¡ãããªãã£ãå Žåãããããç§ã¯ããã«æ°ä»ããªãã§ãããã ãã®äžã§ããã³ãè·é¢ã¯å°ãªããšãããªã¡ãŒãã«ã§ããå¯èœæ§ãããããããåé¡ã«é¢ããæ
å ±ãèŠã€ããçç±ãšãªããŸããã ããããããã¯ç§ãæã£ãŠãããããã£ãšè¿ãããšãããããŸããã
mMinSpan = res.getDimensionPixelSize(com.android.internal.R.dimen.config_minScalingSpan);
ãããŠããããŠããããŠããããŠããããŠããããŠããããŠããããŠããããŠããããŠããããŠãã¹ã«ãŒãéããŠ
com.android.internal.R.dimen.config_minScalingSpan
ãã¡ããããã®ã¯ã©ã¹ã¯ããã®ãã£ãŒã«ãã倿Žããæ¹æ³ãæããããã¡ããã
com.android.internal.R.dimen.config_minScalingSpan
ã¯ãéæ³ã®27mmã«çãã ç§ã«ãšã£ãŠãæå°éã®ãã³ãã®ååšã¯éåžžã«å¥åŠãªçŸè±¡ã®ããã§ãã ãã®ããã«æå³ããã£ããšããŠããããã倿Žããæ©äŒãäžããŠã¿ãŸãããïŒ
éåžžã®åé¡ã®è§£æ±ºçã¯ããªãã¬ã¯ã·ã§ã³ã§ãã
2.8.2.2ã åé
ãç§ãã®ãããªããããããäœã§ããããç¥ããªã人ã®ããã«ãç§ã¯ç¿»èš³ããŸãïŒ
ã¹ããã-ãã³ã»ã³ã¹ããã³ã»ã³ã¹Â©ABBYY Lingvo
ããŠãåè«ã¯ããŠããããã¹ãããããšã¯ããŠãŒã¶ãŒã誀ã£ãŠç»é¢ã«è§ŠããŠãå®éã«ç§»å/ã¹ã¯ããŒã«/ãºãŒã /ãã®ä»ã®ãã®ãæãã§ããªããšæãããç¶æ
ã§ããäžçš®ã®ãå¶çºçãªåãã«å¯Ÿããä¿è·ããGIFã®èª¬æïŒ... gifã§ã¯ããã³ãã®éå§åã«ããã³ããšã¯èŠãªãããªãæå°éã®åããèš±å¯ãããŠããããšãããããŸããååãšããŠãè¯ãããšã«å ããŠãããã...ã¹ãããã倿Žã§ããŸããïŒScaleGestureDetector
次ã®ããã«èª¬æããŸãã mSpanSlop = ViewConfiguration.get(context).getScaledTouchSlop() * 2;
...ãªã©ViewConfigeuration
ïŒ mTouchSlop = res.getDimensionPixelSize( com.android.internal.R.dimen.config_viewConfigurationTouchSlop);
ãã®æå³ã¯ã©ãããæ¥ãã®ã§ããïŒ ãªãã§ïŒ ãªãã§ïŒ
ããã¯äžæã§ã...äžè¬çã«ãAndroid SDKã¯æé«ã®ãªãã¬ã¯ã·ã§ã³ãã¥ãŒããªã¢ã«ã§ããUPDïŒcode.google.comã®Slop / Spanã®æ©èœãªã¯ãšã¹ãã2.8.2.3ãdetector.getScaleFactor()
æåã®ãã³ãã¬ãŒã¹
ã€ãã³ãå
onScale(ScaleGestureDetector detector)
ã§éä¿¡ãããdetector
ã¡ãœããã䜿çšdetector.getScaleFactor()
ããŠãã³ãä¿æ°ãèŠã€ããããšãã§ããŸãããããã£ãŠãæåã®ãã³ãã§ã¯ããã®ã¡ãœããã¯å¥åŠãªãžã£ã³ãã®ãããªå€ãè¿ããŸããå³å¯ãªç§»åäžã®å€ã®ãã°ã¯zoom out
次ã®ãšããã§ããèŠãç®ã¯ãããã»ã©ã§ã¯ãããŸãããããã¥ãŒã®ãµã€ãºã¯åžžã«ãŽããŽãããŠããŸãããã¢ãã¡ãŒã·ã§ã³ã§ãããã®ãžã£ã³ããã©ã®ããã«èŠããã¯ãå®å
šã«çç¥ããæ¹ãè¯ãã§ããããé·ãéãç§ã¯åé¡ãäœã§ããããçè§£ããããšããŸãããå®éã®ããã€ã¹ã§ç¢ºèªãïŒçªç¶ããšãã¥ã¬ãŒã¿ãŒã®åé¡ãçºçããããšã¯ããããŸããïŒãç«ã1ããªã¡ãŒãã«äœåã«æ»ãã§ãããã®ããã«ããŠã¹ãåãããŸããïŒãŸã£ããããããªãã®ã§ãçªç¶ãããããããŠããã°ãèšé²ããŸãïŒ-ããããããã§ã¯ãããŸãããçãã¯èŠã€ãããŸããã§ãããã幞éã§ãããããã«ããŒã¶ãŒããããšèšãããã«ãã€ãã³ãã«éãããšã決ããŸãã0.958
0.987
0.970
1.009
0.966
0.967
1.006
. > 1
ScaleGestureDetector
MotionEvent.ACTION_CANCEL
åæåçŽåŸïŒ scaleDetector = new ScaleGestureDetector(getContext(), new ScaleListener()); long time = SystemClock.uptimeMillis(); MotionEvent motionEvent = MotionEvent.obtain(time - 100, time, MotionEvent.ACTION_CANCEL, 0.0f, 0.0f, 0); scaleDetector.onTouchEvent(motionEvent); motionEvent.recycle();
...ãããŠããã¯O_oã®å©ãã«ãªããŸãã...ïŒãœãŒã¹ã³ãŒããAndroid SDKã§ïŒãããã調ã¹ãŸããããœãŒã¹ã³ãŒãã§ã¯ãæåã®ãã³ãã«ã¯ã¹ãããããããŸããã§ããïŒã¯ããããã¯äžèšã®ãã®ã§ãïŒããªããããªã®ã-ç§ã«ãšã£ãŠã¯ããã®ããã¯ãå©ããã®ãšåãããã«ãè¬ã®ãŸãŸã§ããããããã圌ãã¯åæåã§æ±ºå¿ããã©ããã§ãã¯ã©ã¹ã®äžéšã¯æåã®ãã³ãããã§ã«ã¹ããããã¹ãã«åæ Œãããšèããä»ã®éšåã¯ããã§ã¯ãªããšèãããã®çµæããåæ Œ/倱æãã¿ã€ãã®ç±ãæŠãã®ç±äžã«ããããã¯\ _ïŒãïŒ_ /¯©SDKUPDïŒcode.google.comã®ãã°ã¬ããŒãã2.9ãScrollView.setScroll()
åŸã«ã®ã¿åäœãsuper.onLayout()
ãŸããïŒ
ScrollView
åã©ããã¡height
ã®éåãç¡èŠããåé¡ã«æ»ããŸããç¶æ³ã¯æ¬¡ã®ãšããã§ãããã³ããçºçãããšããã«ãçŸåšã®ãã©ãŒã«ã¹ïŒããŠã¹ãã¯ãªãã¯ããå ŽæãšãºãŒã ãè¡ããã€ã³ãïŒãåããŸãŸã«ããããšæããŸãããªãã§ïŒ
ã¡ããã©ãã®ããã«ããºãŒã ã¯ãããŠãŒã¶ãŒãã¬ã³ããªãŒã«èŠããŸããåèŠçŽ ã®é«ãã倿Žããã ãã§ãªããä»ã®ãã¹ãŠã®ãŠãŒã¶ãŒã圌ããé¢ããéã«ãäžéšã®ãŠãŒã¶ãŒã«ãºãŒã ã€ã³ããããšãèæ
®ããŠãã ãããããã¯é£ããããšã§ã¯ãããŸãã確èªããŸãScaleGestureDetector.getFocusY()
ãšScrollView.getScrollY()
ãããããScrollView.setScrollY(newPosition)
ãåžœåã®äžã§ãããè¡ãã®ã«ååã§ããããã«æãããŸã...ãããããããããã¥ãŒã¯æãäœãåèŠçŽ ãžã®ãºãŒã ã§å¥åŠã«ã²ãã€ãå§ããŸãïŒããã§è§£æ±ºçãèŠã€ãããŸãããæ¬¡ã®ããã«ãªããŸãïŒå®è¡ããæç¹ã§setScroll()
ãã¹ã¯ããŒã«äœçœ®ãåèŠçŽ ã®ãµã€ãºãè¶
ããŠããªããã©ããã確èªããè¶
ããŠããå Žåã¯å¯èœãªæå€§äœçœ®ãèšå®ããŸãããŸããsetScroll()
ãºãŒã ã§åŒã³åºããããããæ¬¡ã®äžé£ã®ã¢ã¯ã·ã§ã³ãååŸãããŸãã- newHeightã®ã«ãŠã³ã
- newScrollPosã®ã«ãŠã³ã
- setLayoutParamsïŒïŒã§newHeightãèšå®ããŸã
- setScrollïŒïŒã§newScrollPosãèšå®ããŸã
åé¡ã¯æ®µèœçªå·3ã«ãããŸãã宿°height
ã¯æ¬¡ã®å€ãŸã§å€æŽãããªãsuper.onLayout()
ãããsetScroll()
æåŸ
ãããããšã¯å®è¡ãããŸããã以äžã®ããã«ä¿®æ£ãããŸãã代ããã«ãsetScroll()
ãããè¡ããŸãïŒ nextScrollPos = newScrollY;
...ãããŠonLayout()
afterã¡ãœããã§super.onLayout()
ãã®ã¡ãœãããåŒã³åºããŸãïŒ private void updateScrollPosition() { if (nextScrollPos != null) { setScrollY(nextScrollPos.intValue()); nextScrollPos = null; } }
èŠããŠããããã«ãã®åŸã«ã¡ãœãããåŒã³åºããªãæ¹ãè¯ããšæžããŸããsuper.onLayout()
ãããã¯ãŸã äºå®ã§ããåŸã§ããã®ãœãªã¥ãŒã·ã§ã³ã«é¢é£ããå¥ã®åé¡ã«ã€ããŠèª¬æããŸããããããäºå®ã¯æ®ã£ãŠããŸããããã¯ã¹ã¯ããŒã«ãžã£ã³ãã®åé¡ã®è§£æ±ºçã§ããpsãã ãããheight
åå
éšã®åã®å€æŽãã§ããã¯ã䜿çšããªãå ŽåãScrollView
ãã®ãããªåé¡ã¯çºçããŸããããããããã®åŸã12åã®ãµãã¯ã©ã¹ã®åé¡ã«æ»ããŸãã3.ãŠãŒã¶ãŒãã¯ã©ã¹ã¿ãªã³ã°ããã¿ã¹ã¯
ããã§ãã¿ã¹ã¯èªäœãã¢ã«ãŽãªãºã ãããã³ãã®æ©èœã®äžéšã«ã€ããŠèª¬æããŸãã3.1ã åœå¢ãŠãŒã¶ãŒãã©ããããïŒ
ç§ã¯åœŒãã®ã©ã³ã¯ã®å¢çã«ãããŠãŒã¶ãŒã«ã€ããŠè©±ããŠããïŒå³ã§ã¯ãå¢çãŠãŒã¶ãŒã¯ãã€ã³ã0ïŒ
ã30ïŒ
ã85ïŒ
ã®ãŠãŒã¶ãŒã§ãïŒãŠãŒã¶ãŒã¯80ïŒ
ã®ãŠãŒã¶ãŒã«ãã£ãŠã»ãŒå®å
šã«ãããã¯ãããŸããïŒãæãç°¡åãªæ¹æ³ã¯ãããããæ£ããäœçœ®ã«æç»ããããšã§ãïŒä»¥äžãšåçïŒh e i g h t â s c o r e / 100ïŒããããããã®å Žåãä»ã®äººã®ã©ã³ã¯ã«èœã¡å§ããŸãããããæåŠããäž»ãªçç±ã¯ã°ã«ãŒãåã§ãã 29ïŒ
ã®ãã€ã³ããæã€ãŠãŒã¶ãŒãæ³åããŠãã ããã圌ã¯ãåå¿è
ãã®ã©ã³ã¯ã®å¢çã«ããŸããããããä»ã§ã¯åœŒã¯çªç¶33ïŒ
ã®ãã€ã³ããæã€ãŠãŒã¶ãŒãšçµåãããããã®ãžã§ã€ã³ãã°ã«ãŒãã¯31ïŒ
ã«å¯Ÿå¿ããäœçœ®ãã€ãŸããè¯ããã©ã³ã¯ã«é
眮ãããŠããŸãããã¥ãŒã®ã°ã«ãŒãããŠãŒã¶ãŒã®ã©ã³ã¯ã倿Žã§ãããšããèããããŸã奜ãã§ã¯ãªãã£ãã®ã§ãç§ã¯ãããæåŠããäžã®åçã§èŠãããã«ã©ã³ã¯å
ã®ãŠãŒã¶ãŒãå¶éããããšã«ããŸãããä»åŸãã°ã«ãŒãåã¢ã«ãŽãªãºã ãšã¢ããªã±ãŒã·ã§ã³å
šäœã®ããžãã¯ã«å€ãã®åé¡ã远å ãããããšã«æ³šæããŠãã ããã3.2ã ã°ã«ãŒãã«ã¯ããã€ã®ãã€ã³ãããããŸããïŒ
ãã€ã³ãã40ïŒ
ãš50ïŒ
ã®2人ã®ãŠãŒã¶ãŒãã°ã«ãŒãã«çµ±åããããšããŸããå
±åã°ã«ãŒããã©ãã«é
眮ããã©ã®ãããªãã€ã³ãã§é
眮ããŸããïŒçãã¯ç°¡åã§ããã°ã«ãŒãã¯45ïŒ
ã§ãäœçœ®ã¯ã°ã«ãŒããã€ã³ãã«å¯Ÿå¿ããŠããŸããã¿ã¹ã¯ãè€éã«ããŸãããã
ãããŠãããããã©ã®ããã«çµã¿åãããã®ã§ããïŒ
ããã«ã¯2ã€ã®è§£æ±ºçããããŸãã- ãŠãŒã¶ãŒ40ïŒ
ããã³50ïŒ
ãšåãã§ããã€ãŸããã°ã«ãŒãã2.5ïŒ
ã®äœçœ®ã«é
眮ããŸãã
- ã°ã«ãŒããå®äœçœ®ã«çœ®ã (view1.positionYâview2.positionY)/2 , .
ã¢ãããŒãã®éãã¯ãæåã®ã±ãŒã¹ã§ã¯ã°ã«ãŒããã¥ãŒããŠãŒã¶ãŒãã¥ãŒã®äžå€®ã«é
眮ãããªãããšã§ãã2çªç®ã®ã±ãŒã¹ã§ã¯ã°ã«ãŒãåãäžå€®ã«é
眮ããããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã®èгç¹ããã¯ããã«æå©ã§ããUXãåªå
ããŠãç§ã¯2çªã®æ¹æ³ã§ãããè¡ãããšã«ããŸãããããã®ã¢ãããŒãã¯éå€§ãªæ¬ ç¹ãæããã«ããŸãããã°ã«ãŒããã€ã³ãã¯å®å
šã«æ²ãã£ãŠèšç®ãããŸããå®éã0ïŒ
ã®ãŠãŒã¶ãŒã¯å®éã«ã¯äœçœ®0ã«äœçœ®ããŠããªãïŒãã®å Žåãä»ã®èª°ãã®ã©ã³ã¯ã®ããªããªãŒã«å
¥ã£ãããïŒã®ã§ãã©ã³ã¯å
ã®ãã¹ãŠã®ãã¥ãŒãsomeãããå°ãªããã€ã³ããæã€ããšã¯ã§ããŸããããŸãããºãŒã ã«ãã£ãŠå€åããŸããããã¯ãåŒïŒç°¡æããŒãžã§ã³ïŒã«ãã£ãŠèšç®ãããããã§ããminScore
m i n S c o r e = ïŒu s e r V i e w H e i g h t / c o n t a i n e r H e i g h t ïŒâ r a n k S c o r e M a x
... userViewHeight
倿ŽãããŠããªãããcontainerHeight
倿ŽãããŠããããããã³ãã®ç°ãªããã€ã³ãã§å¢çãã¥ãŒã®ãã€ã³ããç°ãªããããã«ãåŒèªäœïŒviewGroup.positionY=(view1.positionYâview2.positionY)/2
...äžžããšã©ãŒãçºçããŸã äœçœ®ã¯ãã¯ã»ã«åäœã§æž¬å®ãããããã«ãããã€ã³ãæ°ã®æåŸã®æ¡ã«ã©ã³ãã æ§ã远å ãããŸãïŒå®éããã¹ãŠã¯ããã§ã¯ãããŸããã䜿çšãããå Žåããã¯ã»ã«ã§ã¯ãªããview.getY()
æ»ããŸããfloat
ãã¹ãŠäœ¿çšMarginLayoutParams.topMargin
ãããå Žåããšã©ãŒãçºçããŸããæ¹æ³No. 2ã®ããããã¹ãŠã®æ¬ ç¹ãèæ
®ãããšãæ¹æ³No. 1ã䜿çšããããšã決å®ãããŸããããã°ã«ãŒããã¥ãŒã¯ãŠãŒã¶ãŒãã¥ãŒéã®äžå€®ã«æ£ç¢ºã«ã¯è¡šç€ºãããŸããã3.3ã ã¢ã«ãŽãªãºã
ããã¯ããªããæ©ãåãããšãã§ãããšããã§ãã ç§ããã£ãã
å°ãªããšã5ã€ã®ç°ãªãå®è£
ãããããäžå¿«ãªã广ã«ãã£ãŠäœããã®åœ¢ã§åœ±é¿ãåããŠãããããæ°ããæ¹æ³ã§äœåºŠãåé¡ã解決ããå¿
èŠããããŸãããæçµçãªå®è£
ãèšè¿°ããŠãããå®äºããããšã¯ã§ããŸãããå®è£
ã®ããã€ãã説æããããšããå§ãããŸãã以äžã«èª¬æããã¯ã©ã¹ã¿ãªã³ã°ã®åé¡ã«èå³ãããå Žåã¯ããããã©ã®ããã«è§£æ±ºãããïŒã©ã®ã¢ã«ãŽãªãºã ãçºæ/䜿çšãããïŒãèããŠããããã©ã°ã©ãããšã«èªãã§ãã ãããç§ã®ããã«ãã¢ãŒãã£ãã¡ã¯ããçºçããããå Žåã¯æ±ºå®ã倿ŽããŠãã ããã3.3.1ãææŠãã
åªããUXã䜿çšããŠã¯ã©ã¹ã¿ãªã³ã°ãè¡ããŸãã- å¢çãã¥ãŒã¯ã©ã³ã¯å
ã«çãŸãå¿
èŠããããŸãã
- â ,
zoom in
zoom out
zoom in
- . - / ( â2).
3.3.2.
ã¢ã«ãŽãªãºã èªäœãéå§ããåã®ãã¹ãŠã®å®è£
ã§ã¯ããã¹ãŠã®ãŠãŒã¶ãŒã¯ãã€ã³ãã§ãœãŒããããGroup
å®éã«ã¯1人ã®ãŠãŒã¶ãŒã1人ã®ã°ã«ãŒãã§ãããããåãŠãŒã¶ãŒãã¯ã©ã¹ã«å€ããããšã«æ³šæããããšãéèŠã§ãããŸããããŠãŒã¶ãŒããšããèšèã䜿çšãããšãã°ã«ãŒãã«åå ããåã®1人ã®ãŠãŒã¶ãŒãšããŠãŒã¶ãŒã®ã°ã«ãŒãã®äž¡æ¹ãæå³ã§ããŸãã衚èšã«ã€ããŠããŠãŒã¶ãŒã®çªå·ã«1ã€ã®çªå·ã7ããä»ããã°ã«ãŒãã«2ã€ã®çªå·ã78ããä»ããŸããã°ã«ãŒãçªå·ã®æ°åã¯ãããã«å«ãŸãããŠãŒã¶ãŒã®æ°ã瀺ããŸããã€ãŸããã°ã«ãŒã78ã¯ãŠãŒã¶ãŒ7ãš8ã§æ§æãããŸããåã¢ã«ãŽãªãºã ã«ã¯ãèšèã«ãã説æãšæ¬äŒŒã³ãŒãã®äž¡æ¹ãäžããããŸãã3.3.3ãã¢ã«ãŽãªãºã çªå·1
ãŠãŒã¶ãŒã亀差ããå ŽåããŠãŒã¶ãŒãé çªã«çµåããåçŽãªé 次ã¢ã«ãŽãªãºã ãæé ïŒ1. , i i+1.
2.1. â â1.
2.2. , .
3. 1 .
for (int i = 0; i < groups.size() - 1; ) { if (isInersected(groups[i], groups[i+1])) { groups[i].addUsersToGroup(groups[i+1]); groups.remove(i+1); } else { ++i; } }
ãã ãããã®ã¢ã«ãŽãªãºã ã«ã¯UXã«åé¡ããããŸããæåã¯ååã«è¿ãå Žåããã¹ãŠã®ãŠãŒã¶ãŒãçµåããŸããããã¯ãã¹ããŒã¹ã®äžåçãªäœ¿çšã«ã€ãªãããŸããã€ãŸããã¢ã«ãŽãªãºã ã¯UXã«é©åããŸããã3.3.4ãã¢ã«ãŽãªãºã çªå·2
æããã«ãåé¡ã¯ãã¹ãŠã®ãŠãŒã¶ãŒãé çªã«ãã§ãã¯ãããããšã§ãããã®ãããã¢ã«ãŽãªãºã çªå·1ããããã«å€æŽããããšã«ããŸãããããã§ããŠãŒã¶ãŒã®ãªã¹ãã«ã¯å°ãªããšã2ã€ã®ãã¹ããããŸããå¶æ°ãã¹ãšå¥æ°ãã¹ã§ããäž¡æ¹ã®ãã¹ã§äº€å·®ç¹ãèŠã€ãããªããšããã«ãã¢ã«ãŽãªãºã ã¯çµäºããŸããæé ïŒ0. i = 0.
1. , i i+1.
2.1. â , . 1.
2.2. , 2.
3. , 1.
4. i == 1 , .
5. 0, i ( 0 1 1 0 â ).
bool didIntersected, isEvenPass = false; do { didIntersected = false; isEvenPass = !isEvenPass; int i = isEvenPass ? 0 : 1; while (i < (groups.size() - 1)) { if (isInersected(groups[i], groups[i+1)) { didIntersected = true; groups[i].addUsersToGroup(groups[i+1]); groups.remove(i+1); i += 1; } else { i += 2; } } } while(isEvenPass || didIntersected);
ãã®ã¢ã«ãŽãªãºã ã¯ä»¥åã®åé¡ã解決ããŸãããçµååŸã®äžæ£ç¢ºãªåæã«é¢é£ããïŒãºãŒã é床ãç°ãªãããïŒæ°ããåé¡ãçºçããŸãããã®åé¡ããåé¡21-12ããšåŒã³ãŸãïŒååã«ã€ããŠã¯åŸã§èª¬æããŸãïŒãããã§äœãèµ·ãã£ãã®ãã説æããŸããã¢ã«ãŽãªãºã ãå®è¡ãããšã1人ãš2人ã®ãŠãŒã¶ãŒã亀差ããŠã°ã«ãŒãã圢æããããšãæããã«ãªããŸããã3çªç®ã®ãŠãŒã¶ãŒã¯ã°ã«ãŒããšäº€å·®ããããããã¹ãŠãå¥ã®ã°ã«ãŒãã圢æããŸãããã ããããéããºãŒã ã§ããããè§£é€ããããšãããšãç»åã®äžéšã«è¡šç€ºããããã®ãçºçããŸãã2人ã®ãŠãŒã¶ãŒã¯äº€å·®ããŸãããã°ã«ãŒãã圢æããŸãããçµåã®å¥ã®å®è¡ãåå²ããåŸã§ãã以åã¯ååšããªãã£ãã°ã«ãŒã23ãååŸããŸãã以åã¯ããŠãŒã¶ãŒã¯ãµã€ãº2ãš1ã®ã°ã«ãŒãã«çµ±åãããŠããŸããããä»ã§ã¯ãåé¢åŸããŠãŒã¶ãŒã¯ãµã€ãº1ãš2ã®ã°ã«ãŒãã圢æããŠããŸãããããã£ãŠãååã¯ãåé¡21-12ãã§ããããã¯ããºãŒã é床ã«å¿ããŠã°ã«ãŒããããŸããŸãªæ¹æ³ã§çµåãããå ŽåãUXã«ãšã£ãŠã¯æªãããšã§ããã€ãŸããã¢ã«ãŽãªãºã ãé©åããŸããã3.3.5ãã¢ã«ãŽãªãºã No. 3
ãããããé¡ã®äžã§åé¡ãæãã«è§£æ±ºããããšã¯äžå¯èœã§ãããããéãç ²ã䜿çšããªããã°ãªããªãããšãæããã«ãªããŸããããããã£ãŠããŠãŒã¶ãŒéã®è·é¢ïŒãã¥ãŒïŒã«åºã¥ããŠãŠãŒã¶ãŒãçµåããããšã«ããŸããããŠãŒã¶ãŒéã®è·é¢ãå°ããã»ã©ãæåã«ãŠãŒã¶ãŒãé¢é£ä»ããããŸãããŸããã°ã«ãŒããåå²ããã«ã¯ãã¿ã€ããã£ãŒã«ãStack<Group> groupsStack;
ãå
¥åããŠãããã«æ°ããã°ã«ãŒãããã¹ãŠè¿œå ããŸãããããã£ãŠãåæãããšãã¯ãã¹ã¿ãã¯ã®äžçªäžã®é
ç®ã®ã¿ããã§ãã¯ããå¿
èŠããããŸããæé ïŒ0. ( groups.size() â 1, / ).
1. . 0?
YES.1. 2- .
YES.2. . , 2- , .
YES.3. .
YES.4. 1.
NO.1. .
distances.sortAsc(); while (!distances.isEmpty() && distances.getFirst().distance <= 0) { firstDistance = distances.getFirst(); mergedGroup = new Group(firstDistance.groupLeft, firstDistance.groupRight); groupsStack.push(mergedGroup); distances.removeFirst(); firstDistance.groupLeft.notifyPositionChanged(mergedGroup.position); firstDistance.groupRight.notifyPositionChanged(mergedGroup.position); distances.sortAsc(); }
ããŸããããã§ééããªãååã ããšæã£ãã ãããããããŸããã
ããã倿ããåé¡ããããŸãïŒã°ã«ãŒãåã®é åºãééã£ãŠããŸãããããã¯ã©ããããããã®ïŒïŒããšæã£ãïŒã¯ããéåžžã«ç°¡åã§ããoo-o-o-oãéåžžã«ã·ã£ãŒãã«ãºãŒã ãããšã©ããªããŸããïŒãã¹ãŠã®ãŠãŒã¶ãŒã®ã·ã£ãŒããºãŒã ã®çµæããºãŒã åã§ããŠãŒã¶ãŒãäºãã«ååã«è¿ããããäœçœ®ã¯åãã«ãªããŸããããã®sortAsc()
ããããŠãŒã¶ãŒ1ãš2ã®éã®è·é¢ã¯0ã§ããããŠãŒã¶ãŒ2ãš3ã®éã®è·é¢ã0ã§ãããããã©ãããã°ãããããããŸããã§ããããã®çµæãã°ã«ãŒãã¯ééã£ãé åºã§åå ããŸãããããã¯ãåææã«ç¹ã«é¡èã«ãªããŸããæåã®ãã®ã¯æåŸã«ããŒãžããããã12ãåæãããŸãïŒã¹ã¿ãã¯ã¯LIFOã§ãããã¹ãŠèŠããŠããŸããïŒïŒã3.3.6ãã¢ã«ãŽãªãºã çªå·3.1
åã®ã¢ã«ãŽãªãºã ãä¿®æ£ããæãç°¡åãªæ¹æ³sortAsc()
ã¯ãç°ãªããè·é¢ã0ãã®éããæç¢ºã«ããããšã§ãããããŠãããã¯åã«äœåã远å ããããšã§å®è¡ã§ããŸããäžŠã¹æ¿ãããšãã«ãã§ãã¯ããdistance == 0
ããã«2çµã®ãŠãŒã¶ãŒãããå Žåã¯ãããããæ¯èŒãgroup.scoreAfterMerge
ãŸã ã³ãŒãã§èª¬æããããã«ãåã®ã¢ã«ãŽãªãºã ã®å®è£
ã§äœ¿çšãããGroupsDistanceããœãŒãããããã®æ¯èŒé¢æ°ïŒ @Override public int compareTo(@NonNull GroupsDistance obj) { GroupsDistance a = this, b = obj; final int distancesComparison = MathUtil.Compare(b.distance, a.distance); if (distancesComparison != 0) { return distancesComparison; } else { final int namesComparison = a.leftGroup.name.compareTo(b.leftGroup.name); return namesComparison; } }
...ãããextã«çœ®ãæããŸããã®æ¯èŒgroup.scoreAfterMerge
ïŒ @Override public int compareTo(@NonNull GroupsDistance obj) { GroupsDistance a = this, b = obj; final int distancesComparison = MathUtil.Compare(b.distance, a.distance); if (distancesComparison != 0) { return distancesComparison; } else { final int scoresComparison = MathUtil.Compare(a.scoreAfterMerge, b.scoreAfterMerge); if (scoresComparison != 0) { return scoresComparison; } else { final int namesComparison = a.leftGroup.name.compareTo(b.leftGroup.name) return namesComparison; } } }
確ãã«ãuser.score
ãããgroup.scoreAfterMerge
ã¯åžžã«çãããããŸããïŒãããŠãããããçããå Žåãããããçµåãããé åºã«éãã¯ãããŸãã-ãã¹ãŠåãã§ããããšã¯æ±ºããŠåæãããŸããïŒãããã¯è¿œå ãæå³ããŸããæ¯èŒscore
ã¯åé¡ã解決ããã®ã«ååã§ãªããã°ãªããŸãã...ãããããããããããŠãã®å Žåã«ã¯æ¬ é¥ããããŸããåé¡ã®ç¶æ
ãèŠããŠãããŠãã ããïŒãå¢çãã¥ãŒã¯ã©ã³ã¯å
ã«çãŸãå¿
èŠããããŸããïŒãåé¡ã¯ããã«ãããŸãããã®æ¡ä»¶ãæºãããªãå Žåãdistance
ãŠãŒã¶ãŒéã¯åžžã«æ¯äŸããŠå€åãããŠãŒã¶ãŒã®ãã¥ãŒã®äœçœ®ã«æç¢ºã«è¡šç€ºãããŸããscore
ãããã§ã¯ãããŸããããã®æ¡ä»¶ã«ãããå¢çãã¥ãŒã§ã¯äœçœ®ã®äŸåæ§ãç ŽãããŸãscore
ãããã¯ããªãæçœã§ã¯ãªãããããã®ãããªãéåãã®è©³çްãªäŸã次ã«ç€ºããŸãããŠãŒã¶ãŒãã¥ãŒã®é«ãã100ã§ãããšããŸãããŠãŒã¶ãŒã®äœçœ®ã0ã®å Žåããã®äžã®åº§æšã¯100ã§ãã[0ã100]ãã€ãŸã[start_viewãend_view]ã®åœ¢åŒã§ãŠãŒã¶ãŒãããŒã¯ããŸãã1D空éã§äœæ¥ããããšãèæ
®ããŠãã ããã2ã€ã®ãã¥ãŒïŒ[0ã100]ãš[60ã160]ãªã©ïŒã®äº€å·®ã決å®ããã«ã¯ããã¥ãŒNo. 1ã®çµãããããã¥ãŒNo. 2ã®å§ãŸããåŒããŸãã100 - 60 = 40 ã
ãããã£ãŠãã©ã³ã¯1000ãš3ãŠãŒã¶ãŒã®é«ãã®ãã¥ãŒããããŸããæ³šïŒãŠãŒã¶ãŒ3ã§ã¯ãã©ã³ã¯ã®å¢çãè¶
ããããšã¯èš±å®¹ã§ããªããããäœçœ®ã¯[1000ã1100]ã§ã¯ãããŸããããããã£ãŠã圌ã®ãã¥ãŒã¯ãã©ã³ã¯ãã¥ãŒå
ã®æãè¿ãäœçœ®ã«ç§»åãããŸããããºãŒã ã§ãå³...æã
ã¯0.5ã®ãºãŒã åçïŒãã³ããŒå質ã¹ããŒã«å¯žæ³500ïŒãå®è¡ããåã«ãâ1ãšâ2â2ãšâ3ã®éã90ã§ãããšã®è·é¢ã10æåŸã®ã¯ãã¹ã§ããããã«æãïŒâ1ã®éã®è·é¢ããš2çªã¯-5ã2çªãš3çªã®éã¯-95ã§ãã No. 2ãšNo. 3ã¯ãNoã1ãšNo. 2ãããæ©ãåæµããŸããããºãŒã ãå
ã«æ»ããä»åºŠã¯ä¿æ°0.2ã§ãºãŒã ããŸãïŒã©ã³ã¯ã®ãã¥ãŒã®ãµã€ãºã¯200ã«ãªããŸããïŒãâ1 60%: [600, 700].
â2 79%: [790, 890].
â3 100%: [900, 1000] ( : [1000, 1100]).
â1 60%: [300, 400].
â2 79%: [395, 495].
â3 100%: [400, 500] ( : [500, 600]).
â1 60%: [100, 200] ( : [120, 220]).
â2 79%: [100, 200] ( : [158, 258]).
â3 100%: [100, 200] ( : [200, 300]).
No. 1ãšNo. 2ã®éã®è·é¢ã¯0ãNoã2ãšNo. 3ã®éã®è·é¢ã0ã§ããã¢ã«ãŽãªãºã ã瀺ãããã«ãuser.scoreãš...ã®ãã¥ãŒãæ¯èŒããŸããããªãçªç¶ãNoã1ãšNo. 2ã¯No. 2ãããæ©ãã°ã«ãŒãã«åå ããŸãã3ã€ç®ã¯ãåæããããšæçµçã«ãããããããŸããç¶æ³ã¯ããªãç·åçã«èŠãããããããŸããããã©ã³ã¯ã®å¢çã ãã§ãªããããªãã·ã£ãŒããªãºãŒã ãè¡ããšäžå€®ã§ãçºçããŸããããšãã°ãåœå¢ã§åé¡ãç€ºãæ¹ãç°¡åã§ãããããã®ã¢ã«ãŽãªãºã ã¯é©åã§ã¯ãããŸãããäœããã¹ããïŒãŠãŒã¶ãŒãã¥ãŒéã®è·é¢ãäžŠã¹æ¿ããŠæ¯èŒãããããåªããŠããã®ã¯äœscore
ã§ããïŒïŒã-ç§ã¯åé¡ãèŠã€ãããšãã«èããŸããã3.3.7ãã¢ã«ãŽãªãºã No. 4
æéãäœããŸããããæ£ç¢ºã«ã¯ãé£ç¶äœãããã¯ãã³ã³ãã¥ãŒã¿ãŒç©çåŠã®åéã§ã¯ããªãããç¥ãããŠããã¿ã¹ã¯ã§ããé·ãããã»ã°ã¡ã³ãã§æéãéååãããšããªããžã§ã¯ããAãã¯ãªããžã§ã¯ããBããšäº€å·®ããé«éãããããããã¯æ€åºãããŸããã以äžã«äŸã瀺ããŸãã
O Bã®Bã®E ãžã®T A ïŒP ãO ãS iã¯ãtã¯ãI ãO ãN = 0 ãsã¯P E E D = 0ãOã®Bã®B é»åã®R BãïŒP ãO ãS iã¯ãtã¯ãI ãO ãN = - 100 ãS Pã®Eã®Eã®D = 10 12ïŒæã
ã¯ããç§åäœã§æéãéååããå Žåã§ãã£ãŠã10 - 9ã¯æ¬¡ã®ããã«ïŒã次ãã§ã次ã®ç¬é«B»-timeäœçœ®ãèæ
®ãããŸããããããšãpåã®Oã¯ãsã®iã¯ãtã¯iã¯oãN = B ãpåã®Oã¯ãsã®iã¯ãtã¯iã¯oãN + B ãS P EãšEã®D * tã¯iãmãE DãšEã®Lãtã®= - 100 + 10 12 * 10 - 9 = - 100 + 10 3 = 900ã§ãããæã
ãåŸãŸããïŒb B é»åãã³ã®ãããããšïŒP O S iã®tã¯ãç§ã¯oãN = 900 ãS P E Eã®D = 10 12«Bã¯Â»ã¡ããã©Â«A»ãçµãŠééãããã®äœçœ®ã¯äŒã£ãããšããªãã£ãã®ã§ãæã
ã¯ãéç¥ãããªãã§ãã ããè¿ããããããŸããã§ãããã¯ã©ã¹ã¿ãªã³ã°ã®åé¡ãåãåé¡ã§ããç§»åã®é床ã§ã¯ãªããºãŒã ã®é床ã§ããããªããžã§ã¯ãã®äœçœ®ã§ã¯ãªããã¥ãŒã®äœçœ®ã§ããäžè¬ã«ãæ°ããæåŸã®ã¢ã«ãŽãªãºã ã®æ¬è³ªã¯ããŠãŒã¶ãŒãã¥ãŒéã®è·é¢ã§ã¯ãªããheight
ããã2人ã®ãŠãŒã¶ãŒã亀ãããšããã§ïŒæ¬¡ã«ããã®ã®é
åããœãŒãwillIntersectWhenHeight
ããåã®ã¢ã«ãŽãªãºã ã®è·é¢ã®é
åãšåãããšãè¡ãã ãã§ããäž»ãªãã®ã¯ã -åŽïŒãšãåŒã°ããããšãå¿ããŠã¯ãããªãborder
ãbound
ãïŒã¯ããŠãŒã¶ãŒ/ã°ã«ãŒãã®äœçœ®ãç°ãªã£ãŠæ®ãã®éšåããã倿ŽããŸãããããšäº€å·®ããå Žåã¯ãåå¥ã«æ€èšããå¿
èŠããããŸããã¢ã«ãŽãªãºã ã®ã¹ãããã¯ä»¥åãšåãwillIntersectWhenHeight
ã§ãããããã¯ã©ã¹ã® 'a ãã«ãŠã³ããã颿°ã®ã³ãŒãã®ã¿ãæäŸããŸãGroupCandidates
ããããããã°ã«ãŒãã§ã¯ãªãé
åã§ã¯ãªããã€ããªããªãŒã䜿çšããããšã«æ³šæããããšãéèŠã§ããããã«ãããã¢ã«ãŽãªãºã èªäœãšã¯ã©ã¹ã¿ãŒã¢ãã¡ãŒã·ã§ã³ã®äž¡æ¹ã®ããžãã¯ãç°¡çŽ åããããšãã§ããŸããã private float getIntersectingHeght() { float intersectingHeight; final Float height = calcIntersectingHeightWithNoBound(); final boolean leftIsBorder = leftGroup.isLeftBorderWhen(height), rightIsBorder = rightGroup.isRightBorderWhen(height); if (!leftIsBorder && !rightIsBorder) { intersectingHeight = space; return; } if (leftIsBorder && !rightIsBorder) { intersectingHeight = (itemHeight + itemHalfHeight) / right.getNormalizedPos(); return; } if (!leftIsBorder && rightIsBorder) { intersectingHeight = (itemHeight + itemHalfHeight) / (1 - left.getNormalizedPos()); return; } if (leftIsBorder && rightIsBorder) { intersectingHeight = ((float) (itemHeight + itemHeight)); return; } return intersectingHeight; } private Float calcIntersectingHeightWithNoBound() { return itemHeight / (right.getNormalizedPos() - left.getNormalizedPos()); }
泚ïŒgetNormalizedPos()
ã©ã³ã¯å
ã®æ£èŠåãããïŒã€ãŸãã0ãã1ïŒäœçœ®ãè¿ããŸãããã®ã¢ã«ãŽãªãºã ã¯ãç§ãæãã€ããã¹ãŠã®ãã§ãã¯ã«åæ Œããéåžžã«è»œå¿«ãªé床ã瀺ããŸãããäžè¬ã«ãåé¡ã¯è§£æ±ºãããŸãã4.æªè§£æ±ºã®åé¡ïŒUPDïŒãã§ã«è§£æ±ºæžã¿ïŒ
ãããŠä»ãæªãããšã«ã€ããŠãæåã¯ããã¹ãŠã®åé¡ã解決ããåŸã«èšäºãæžãã€ããã§ããããæéããªãããã«ãã³ã¡ã³ãã§åœ¹ç«ã€ãªãæéãç¯çŽã§ããŸãããšèããããããã®ãŸãŸã¬ã€ã¢ãŠãããããšã«ããŸãããæéãèªç±ã«ãªã£ããããããã®åé¡ã«æ»ããŸããå¿ããªãå Žåã¯ãããã§è§£æ±ºçã远å ããŸãã4.1ãScrollView.setScroll()
å
éšã§ã¯ScrollView.onLayout()
ãåŒã³åºãåŸã«ã®ã¿æ£åžžã«åäœããŸãsuper.onLayout()
ïŒãã®åã®å
åŽã®åã®ãµã€ãºã倿Žããå ŽåScrollView
ïŒ
ãã®åé¡ã¯ä»¥åã«èª¬æãããŠããŸããç§ã¯ScrollView
ç¥èŠããæ¹æ³ãèŠã€ããŸããã§ãsetScroll()
ãsuper.onLayout()
ããªããããéèŠãªã®ã§ããïŒ
ã®ã±ãŒã¹requestLayout()
ããã®åŒã³åºãã¯ããã¬ã€ã¢ãŠããã¹ãäœæããå¿
èŠããããŸããã¿ã€ãã®ãã©ã°ãèšå®ããæ¬¡ã®16msãã¬ãŒã ãŸã§èšç®ãã¹ãå»¶æããŸããã€ãŸããã©ãã ãrequestLayout()
åŒã³åºããªããŠããåŒã³åºãsuper.onLayout()
ïŒåãã¥ãŒãé
眮ããŠãã©ã°ãåé€ããïŒãŸã§ãã¬ã€ã¢ãŠããã¹ã¯çæãããŸããããã ããrequestLayout()
åŸsuper.onLayout()
ã«çªç¶åŒã³åºãããå Žåããã©ã°ã¯å床èšå®ãããŸãã ïŒ16msã®çµç±ïŒã次ã®ãã¬ãŒã ã®ã¬ã³ããªã³ã°äžã«ãåå ãšãªãæ°ããã¬ã€ã¢ãŠããã¹ããããããšãããã®ææ®µScrollView.onLayout()
ååºŠèŠæ±ãããrequestLayout()
åŸã«super.onLayout()
ã...ãããŠããã¹ãŠã®16msã®ãã¬ãŒã ã¯ãå®å
šãªåéèšãšãªãLayout
ãç»é¢äžã®ãã¹ãŠã®vyushekãããèŠããã«ãéããªææãããããããã ãã§è¡ãããã®è©Šã¿ã®åŸã«çºçããå ŽårequestLayout()
ã®åŸsuper.onLayout()
ãããã³ScrollView.setScroll()
ãçºçããªãå ŽårequestLayout()
ãåé¡ã¯äœã§ããïŒããããããã«ãããŸãïŒ4.2ãView.setVisibility(GONE)
åå requestLayout()
ã¢ã«ãŽãªãºã ã®çŸåšã®å®è£
ïŒé£ç¶äœã䜿çšïŒã¯éåžžã«é«éã«åäœããŸãããã¬ã³ããªã³ã°ãã¥ãŒã®å®è£
ã¯åäœããŸãããçæ³çã«ã¯ããŠãŒã¶ãŒ/ã°ã«ãŒãã®ãªãµã€ã¯ã«ãã¥ãŒã远å ããå¿
èŠããããç»é¢å€ã«ãããã¥ãŒãã¬ã³ããªã³ã°ããããšããªãã§ãã ãããããView.getLocalVisibleRect()
ã¯ãïŒå¯èŠãŠã£ã³ããŠã®åº§æšãè¿ãïŒinside ã䜿çšããŠè¡ãããšãã§ãUsersView
ãç»é¢ã«ãããããåãã¥ãŒã«å¯ŸããŠãgroupView.setUsersGroup(group)
insideã䜿çšããŸãgroupsCountView.setVisiblity(âŠ)
ããããïŒ
ScrollView.setScroll()
ãã®åŒã³åºãã¯çµæã倿ŽãããããäœæåŸã«äœ¿çšããå¿
èŠããããŸãView.getLocalVisibleRect()
ããããŠãScrollView.setScroll()
åŸsuper.onLayout()
ã«åŒã³åºãããgroupView.setUsersGroup(group)
åå ãšãªãå¯èœæ§View.setVisiblity(GONE)
ãããããrequestLayout()
ãåã®åé¡ã§èª¬æããç¡éã«ãŒããçºçããŸããããã«ãåã¹ã¯ããŒã«ã§ãºãŒã ã衚瀺ãããªãå Žåã§ãã衚瀺ããããŠã£ã³ããŠã¯å€æŽãããŸããã€ãŸããä»ã®ãã¥ãŒã衚瀺ããå¿
èŠããããŸããããäžåºŠView.getLocalVisibleRect()
åŒã³åºããšView.setVisiblity(GONE)
ãåŒã³åºãã«ã€ãªãããŸãrequestLayout()
ãã€ãŸããåã¹ã¯ããŒã«ã§ãããèµ·ãããŸãrequestLayout()
-ããã¯åã«èããããŸããïŒç§ã¯ãããããŸããŸãªæ¹æ³ã§è§£æ±ºããããšããŸããããrequestLayout()
å
éšã®ã¡ãœããããªãŒããŒã©ã€ãããå Žåã§ãGroupView
ãå广çãªçµæãåŸãããŸãïŒå
éšã®åã衚瀺ããŸãGroupView
宿çã«ããžã£ã³ãããå§ããŸã...説æããã®ã¯é£ããã§ããçç±ãããããŸããã§ããïŒãrequestLayout()
ç§ã¯ãã®ããã«ããŸã奜ãã§ã¯ãããŸããã圌ã¯ããã°ãåããŸããããããããããå¥ã®è§£æ±ºçããããããããŸããããGoogleãšãšãã«stackoverflowã¯ãã«ãã¶ã³ãšããŠæ²é»ããŠããŸãã4.999ãèšèŒãããŠããåé¡ã解決ãã
äžèšã®åé¡ã¯ãã©ããããããrequestLayout()
åŒã³åºããããã®ã«é¢é£ããŠããŸãïŒãŸãã¯ãè¡ãè©°ãŸãããšãããããŸãïŒãã³ã¡ã³ãã§æ£ããææãããŠããããã«ãRecyclerView
ããã䜿çšããã°ããã¹ãŠã®åé¡ãåé¿ã§ããŸãLayoutManager
ãããããç§ã®ç®æšã¯ã°ã©ãã£ãã¯ã§ã¯ãªãRecyclerView
ãã°ã©ãã£ãã¯ã§äœæ¥ããããšã ã£ãã®ã§ãå¥ã®æ¹æ³ãèŠã€ãããŸãããã ãããrequestLayout()
ãããã¿ïŒããšãã°child.setVisibility(GONE)
ïŒã«ãã£ãŠåŒãèµ·ãããã匷迫芳念ãåãé€ãã«ã¯ã... child
ãLayout
äœãã«è¿œå ããªãã§ãã ããïŒããã¯åå ã«ã¯ãããŸããïŒlayout.addView(myChild)
ãåæ§ã®ã¢ãããŒãã«ããã以äžãå®çŸããŸããView
èªåã§ãæ£child
ããä¿ç®¡ããå¿
èŠãããã- æåã§åŒã³åºãå¿
èŠããã
measure()
ãlayout()
ãããŠdrawChild()
ã®ããã«child
é©åãªã¿ã€ãã³ã°ã§ã®ã child
ã¯å®å
šã«ç¬ç«ããŠããããããããã倿ŽããŠããçºçããŸããrequestLayout()
ã
äžèšã®ãã¹ãŠã®åé¡ã解決ã§ããã®ã¯æ®µèœ3ã§ãããããŠ-ããã¯å°ããªãã®ã§ããå©ããåããŠView.getLocalVisibleRect()
ãã©ãã¯çŸåšç»é¢äžã«è¡šç€ºããŠãŒã¶ãŒ/ã°ã«ãŒããšãããã ãã/åé¢/æç»ãã°ã«ãŒãåããåå ã«ã€ããŠãpsããã§ã¯åé¡ããªãã£ãããã§ã¯ãããŸããããããšãã°ã以åã«é»è©±ããŠããªãã£ããšããŠããäœæonScrollChanged()
ã«é»è©±ã§ããã®ãç¥ã£onLayout()
ãŠããŸããsetScrollY()
ãïŒç§ã®å Žåãããã¯åœŒãView.getLocalVisibleRect()
æ»ã£ãŠãããšããäºå®ã«ã€ãªãã£ãfalse
ïŒåœŒãã¯ãUsersView
ä»ã§ã¯ç»é¢äžã«ãªãïŒãç§ã¯ãããäžè¬çã«ã©ã®ããã«å¯èœã§ããããçè§£ããããã«èªåãèŠãããªããã°ãªããŸããã§ãããrecycling
'omã¯githubã«ãããŸããå€ãæºåž¯é»è©±ã®1,000人ã®ãŠãŒã¶ãŒã§ãéåžžã«é«éã«åäœããŸãããããããã§ã«å€ãã®äººã
ãæžéãå§ããŠããŸããããã§ã¯ãã¯ã©ã¹ã¿ãªã³ã°ã³ãŒããNDKã«ç§»æ€ããã ãã§åœ¹ç«ã¡ãŸãã5.çµè«
ã¿ã¹ã¯ã¯ãç§ãæ³åãããããã¯ããã«è€éã§è峿·±ãããšãããããŸããã亀差ç¹ã¢ãã¡ãŒã·ã§ã³ã®å®è¡æ¹æ³ãåŠã³ããã£ãã ãã§ãããæçµçã«ã¯ã¢ã«ãŽãªãºã ã䜿çšããSDKã®ãœãŒã¹ãªã©ã調ã¹ãŸããã Androidã«é£œã飜ãããå¿
èŠã¯ãããŸããããŠãŒã¶ãŒãã©ã³ã¯ã®å¢çãè¶
ããŠã¯ãªããªããšããæ¡ä»¶ã«ãããã»ãšãã©ã®ã¢ã«ãŽãªãºã ã®åââé¡ãã¯ããŒã«ãããŸãããã¢ã«ãŽãªãºã ãå®è¡ããŠããéããã®æ¡ä»¶ãäœåºŠãé€å€ãããã£ãã®ã§ããã-_- "...ã§ããç§ã¯æºè¶³ããŠããŸããããªããé¡ã£ãŠããŸããã¢ããªã±ãŒã·ã§ã³ã³ãŒãã¯github.com/Nexen23/RankingListViewã«ãããŸãã ãæªè§£æ±ºã®åé¡ãã®è§£æ±ºç-ã³ã¡ã³ããæžããŸãã解決çã確èªããåé¡ããªããã°ããã¹ããæŽæ°ããŸãUPD 1ïŒMr. Artem_007ãææ¡ãããšãããäžèšã®åé¡ãžã®æ©èœãªã¯ãšã¹ã/ãã°ã¬ããŒãã®ãªã³ã¯ã远å ããŸãããUPD 2ïŒ4.999.
ãæªè§£æ±ºãã®åé¡ã®è§£æ±ºçããã³ã¯ã«è¿œå ããŸããã