package Ġcom . ang cy o . component Ċ Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . graphics . Canvas Ċ import Ġandroid . graphics . Color Ċ import Ġandroid . graphics . Paint Ċ import Ġandroid . graphics . drawable . Color Drawable Ċ import Ġandroid . util . L ru Cache Ċ import Ġandroid . view . View Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġkotlin . math . min Ċ Ċ /** Ċ Ġ* Ġ[ RecyclerView ] Ġ æĪª åĽ¾ è¾ ħ åĬ© ç±» Ċ Ġ* ĠEmail : ang cy o @ 1 2 6 . com Ċ Ġ* Ġ@ author Ġang cy o Ċ Ġ* Ġ@ date Ġ 2 0 2 1 / 0 2 / 0 6 Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 0 Ġang cy o . ĠAll Ġrights Ġreserved . Ċ Ġ*/ Ċ class ĠD sl RecyclerView Shot Ġ{ ĊĊĠĠĠ Ġ/** èĥĮæĻ¯ é¢ľèī² */ ĊĠĠĠ Ġvar Ġbg Color : ĠInt Ġ= ĠColor . WHITE ĊĊĠĠĠ Ġ/** ä»İ ä»Ģä¹Ī ä½įç½® å¼Ģå§ĭ æĪª åĽ¾ */ ĊĠĠĠ Ġvar Ġfrom Index Ġ= Ġ 0 ĊĊĠĠĠ Ġ/** æĪª åıĸ å¤ļå°ĳ ä¸ª Item */ ĊĠĠĠ Ġvar Ġitem Count Ġ= ĠInt . MAX _ VALUE ĊĊĠĠĠ Ġ/** å½ĵåīį [ index ] çļĦ item ä¸ĬéĿ¢ éľĢè¦ģ åģı ç§» çļĦ è·Ŀç¦» */ ĊĠĠĠ Ġvar Ġoffset Height Action : Ġ(( index : ĠInt ) Ġ-> ĠInt )? Ġ= Ġnull ĊĊĠĠĠ Ġ/** ç»ĺ åĪ¶ åĽŀè°ĥ */ ĊĠĠĠ Ġvar Ġdraw Action : Ġ(( index : ĠInt , Ġcanvas : ĠCanvas ) Ġ-> ĠUnit )? Ġ= Ġnull ĊĊĠĠĠ Ġ/** éĶĻè¯¯ ä¿¡æģ¯ */ ĊĠĠĠ Ġvar Ġerror : ĠThrowable ? Ġ= Ġnull ĊĊĠĠĠ Ġ/** éĶĻè¯¯ åĽŀè°ĥ */ ĊĠĠĠ Ġvar Ġerror Action : Ġ(( Throwable ) Ġ-> ĠUnit )? Ġ= Ġnull ĊĊĠĠĠ Ġfun Ġdo It ( re cyclerView : ĠRecyclerView ): ĠBitmap ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġadapter Ġ= Ġre cyclerView . adapter ĊĠĠĠĠĠĠĠ Ġif Ġ( adapter Ġ== Ġnull Ġ|| Ġadapter . item Count Ġ<= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġend Index Ġ= Ġmin ( from Index Ġ+ Ġitem Count , Ġadapter . item Count ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġheight Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpaint Ġ= ĠPaint () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmax Memory Ġ= Ġ( Runtime . get Runtime (). max Memory () Ġ/ Ġ 1 0 2 4 ). toInt () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUse Ġ 1 / 8 th Ġof Ġthe Ġavailable Ġmemory Ġfor Ġthis Ġmemory Ġcache . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcache Size Ġ= Ġmax Memory Ġ/ Ġ 8 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbitmap Cache Ġ= ĠL ru Cache < String , ĠBitmap >( cache Size ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġfrom Index Ġuntil Ġend Index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// offset ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheight Ġ+= Ġoffset Height Action ?. invoke ( i ) Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// èİ·åıĸ item çļĦ åĽ¾çīĩ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġholder Ġ= Ġadapter . create ViewHolder ( re cyclerView , Ġadapter . getItem ViewType ( i )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . on Bind ViewHolder ( holder , Ġi , ĠlistOf < Any >()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . item View . measure ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠView . Measure Spec . make Measure Spec ( re cyclerView . width , ĠView . Measure Spec . EX ACT LY ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠView . Measure Spec . make Measure Spec ( 0 , ĠView . Measure Spec . UNSPECIFIED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . item View . layout ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . item View . meas ured Width , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . item View . meas ured Height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . item View . is Drawing Cache Enabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . item View . build Drawing Cache () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdrawing Cache Ġ= Ġholder . item View . drawing Cache ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( drawing Cache Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbitmap Cache . put ( i . toString (), Ġdrawing Cache ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ç´ ¯ åĬł é«ĺåº¦ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheight Ġ+= Ġholder . item View . meas ured Height ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// å¼Ģå§ĭ è¿ĶåĽŀ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Bitmap Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBitmap . create Bitmap ( re cyclerView . meas ured Width , Ġheight , ĠBitmap . Config . ARGB _ 8 8 8 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Canvas Ġ= ĠCanvas ( result Bitmap ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ç»ĺ åĪ¶ èĥĮæĻ¯ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Canvas . draw Color ( bgColor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġl Background Ġ= Ġre cyclerView . background ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( l Background Ġis ĠColor Drawable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġl Color Ġ= Ġl Background . color ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Canvas . draw Color ( l Color ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġdraw Height Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġfrom Index Ġuntil Ġend Index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Height Ġ+= Ġoffset Height Action ?. invoke ( i ) Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbitmap Ġ= Ġbitmap Cache [ i . toString ()] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Canvas . draw Bitmap ( bitmap , Ġ 0 f , Ġdraw Height . toFloat (), Ġpaint ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Height Ġ+= Ġbitmap . height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbitmap . recycle () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Action ?. invoke ( i , Ġresult Canvas ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult Bitmap ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror Ġ= Ġe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror Action ?. invoke ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** [ RecyclerView ] æĪª åĽ¾ */ Ċ fun ĠRecyclerView . shot ( action : ĠD sl RecyclerView Shot . () Ġ-> ĠUnit ): ĠBitmap ? Ġ{ ĊĠĠĠ Ġreturn ĠD sl RecyclerView Shot (). run Ġ{ ĊĠĠĠĠĠĠĠ Ġaction () ĊĠĠĠĠĠĠĠ Ġdo It ( this @ shot ) ĊĠĠĠ Ġ} Ċ }