package Ġcom . k yle . arrow view Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics . Canvas Ċ import Ġandroid . graphics . Color Ċ import Ġandroid . graphics . Paint Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . View Ċ import Ġjava . util .* Ċ Ċ open Ġclass ĠArrow View Ġ: ĠView Ġ{ ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm Paint : ĠPaint ĊĠĠĠ Ġ// è¿ĶåĽŀ ç® Ń å¤´ çļĦ ä¸¤ æł¹ çº¿ æĿ¡ éķ¿åº¦ , åįķä½į dp ĊĠĠĠ Ġprivate Ġvar Ġm Line Length : ĠFloat Ġ= Ġ 0 . 0 f ĊĠĠĠ Ġ// è¿ĶåĽŀ ç® Ń å¤´ çļĦ ä¸¤ æł¹ çº¿ æĿ¡ å®½åº¦ , åįķä½į dp ĊĠĠĠ Ġprivate Ġvar Ġm LineWidth : ĠFloat Ġ= Ġ 0 . 0 f ĊĠĠĠ Ġ// ä¸¤ æł¹ çº¿ æĿ¡ å¤¹ è§Ĵ ĊĠĠĠ Ġprivate Ġvar Ġm Line Radius : ĠDouble Ġ= Ġ 0 . 0 ĊĠĠĠ Ġ// ç® Ń å¤´ æĸ¹åĲĳ ĊĠĠĠ Ġprivate Ġvar Ġm Direction Ġ= ĠDirection . LEFT ĊĊĠĠĠ Ġprivate Ġvar ĠDEFAULT _ LINE _ COLOR Ġ= ĠColor . parse Color ("# 6 0 6 0 6 0 ") ĊĠĠĠ Ġprivate Ġvar ĠDEFAULT _ LINE _ LENGTH Ġ= Ġ 1 4 F ĊĠĠĠ Ġprivate Ġvar ĠDEFAULT _ LINE _ WIDTH Ġ= Ġ 2 F ĊĊĠĠĠ Ġprivate Ġvar Ġm Line Color Ġ= ĠDEFAULT _ LINE _ COLOR ĊĊĊĠĠĠ Ġenum Ġclass ĠDirection Ġ{ ĊĠĠĠĠĠĠĠ ĠTOP , ĠLEFT , ĠRIGHT , ĠBOTTOM ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( context : ĠContext ) Ġ: Ġsuper ( context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinit () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( context : ĠContext , Ġattrs : ĠAttributeSet ) Ġ: Ġsuper ( context , Ġattrs ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtyped Array Ġ= Ġcontext . obtain Styled Attributes ( attrs , ĠR . style able . Arrow View ) ĊĠĠĠĠĠĠĠ Ġm Line Color Ġ= Ġtyped Array . getColor ( R . style able . Arrow View _ av _ line Color , ĠDEFAULT _ LINE _ COLOR ) ĊĠĠĠĠĠĠĠ Ġm Direction = ĠDirection . values ()[ typed Array . getInt ( R . style able . Arrow View _ av _ direction , Direction . LEFT . ordinal )] ĊĠĠĠĠĠĠĠ Ġm Line Length = typed Array . get Dimension ( R . style able . Arrow View _ av _ line _ length , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠD ensity Util . dip 2 px ( context , DEFAULT _ LINE _ LENGTH ). toFloat () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġm LineWidth = typed Array . get Dimension ( R . style able . Arrow View _ av _ line _ width , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠD ensity Util . dip 2 px ( context , DEFAULT _ LINE _ WIDTH ). toFloat () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġinit () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** * ĊĠĠĠĠ Ġ* ĠåĪĿå§ĭåĮĸ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġinit () Ġ{ ĊĠĠĠĠĠĠĠ Ġm Line Radius Ġ= ĠMath . to Radians ( 9 0 . 0 ) ĊĠĠĠĠĠĠĠ Ġm Paint Ġ= ĠPaint ( Paint . ANTI _ ALIAS _ FLAG ) ĊĠĠĠĠĠĠĠ Ġm Paint . color Ġ= Ġm Line Color ĊĠĠĠĠĠĠĠ Ġm Paint . stroke Width Ġ= Ġm LineWidth ĊĠĠĠĠĠĠĠ Ġinvalidate () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ@ Suppress Lint (" Draw Allocation ") ĊĠĠĠ Ġoverride Ġfun Ġon Draw ( canvas : ĠCanvas ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Draw ( canvas ) ĊĠĠĠĠĠĠĠ ĠLog . e (" on Draw ", Ġ" on Draw ") ĊĠĠĠĠĠĠĠ Ġval Ġpoints : ĠArrayList < Float > Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠ Ġval Ġhead Point X : ĠFloat ĊĠĠĠĠĠĠĠ Ġvar Ġhead Point Y Ġ= Ġ 0 . 0 f ĊĠĠĠĠĠĠĠ Ġval Ġhalf Radius Ġ= Ġm Line Radius Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠ Ġval Ġsin Half Radius Ġ= ĠMath . sin ( half Radius ) ĊĠĠĠĠĠĠĠ Ġval Ġcos Half Radius Ġ= ĠMath . cos ( half Radius ) ĊĠĠĠĠĠĠĠ Ġval Ġover X Ġ= Ġ( sin Half Radius Ġ* Ġm Paint . stroke Width Ġ/ Ġ 2 ). toFloat () ĊĠĠĠĠĠĠĠ Ġval Ġover Y Ġ= Ġ( cos Half Radius Ġ* Ġm Paint . stroke Width Ġ/ Ġ 2 ). toFloat () ĊĠĠĠĠĠĠĠ Ġval Ġline Length Half Cos Ġ= Ġ( cos Half Radius Ġ* Ġm Line Length ). toFloat () ĊĠĠĠĠĠĠĠ Ġval Ġline Length Half Sin Ġ= Ġ( sin Half Radius Ġ* Ġm Line Length ). toFloat () ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( m Direction ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDirection . TOP Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhead Point X Ġ= Ġline Length Half Cos ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpoints . add ( head Point X Ġ+ Ġover X ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpoints . add ( head Point Y Ġ+ Ġover Y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpoints . add ( 0 f Ġ+ Ġover X ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpoints . add ( line Length Half Sin Ġ+ Ġover Y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpoints . add ( head Point X Ġ- Ġover X ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpoints . add ( head Point Y Ġ+ Ġover Y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpoints . add ( 2 Ġ* Ġhead Point X Ġ- Ġover X ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpoints . add ( line Length Half Sin Ġ+ Ġover Y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDirection . LEFT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhead Point Y Ġ= Ġline Length Half Sin ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhead Point X Ġ= Ġover X ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpoints . add ( head Point X ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpoints . add ( head Point Y Ġ+ Ġover Y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpoints . add ( line Length Half Cos Ġ+ Ġover X ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpoints . add ( 0 f Ġ+ Ġover Y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpoints . add ( head Point X ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpoints . add ( head Point Y Ġ- Ġover Y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpoints . add ( line Length Half Cos Ġ+ Ġover X ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpoints . add ( 2 Ġ* Ġhead Point Y Ġ- Ġover Y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDirection . RIGHT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhead Point Y Ġ= Ġline Length Half Sin ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhead Point X Ġ= Ġline Length Half Cos ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpoints . add ( head Point X Ġ+ Ġover X ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpoints . add ( head Point Y Ġ+ Ġover Y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpoints . add ( 0 f Ġ+ Ġover X ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpoints . add ( 0 f Ġ+ Ġover Y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpoints . add ( head Point X ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpoints . add ( head Point Y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpoints . add ( 0 f Ġ+ Ġover X ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpoints . add ( 2 Ġ* Ġhead Point Y Ġ- Ġover Y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDirection . BOTTOM Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhead Point X Ġ= Ġline Length Half Sin ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhead Point Y Ġ= Ġline Length Half Cos ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpoints . add ( head Point X Ġ+ Ġover X ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpoints . add ( head Point Y Ġ+ Ġover Y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpoints . add ( 0 f Ġ+ Ġover X ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpoints . add ( 0 f Ġ+ Ġover Y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpoints . add ( head Point X ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpoints . add ( head Point Y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpoints . add ( 2 Ġ* Ġhead Point X Ġ- Ġover X ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpoints . add ( 0 f Ġ+ Ġover Y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcanvas ?. draw Lines ( points . toFloat Array (), Ġm Paint ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Measure ( width Measure Spec : ĠInt , Ġheight Measure Spec : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġheight Spec Ġ= Ġheight Measure Spec ĊĠĠĠĠĠĠĠ Ġvar Ġwidth Spec Ġ= Ġwidth Measure Spec ĊĠĠĠĠĠĠĠ Ġval Ġover X Ġ= Ġ( Math . sin ( m Line Radius Ġ/ Ġ 2 ) Ġ* Ġm Paint . stroke Width Ġ/ Ġ 2 ). toFloat () ĊĠĠĠĠĠĠĠ Ġval Ġover Y Ġ= Ġ( Math . cos ( m Line Radius Ġ/ Ġ 2 ) Ġ* Ġm Paint . stroke Width Ġ/ Ġ 2 ). toFloat () ĊĠĠĠĠĠĠĠ Ġif Ġ( Measure Spec . get Mode ( height Measure Spec ) Ġ== ĠMeasure Spec . AT _ MO ST ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġheight Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheight Ġ= Ġwhen Ġ( m Direction ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDirection . TOP , ĠDirection . BOTTOM Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( Math . cos ( m Line Radius Ġ/ Ġ 2 ) Ġ* Ġm Line Length ). toFloat () Ġ+ Ġ 2 Ġ* Ġover Y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDirection . LEFT , ĠDirection . RIGHT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 2 Ġ* Ġ( Math . sin ( m Line Radius Ġ/ Ġ 2 ) Ġ* Ġm Line Length ). toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheight Spec Ġ= ĠMeasure Spec . make Measure Spec ( height . toInt (), ĠMeasure Spec . EX ACT LY ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( Measure Spec . get Mode ( width Measure Spec ) Ġ== ĠMeasure Spec . AT _ MO ST ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġwidth Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwidth Ġ= Ġwhen Ġ( m Direction ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDirection . TOP , ĠDirection . BOTTOM Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 2 Ġ* Ġ( Math . sin ( m Line Radius Ġ/ Ġ 2 ) Ġ* Ġm Line Length ). toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDirection . LEFT , ĠDirection . RIGHT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( Math . cos ( m Line Radius Ġ/ Ġ 2 ) Ġ* Ġm Line Length ). toFloat () Ġ+ Ġ 2 Ġ* Ġover X ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwidth Spec Ġ= ĠMeasure Spec . make Measure Spec ( width . toInt (), ĠMeasure Spec . EX ACT LY ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsuper . on Measure ( width Spec , Ġheight Spec ) ĊĠĠĠ Ġ} Ċ } Ċ