package Ġcom . q avan Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . view . View Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġkotlin . math . abs Ċ import Ġkotlin . math . cos Ċ import Ġkotlin . math . max Ċ import Ġkotlin . math . sin Ċ Ċ /** Ċ Ġ* ĠAn Ġimplementation Ġof Ġ[ ViewPager LayoutManager ] Ċ Ġ* Ġwhich Ġwill Ġchange Ġrotate Ġx Ġor Ġrotate Ġy Ċ Ġ*/ Ċ @ Suppress (" Unused "," Member Visibility Can Be Private ") Ċ class ĠGallery LayoutManager Ġprivate Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġcontext : ĠContext ?, ĊĠĠĠĠĠĠĠ Ġitem Space : ĠInt , ĊĠĠĠĠĠĠĠ Ġangle : ĠFloat , ĊĠĠĠĠĠĠĠ Ġmax Alpha : ĠFloat , ĊĠĠĠĠĠĠĠ Ġmin Alpha : ĠFloat , ĊĠĠĠĠĠĠĠ Ġorientation : ĠInt , ĊĠĠĠĠĠĠĠ Ġmove Speed : ĠFloat , ĊĠĠĠĠĠĠĠ Ġflip Rotate : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġrotate From Edge : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġmax Visible ItemCount : ĠInt , ĊĠĠĠĠĠĠĠ Ġdistance To Bottom : ĠInt , ĊĠĠĠĠĠĠĠ Ġreverse Layout : ĠBoolean Ċ ) Ġ: ĠView Pager LayoutManager ( context , Ġorientation , Ġreverse Layout ) Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠINTER VAL _ ANGLE Ġ= Ġ 3 0 f ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠDEFAULT _ SPEED Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMIN _ ALPHA Ġ= Ġ 0 . 5 f ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMAX _ ALPHA Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMAX _ E LE V ATION Ġ= Ġ 5 f ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġitem Space : ĠInt Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġset ( item Space ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert NotIn Layout Or Scroll ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( field Ġ== Ġitem Space ) Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġitem Space ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremove All Views () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġmove Speed : ĠFloat Ġ= ĠDEFAULT _ SPEED ĊĠĠĠĠĠĠĠ Ġset ( move Speed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert NotIn Layout Or Scroll ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( field Ġ== Ġmove Speed ) Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġmove Speed ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġmax Alpha : ĠFloat Ġ= ĠMAX _ ALPHA ĊĠĠĠĠĠĠĠ Ġset ( max Alpha ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmax Alpha X Ġ= Ġmax Alpha ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert NotIn Layout Or Scroll ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( max Alpha X Ġ> Ġ 1 ) Ġmax Alpha X Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( field Ġ== Ġmax Alpha X ) Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġmax Alpha X ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Layout () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġmin Alpha : ĠFloat Ġ= ĠMIN _ ALPHA ĊĠĠĠĠĠĠĠ Ġset ( min Alpha ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmin Alpha X Ġ= Ġmin Alpha ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert NotIn Layout Or Scroll ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( min Alpha X Ġ< Ġ 0 ) Ġmin Alpha X Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( field Ġ== Ġmin Alpha X ) Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġmin Alpha X ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Layout () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġangle : ĠFloat Ġ= ĠINTER VAL _ ANGLE ĊĠĠĠĠĠĠĠ Ġset ( angle ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert NotIn Layout Or Scroll ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( field Ġ== Ġangle ) Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġangle ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Layout () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġflip Rotate : ĠBoolean Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġset ( flip Rotate ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert NotIn Layout Or Scroll ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( field Ġ== Ġflip Rotate ) Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġflip Rotate ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Layout () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġrotate From Edge : ĠBoolean Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġset ( rotate From Edge ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert NotIn Layout Or Scroll ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( field Ġ== Ġrotate From Edge ) Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġrotate From Edge ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremove All Views () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . distance To Bottom Ġ= Ġdistance To Bottom ĊĠĠĠĠĠĠĠ Ġthis . max Visible ItemCount Ġ= Ġmax Visible ItemCount ĊĠĠĠĠĠĠĠ Ġthis . item Space Ġ= Ġitem Space ĊĠĠĠĠĠĠĠ Ġthis . move Speed Ġ= Ġmove Speed ĊĠĠĠĠĠĠĠ Ġthis . angle Ġ= Ġangle ĊĠĠĠĠĠĠĠ Ġthis . max Alpha Ġ= Ġmax Alpha ĊĠĠĠĠĠĠĠ Ġthis . min Alpha Ġ= Ġmin Alpha ĊĠĠĠĠĠĠĠ Ġthis . flip Rotate Ġ= Ġflip Rotate ĊĠĠĠĠĠĠĠ Ġthis . rotate From Edge Ġ= Ġrotate From Edge ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( context : ĠContext ?, Ġitem Space : ĠInt ) Ġ: Ġthis ( Builder ( context , Ġitem Space )) ĊĊĠĠĠ Ġconstructor ( context : ĠContext ?, Ġitem Space : ĠInt , Ġorientation : ĠInt ) Ġ: Ġthis ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBuilder ( context , Ġitem Space ). set Orientation ( orientation ) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġconstructor ( context : ĠContext ?, Ġitem Space : ĠInt , Ġorientation : ĠInt , Ġreverse Layout : ĠBoolean ) Ġ: Ġthis ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBuilder ( context , Ġitem Space ). set Orientation ( orientation ). set Reverse Layout ( reverse Layout ) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġconstructor ( builder : ĠBuilder ) Ġ: Ġthis ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . context , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . item Space , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . angle , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . max Alpha , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . min Alpha , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . orientation , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . move Speed , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . flip Rotate , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . rotate From Edge , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . max Visible ItemCount , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . distance To Bottom , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . reverse Layout ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġoverride Ġfun ĠsetInterval (): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ( m Decorated Measurement Ġ+ Ġitem Space ). toFloat () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Item View Property ( item View : ĠView ?, Ġtarget Offset : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrotation Ġ= Ġcal Rotation ( target Offset ) ĊĠĠĠĠĠĠĠ Ġif Ġ( orientation Ġ== ĠRecyclerView . HORIZONTAL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( rotate From Edge ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠitemView !!. pivot X Ġ= Ġif Ġ( rotation Ġ> Ġ 0 ) Ġ 0 f Ġelse Ġm Decorated Measurement . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠitemView . pivot Y Ġ= Ġm Decorated Measurement In Other Ġ* Ġ 0 . 5 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( flip Rotate ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠitemView ?. rotation X Ġ= Ġrotation ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠitemView ?. rotation Y Ġ= Ġrotation ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( rotate From Edge ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠitemView ?. pivot Y Ġ= Ġif Ġ( rotation Ġ> Ġ 0 ) Ġ 0 f Ġelse Ġm Decorated Measurement . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠitemView ?. pivot X Ġ= Ġm Decorated Measurement In Other Ġ* Ġ 0 . 5 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( flip Rotate ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠitemView ?. rotation Y Ġ= Ġ- rotation ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠitemView ?. rotation X Ġ= Ġ- rotation ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġalpha Ġ= Ġcal Alpha ( target Offset ) ĊĠĠĠĠĠĠĠ ĠitemView ?. alpha Ġ= Ġalpha ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset View Elevation ( item View : ĠView ?, Ġtarget Offset : ĠFloat ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġele Ġ= Ġmax ( abs ( item View !!. rotation X ), Ġabs ( item View . rotation Y )) Ġ* ĠMAX _ E LE V ATION Ġ/ Ġ 3 6 0 ĊĠĠĠĠĠĠĠ Ġreturn ĠMAX _ E LE V ATION Ġ- Ġele ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġdistance Ratio : ĠFloat Ġ= Ġif Ġ( move Speed Ġ== Ġ 0 f ) ĠFloat . MAX _ VALUE Ġelse Ġ 1 Ġ/ Ġmove Speed ĊĊĠĠĠ Ġprivate Ġfun Ġcal Rotation ( target Offset : ĠFloat ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ- angle Ġ/ Ġm Interval Ġ* Ġtarget Offset ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcal Alpha ( target Offset : ĠFloat ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoffset Ġ= Ġabs ( target Offset ) ĊĠĠĠĠĠĠĠ Ġvar Ġalpha Ġ= Ġ( min Alpha Ġ- Ġmax Alpha ) Ġ/ Ġm Interval Ġ* Ġoffset Ġ+ Ġmax Alpha ĊĠĠĠĠĠĠĠ Ġif Ġ( offset Ġ>= Ġm Interval ) Ġalpha Ġ= Ġmin Alpha ĊĠĠĠĠĠĠĠ Ġreturn Ġalpha ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠBuilder ( ĊĠĠĠĠĠĠĠ Ġval Ġcontext : ĠContext ?, ĊĠĠĠĠĠĠĠ Ġvar Ġitem Space : ĠInt , ĊĠĠĠĠĠĠĠ Ġvar Ġmove Speed : ĠFloat Ġ= ĠDEFAULT _ SPEED , ĊĠĠĠĠĠĠĠ Ġvar Ġorientation : ĠInt Ġ= ĠH ORIZONTAL , ĊĠĠĠĠĠĠĠ Ġvar Ġmax Alpha : ĠFloat Ġ= ĠMAX _ ALPHA , ĊĠĠĠĠĠĠĠ Ġvar Ġmin Alpha : ĠFloat Ġ= ĠMIN _ ALPHA , ĊĠĠĠĠĠĠĠ Ġvar Ġangle : ĠFloat Ġ= ĠINTER VAL _ ANGLE , ĊĠĠĠĠĠĠĠ Ġvar Ġflip Rotate : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġvar Ġreverse Layout : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġvar Ġmax Visible ItemCount : ĠInt Ġ= ĠDET ER M INE _ BY _ MAX _ AND _ MIN , ĊĠĠĠĠĠĠĠ Ġvar Ġdistance To Bottom : ĠInt Ġ= ĠINVALID _ SIZE , ĊĠĠĠĠĠĠĠ Ġvar Ġrotate From Edge : ĠBoolean = Ġfalse ĊĠĠĠ Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġfun Ġset Item Space ( item Space : ĠInt ): ĠBuilder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . item Space Ġ= Ġitem Space ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġset Move Speed ( move Speed : ĠFloat ): ĠBuilder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . move Speed Ġ= Ġmove Speed ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġset Orientation ( orientation : ĠInt ): ĠBuilder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . orientation Ġ= Ġorientation ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġset Max Alpha ( max Alpha : ĠFloat ): ĠBuilder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmax Alpha X Ġ= Ġmax Alpha ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( max Alpha X Ġ> Ġ 1 ) Ġmax Alpha X Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . max Alpha Ġ= Ġmax Alpha X ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġset Min Alpha ( min Alpha : ĠFloat ): ĠBuilder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmin Alpha X Ġ= Ġmin Alpha ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( min Alpha X Ġ< Ġ 0 ) Ġmin Alpha X Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . min Alpha Ġ= Ġmin Alpha X ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġset Angle ( angle : ĠFloat ): ĠBuilder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . angle Ġ= Ġangle ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġset Flip Rotate ( flip Rotate : ĠBoolean ): ĠBuilder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . flip Rotate Ġ= Ġflip Rotate ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġset Reverse Layout ( reverse Layout : ĠBoolean ): ĠBuilder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . reverse Layout Ġ= Ġreverse Layout ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġset Max Visible ItemCount ( max Visible ItemCount : ĠInt ): ĠBuilder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . max Visible ItemCount Ġ= Ġmax Visible ItemCount ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġset Distance To Bottom ( distance To Bottom : ĠInt ): ĠBuilder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . distance To Bottom Ġ= Ġdistance To Bottom ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġset Rotate From Edge ( rotate From Edge : ĠBoolean ): ĠBuilder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . rotate From Edge Ġ= Ġrotate From Edge ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġbuild (): ĠGallery LayoutManager Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠGallery LayoutManager ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }