package Ġio . me how . labor atory . inspector . ky rie Ċ Ċ import Ġandroid . graphics . Canvas Ċ import Ġandroid . graphics . Matrix Ċ import Ġandroid . graphics . PointF Ċ import Ġandroidx . annotation . Size Ċ Ċ /** ĠAbstract Ġbase Ġ[ Node ] Ġfor Ġall Ġnode Ġtypes Ġthat Ġcan Ġbe Ġtransformed . Ġ*/ Ċ internal Ġabstract Ġclass ĠTransform Node Ġinternal Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġval Ġrotation : ĠList < Animation < *, ĠFloat >>, ĊĠĠĠĠĠĠĠ Ġval Ġpivot X : ĠList < Animation < *, ĠFloat >>, ĊĠĠĠĠĠĠĠ Ġval Ġpivot Y : ĠList < Animation < *, ĠFloat >>, ĊĠĠĠĠĠĠĠ Ġval Ġscale X : ĠList < Animation < *, ĠFloat >>, ĊĠĠĠĠĠĠĠ Ġval Ġscale Y : ĠList < Animation < *, ĠFloat >>, ĊĠĠĠĠĠĠĠ Ġval ĠtranslateX : ĠList < Animation < *, ĠFloat >>, ĊĠĠĠĠĠĠĠ Ġval ĠtranslateY : ĠList < Animation < *, ĠFloat >> Ċ ) Ġ: ĠNode () Ġ{ ĊĊĠĠĠ Ġ// Ġ< editor - fold Ġdesc =" Layer "> ĊĊĠĠĠ Ġabstract Ġoverride Ġfun Ġto Layer ( timeline : ĠProperty Timeline ): ĠTransform Layer ĊĊĠĠĠ Ġinternal Ġabstract Ġclass ĠTransform Layer ( private Ġval Ġtimeline : ĠProperty Timeline , Ġnode : ĠTransform Node ) Ġ: ĠLayer Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġrotation Ġ= Ġregister Anim atable Property ( node . rotation ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġpivot X Ġ= Ġregister Anim atable Property ( node . pivot X ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġpivot Y Ġ= Ġregister Anim atable Property ( node . pivot Y ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġscale X Ġ= Ġregister Anim atable Property ( node . scale X ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġscale Y Ġ= Ġregister Anim atable Property ( node . scale Y ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠtranslateX Ġ= Ġregister Anim atable Property ( node . translate X ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠtranslateY Ġ= Ġregister Anim atable Property ( node . translate Y ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġtemp Matrix Ġ= ĠMatrix () ĊĊĠĠĠĠĠĠĠ Ġ@ Size ( value Ġ= Ġ 4 ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġtemp Unit Vectors Ġ= ĠFloat Array ( 4 ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġ< V > Ġregister Anim atable Property ( animations : ĠList < Animation < *, ĠV >> ): ĠProperty < V > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtimeline . register Anim atable Property ( animations ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdraw ( canvas : ĠCanvas , Ġparent Matrix : ĠMatrix , Ġviewport Scale : ĠPoint F ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrotation Ġ= Ġthis . rotation . animated Value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpivot X Ġ= Ġthis . pivot X . animated Value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpivot Y Ġ= Ġthis . pivot Y . animated Value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscale X Ġ= Ġthis . scale X . animated Value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscale Y Ġ= Ġthis . scale Y . animated Value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠtranslateX Ġ= Ġthis . translate X . animated Value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠtranslateY Ġ= Ġthis . translate Y . animated Value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtemp Matrix . set ( parent Matrix ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( translate X Ġ+ Ġpivot X Ġ!= Ġ 0 f Ġ|| ĠtranslateY Ġ+ Ġpivot Y Ġ!= Ġ 0 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp Matrix . pre Translate ( translate X Ġ+ Ġpivot X , ĠtranslateY Ġ+ Ġpivot Y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( rotation Ġ!= Ġ 0 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp Matrix . pre Rotate ( rotation , Ġ 0 f , Ġ 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( scale X Ġ!= Ġ 1 f Ġ|| Ġscale Y Ġ!= Ġ 1 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp Matrix . pre Scale ( scale X , Ġscale Y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pivot X Ġ!= Ġ 0 f Ġ|| Ġpivot Y Ġ!= Ġ 0 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp Matrix . pre Translate (- pivot X , Ġ- pivot Y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Draw ( canvas , Ġtemp Matrix , Ġviewport Scale ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġget Matrix Scale ( matrix : ĠMatrix ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGiven Ġunit Ġvectors ĠA Ġ= Ġ( 0 , Ġ 1 ) Ġand ĠB Ġ= Ġ( 1 , Ġ 0 ). ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAfter Ġmatrix Ġmapping , Ġwe Ġgot ĠA ' Ġand ĠB '. ĠLet Ġtheta Ġ= Ġthe Ġangle Ġb / t ĠA ' Ġand ĠB '. ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTherefore , Ġthe Ġfinal Ġscale Ġwe Ġwant Ġis Ġmin (| A ' | Ġ* Ġsin ( theta ), Ġ| B ' | Ġ* Ġsin ( theta )), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwhich Ġis Ġ( | A ' | Ġ* Ġ| B ' | Ġ* Ġsin ( theta )) Ġ/ Ġmax Ġ( | A ' |, Ġ| B ' | ); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġmax Ġ( | A ' |, Ġ| B ' |) Ġ= Ġ 0 , Ġthat Ġmeans Ġeither Ġx Ġor Ġy Ġhas Ġa Ġscale Ġof Ġ 0 . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFor Ġnon - skew Ġcase , Ġwhich Ġis Ġmost Ġof Ġthe Ġcases , Ġmatrix Ġscale Ġis Ġcomputing Ġexactly Ġthe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġscale Ġon Ġx Ġand Ġy Ġaxis , Ġand Ġtake Ġthe Ġminimal Ġof Ġthese Ġtwo . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFor Ġskew Ġcase , Ġan Ġunit Ġsquare Ġwill Ġmapped Ġto Ġa Ġparalle log ram . ĠAnd Ġthis Ġfunction Ġwill ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġreturn Ġthe Ġminimal Ġheight Ġof Ġthe Ġ 2 Ġbases . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġunit Vectors Ġ= Ġtemp Unit Vectors ĊĠĠĠĠĠĠĠĠĠĠĠ Ġunit Vectors [ 0 ] Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġunit Vectors [ 1 ] Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġunit Vectors [ 2 ] Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġunit Vectors [ 3 ] Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmatrix . map Vectors ( unit Vectors ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscale X Ġ= ĠMath . h ypot ( unit Vectors [ 0 ]. toDouble (), Ġunit Vectors [ 1 ]. toDouble ()). toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscale Y Ġ= ĠMath . h ypot ( unit Vectors [ 2 ]. toDouble (), Ġunit Vectors [ 3 ]. toDouble ()). toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcross Product Ġ= Ġcross ( unit Vectors [ 0 ], Ġunit Vectors [ 1 ], Ġunit Vectors [ 2 ], Ġunit Vectors [ 3 ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmax Scale Ġ= ĠMath . max ( scale X , Ġscale Y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( max Scale Ġ> Ġ 0 ) ĠMath . abs ( cross Product ) Ġ/ Ġmax Scale Ġelse Ġ 0 f ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġcross ( v 1 x : ĠFloat , Ġv 1 y : ĠFloat , Ġv 2 x : ĠFloat , Ġv 2 y : ĠFloat ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġv 1 x Ġ* Ġv 2 y Ġ- Ġv 1 y Ġ* Ġv 2 x ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġ</ editor - fold > ĊĊĠĠĠ Ġ// Ġ< editor - fold Ġdesc =" Builder "> ĊĊĠĠĠ Ġ@ Dsl Marker ĊĠĠĠ Ġprivate Ġannotation Ġclass ĠTransform Node Marker ĊĊĠĠĠ Ġ@ Transform Node Marker ĊĠĠĠ Ġabstract Ġclass ĠBuilder < B Ġ: ĠBuilder < B >> Ġinternal Ġconstructor () Ġ: ĠNode . Builder < B >() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrotation Ġ= Ġas Animations ( 0 f ) ĊĠĠĠĠĠĠĠ Ġval Ġpivot X Ġ= Ġas Animations ( 0 f ) ĊĠĠĠĠĠĠĠ Ġval Ġpivot Y Ġ= Ġas Animations ( 0 f ) ĊĠĠĠĠĠĠĠ Ġval Ġscale X Ġ= Ġas Animations ( 1 f ) ĊĠĠĠĠĠĠĠ Ġval Ġscale Y Ġ= Ġas Animations ( 1 f ) ĊĠĠĠĠĠĠĠ Ġval ĠtranslateX Ġ= Ġas Animations ( 0 f ) ĊĠĠĠĠĠĠĠ Ġval ĠtranslateY Ġ= Ġas Animations ( 0 f ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠRotation . ĊĊĠĠĠĠĠĠĠ Ġfun Ġrotation ( initial Rotation : ĠFloat ): ĠB Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġreplace First Animation ( rotation , Ġas Animation ( initial Rotation )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Safe Var args ĊĠĠĠĠĠĠĠ Ġfun Ġrotation ( var arg Ġanimations : ĠAnimation < *, ĠFloat >): ĠB Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġreplace Animations ( rotation , Ġ* animations ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġrotation ( animations : ĠList < Animation < *, ĠFloat >> ): ĠB Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġreplace Animations ( rotation , Ġanimations ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠP ivot ĠX . ĊĊĠĠĠĠĠĠĠ Ġfun Ġpivot X ( initial Pivot X : ĠFloat ): ĠB Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġreplace First Animation ( pivot X , Ġas Animation ( initial Pivot X )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Safe Var args ĊĠĠĠĠĠĠĠ Ġfun Ġpivot X ( var arg Ġanimations : ĠAnimation < *, ĠFloat >): ĠB Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġreplace Animations ( pivot X , Ġ* animations ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġpivot X ( animations : ĠList < Animation < *, ĠFloat >> ): ĠB Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġreplace Animations ( pivot X , Ġanimations ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠP ivot ĠY . ĊĊĠĠĠĠĠĠĠ Ġfun Ġpivot Y ( initial Pivot Y : ĠFloat ): ĠB Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġreplace First Animation ( pivot Y , Ġas Animation ( initial Pivot Y )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Safe Var args ĊĠĠĠĠĠĠĠ Ġfun Ġpivot Y ( var arg Ġanimations : ĠAnimation < *, ĠFloat >): ĠB Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġreplace Animations ( pivot Y , Ġ* animations ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġpivot Y ( animations : ĠList < Animation < *, ĠFloat >> ): ĠB Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġreplace Animations ( pivot Y , Ġanimations ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠScale ĠX . ĊĊĠĠĠĠĠĠĠ Ġfun Ġscale X ( initial Scale X : ĠFloat ): ĠB Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġreplace First Animation ( scale X , Ġas Animation ( initial Scale X )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Safe Var args ĊĠĠĠĠĠĠĠ Ġfun Ġscale X ( var arg Ġanimations : ĠAnimation < *, ĠFloat >): ĠB Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġreplace Animations ( scale X , Ġ* animations ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġscale X ( animations : ĠList < Animation < *, ĠFloat >> ): ĠB Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġreplace Animations ( scale X , Ġanimations ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠScale ĠY . ĊĊĠĠĠĠĠĠĠ Ġfun Ġscale Y ( initial Scale Y : ĠFloat ): ĠB Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġreplace First Animation ( scale Y , Ġas Animation ( initial Scale Y )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Safe Var args ĊĠĠĠĠĠĠĠ Ġfun Ġscale Y ( var arg Ġanimations : ĠAnimation < *, ĠFloat >): ĠB Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġreplace Animations ( scale Y , Ġ* animations ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġscale Y ( animations : ĠList < Animation < *, ĠFloat >> ): ĠB Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġreplace Animations ( scale Y , Ġanimations ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠTranslate ĠX . ĊĊĠĠĠĠĠĠĠ Ġfun ĠtranslateX ( initial Translate X : ĠFloat ): ĠB Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġreplace First Animation ( translate X , Ġas Animation ( initial Translate X )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Safe Var args ĊĠĠĠĠĠĠĠ Ġfun ĠtranslateX ( var arg Ġanimations : ĠAnimation < *, ĠFloat >): ĠB Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġreplace Animations ( translate X , Ġ* animations ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun ĠtranslateX ( animations : ĠList < Animation < *, ĠFloat >> ): ĠB Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġreplace Animations ( translate X , Ġanimations ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠTranslate ĠY . ĊĊĠĠĠĠĠĠĠ Ġfun ĠtranslateY ( initial Translate Y : ĠFloat ): ĠB Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġreplace First Animation ( translate Y , Ġas Animation ( initial Translate Y )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Safe Var args ĊĠĠĠĠĠĠĠ Ġfun ĠtranslateY ( var arg Ġanimations : ĠAnimation < *, ĠFloat >): ĠB Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġreplace Animations ( translate Y , Ġ* animations ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun ĠtranslateY ( animations : ĠList < Animation < *, ĠFloat >> ): ĠB Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġreplace Animations ( translate Y , Ġanimations ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġabstract Ġoverride Ġfun Ġbuild (): ĠTransform Node ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġ</ editor - fold > Ċ } Ċ