package Ġcom . example . administrator . gyro scope image demo . ui . view Ċ Ċ import Ġandroid . animation . Value Animator Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics . Camera Ċ import Ġandroid . graphics . Canvas Ċ import Ġandroid . graphics . Matrix Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . view . Motion Event Ċ import Ġandroid . view . animation . Bo unce Interpolator Ċ import Ġandroid . widget . Frame Layout Ċ Ċ class ĠTouch Rotate Layout Ġ@ Jvm Over loads Ġconstructor ( ĊĠĠĠ Ġcontext : ĠContext , Ġattrs : ĠAttributeSet ? Ġ= Ġnull , Ġdef Style Attr : ĠInt Ġ= Ġ 0 , Ġdef Style Res : ĠInt Ġ= Ġ 0 Ċ ) Ġ: ĠFrame Layout ( context , Ġattrs , Ġdef Style Attr , Ġdef Style Res ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġm Camera Ġby Ġlazy Ġ{ ĠCamera () Ġ} ĊĠĠĠ Ġprivate Ġval Ġm Matrix Ġby Ġlazy Ġ{ ĠMatrix () Ġ} ĊĠĠĠ Ġprivate Ġvar Ġrecover Animator : ĠValue Animator ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġlast X Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġlast Y Ġ= Ġ 0 f ĊĊĠĠĠ Ġ// Ġ æĹ ĭ è½¬ è§Ĵ åº¦ ĊĠĠĠ Ġprivate Ġvar Ġm Rotate X Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġm Rotate Y Ġ= Ġ 0 f ĊĊĠĠĠ Ġ// Ġ å¤į åİŁ æĹ¶çļĦ èµ· å§ĭ ä½įç½® ĊĠĠĠ Ġprivate Ġvar Ġm Up Rotate X Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġm Up Rotate Y Ġ= Ġ 0 f ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġrecover Animator Ġ= ĠValue Animator . of Float ( 1 f , Ġ 0 f ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġduration Ġ= Ġ 5 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinterpol ator Ġ= ĠBo unce Interpolator () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Update Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpercent Ġ= Ġit . animated Value Ġas ĠFloat ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Rotate X Ġ= Ġm Up Rotate X Ġ* Ġpercent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Rotate Y Ġ= Ġm Up Rotate Y Ġ* Ġpercent ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Invalidate () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Touch Event ( event : ĠMotion Event ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( event ?. action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ DOWN Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( recover Animator Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecover Animator !!. cancel () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast X Ġ= Ġevent . x ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Y Ġ= Ġevent . y ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ MOVE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalc Rotate XY ( event . x Ġ- Ġlast X , Ġevent . y Ġ- Ġlast Y , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ UP Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalc Rotate XY ( event . x Ġ- Ġlast X , Ġevent . y Ġ- Ġlast Y , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecover Animator ?. start () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcalc Rotate XY ( x : ĠFloat , Ġy : ĠFloat , Ġis Up : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpercent X Ġ= Ġx Ġ/ Ġ( width Ġ/ Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġm Rotate X Ġ= Ġpercent X Ġ* Ġ 3 0 ĊĊĠĠĠĠĠĠĠ Ġval Ġpercent Y Ġ= Ġy Ġ/ Ġ( height Ġ/ Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġm Rotate Y Ġ= Ġpercent Y Ġ* Ġ 3 0 ĊĊĠĠĠĠĠĠĠ Ġif Ġ( is Up ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Up Rotate X Ġ= Ġm Rotate X ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Up Rotate Y Ġ= Ġm Rotate Y ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġpost Invalidate () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdispatch Draw ( canvas : ĠCanvas ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġ éĩį ç½® Matrix ĊĠĠĠĠĠĠĠ Ġm Matrix . reset () ĊĊĠĠĠĠĠĠĠ Ġcanvas ?. save () ĊĠĠĠĠĠĠĠ Ġm Camera . save () ĊĊĠĠĠĠĠĠĠ Ġm Camera . rotate X ( m Rotate Y ) ĊĠĠĠĠĠĠĠ Ġm Camera . rotate Y ( m Rotate X ) ĊĊĠĠĠĠĠĠĠ Ġm Camera . get Matrix ( m Matrix ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġå°Ĩ åİŁ çĤ¹ ç§»åĬ¨ åĪ° ä¸Ńå¿ĥ ä½įç½® ĊĠĠĠĠĠĠĠ Ġm Matrix . pre Translate (- width Ġ/ Ġ 2 f , Ġ- height Ġ/ Ġ 2 f ) ĊĠĠĠĠĠĠĠ Ġm Matrix . post Translate ( width Ġ/ Ġ 2 f , Ġheight Ġ/ Ġ 2 f ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġæĵ įä½ľ å®Į å¹¶ä¸Ķ èİ·åıĸ äºĨ Matrix åĲİ è¦ģ æģ ¢å¤į camera çļĦ çĬ¶æĢģ ĊĠĠĠĠĠĠĠ Ġm Camera . restore () ĊĊĠĠĠĠĠĠĠ Ġ// Ġå°Ĩ æĵįä½ľ camera äº§çĶŁ çļĦ Matrix èµĭ ç»Ļ canvas ĊĠĠĠĠĠĠĠ Ġcanvas ?. set Matrix ( m Matrix ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġ çľŁ æŃ£ ç»ĺ åĪ¶ ĊĠĠĠĠĠĠĠ Ġsuper . dispatch Draw ( canvas ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ç»ĺ åĪ¶ å®Į ä¹ĭåĲİ è¦ģ æģ ¢å¤į canvas çļĦ çĬ¶æĢģ ĊĠĠĠĠĠĠĠ Ġcanvas ?. restore () ĊĠĠĠ Ġ} Ċ }