/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 2 0 ĠTr inity . ĠAll Ġrights Ġreserved . Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 2 0 ĠWang ĠL ian J ie Ġ< w lan j ie 8 8 8 @ gmail . com > Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ @ file : Suppress (" DE PREC ATION ") Ċ Ċ package Ġcom . tr inity . sample . text Ċ Ċ import Ġandroid . annotation . Target Api Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics .* Ċ import Ġandroid . graphics . Paint . Join Ċ import Ġandroid . os . Build . VERSION Ċ import Ġandroid . os . Build . VERSION _ CODES Ċ import Ġandroid . text . Layout Ċ import Ġandroid . text . Static Layout Ċ import Ġandroid . text . Text Paint Ċ import Ġandroid . text . TextUtils Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . util . Log Ċ import Ġandroid . util . Typed Value Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget . ImageView Ċ import Ġandroid . widget . TextView Ċ import Ġandroidx . appcompat . widget . AppCompat TextView Ċ import Ġjava . io . File Ċ import Ġjava . io . File OutputStream Ċ import Ġjava . io . IOException Ċ import Ġkotlin . math . max Ċ Ċ open Ġclass ĠAuto Res izing TextView Ġ: ĠAppCompat TextView Ġ{ ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġprivate Ġconst Ġval ĠNO _ LINE _ LIMIT Ġ= Ġ- 1 ĊĠ Ġ} ĊĊĠ Ġprivate Ġvar ĠmCurrent Color Ġ= ĠColor . WHITE ĊĠ Ġprivate Ġvar ĠmCurrent Stroke Color Ġ= ĠColor . WHITE ĊĠ Ġprotected Ġvar Ġm Stroke Width Ġ= Ġ 0 f ĊĠ Ġprotected Ġvar Ġm Stroke Join : ĠJoin ? Ġ= Ġnull ĊĠ Ġprotected Ġvar Ġm Stroke M iter Ġ= Ġ 0 f ĊĠ Ġprivate Ġvar Ġm Frozen Ġ= Ġfalse ĊĠ Ġvar Ġm Scale By Drawable Ġ= Ġfalse ĊĠ Ġprivate Ġval Ġm Text Rect Ġ= ĠRect F () ĊĠ Ġprivate Ġvar Ġm Available Space Rect : ĠRect F ? Ġ= Ġnull ĊĠ Ġprivate Ġvar Ġm Paint : ĠText Paint ? Ġ= Ġnull ĊĠ Ġprivate Ġvar Ġm Text Angle Ġ= Ġ 0 f ĊĠ Ġprivate Ġvar Ġm Max Text Size Ġ= Ġ 0 f ĊĠ Ġprivate Ġvar Ġm Spacing Mult Ġ= Ġ 1 . 0 f ĊĠ Ġprivate Ġvar Ġm Spacing Add Ġ= Ġ 0 . 0 f ĊĠ Ġprivate Ġvar Ġm Min Text Size Ġ= Ġ 0 f ĊĠ Ġprivate Ġvar Ġm Last Width Ġ= Ġ 0 ĊĠ Ġprivate Ġvar Ġm Last Height Ġ= Ġ 0 ĊĠ Ġprivate Ġvar Ġm Width Ġ= Ġ 0 ĊĠ Ġprivate Ġvar Ġm Height Ġ= Ġ 0 ĊĠ Ġprivate Ġvar Ġm Top Ġ= Ġ 0 ĊĠ Ġprivate Ġvar Ġm Left Ġ= Ġ 0 ĊĠ Ġprivate Ġvar Ġm Right Ġ= Ġ 0 ĊĠ Ġprivate Ġvar Ġm Bottom Ġ= Ġ 0 ĊĠ Ġprivate Ġvar Ġm Font Path : ĠString ? Ġ= Ġnull ĊĠ Ġprivate Ġvar Ġis Edit Completed Ġ= Ġfalse ĊĠ Ġprivate Ġvar Ġis Mirror Ġ= Ġfalse ĊĠ Ġprivate Ġvar Ġis Text Only Ġ= Ġfalse ĊĠ Ġprivate Ġvar Ġm Layout : ĠStatic Layout ? Ġ= Ġnull ĊĠ Ġprivate Ġvar Ġm Bitmap Generator : ĠText Bitmap Generator ? Ġ= Ġnull ĊĠ Ġprivate Ġvar Ġm Text Bitmap : ĠText Bitmap ? Ġ= Ġnull ĊĠ Ġprivate Ġvar Ġm Max Lines Ġ= Ġ 0 ĊĠ Ġprivate Ġvar Ġm Initialized Ġ= Ġfalse ĊĠ Ġprivate Ġvar Ġm Max Width When Out of Ġ= Ġ 0 ĊĠ Ġprivate Ġvar Ġm Max Height When Out of Ġ= Ġ 0 ĊĠ Ġprivate Ġvar Ġm Width Limit Ġ= Ġ 0 ĊĊĠ Ġconstructor ( context : ĠContext ) Ġ: Ġsuper ( context ) Ġ{ ĊĠĠĠ Ġinit () ĊĠ Ġ} ĊĊĠ Ġconstructor ( context : ĠContext , Ġattrs : ĠAttributeSet ?) Ġ: Ġsuper ( context , Ġattrs ) Ġ{ ĊĠĠĠ Ġinit () ĊĠ Ġ} ĊĊĠ Ġconstructor ( context : ĠContext , Ġattrs : ĠAttributeSet ?, Ġdef Style Attr : ĠInt ) Ġ: Ġsuper ( context , Ġattrs , Ġdef Style Attr ) Ġ{ ĊĠĠĠ Ġinit () ĊĠ Ġ} ĊĊĠ Ġ@ Target Api ( VERSION _ CODES . J EL LY _ BE AN ) ĊĠ Ġfun Ġgenerate Spacing mult And Spacing add ( args : ĠFloat Array , Ġtext view : ĠTextView ) Ġ{ ĊĠĠĠ Ġif Ġ( VERSION . SDK _ INT Ġ>= ĠVERSION _ CODES . J EL LY _ BE AN ) Ġ{ ĊĠĠĠĠĠ Ġargs [ 0 ] Ġ= Ġtext view . line Spacing Multiplier ĊĠĠĠĠĠ Ġargs [ 1 ] Ġ= Ġtext view . line Spacing Extra ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġargs [ 0 ] Ġ= Ġ 1 f ĊĠĠĠĠĠ Ġargs [ 1 ] Ġ= Ġ 0 f ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġinit () Ġ{ ĊĠĠĠ Ġm Stroke Join Ġ= ĠPaint . Join . ROUND ĊĠĠĠ Ġm Stroke M iter Ġ= Ġ 1 0 f ĊĠĠĠ Ġm Max Text Size Ġ= ĠTyped Value . apply Dimension ( ĊĠĠĠĠĠĠĠ ĠTyped Value . COMPLEX _ UNIT _ SP , Ġ 1 8 0 f , ĊĠĠĠĠĠĠĠ Ġresources . display Metrics ) ĊĠĠĠ Ġm Max Text Size Ġ= Ġresources . display Metrics . width Pixels . toFloat () ĊĠĠĠ Ġm Available Space Rect Ġ= ĠRect F () ĊĠĠĠ Ġif Ġ( m Max Lines Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠ Ġ// Ġno Ġvalue Ġwas Ġassigned Ġduring Ġconstruction ĊĠĠĠĠĠ Ġm Max Lines Ġ= ĠNO _ LINE _ LIMIT ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġadd And Mult Ġ= ĠFloat Array ( 2 ) ĊĠĠĠ Ġgenerate Spacing mult And Spacing add ( add And Mult , Ġthis ) ĊĠĠĠ Ġm Spacing Mult Ġ= Ġadd And Mult [ 0 ] ĊĠĠĠ Ġm Spacing Add Ġ= Ġadd And Mult [ 1 ] ĊĠĠĠ Ġm Initialized Ġ= Ġtrue ĊĊĠĠĠ Ġpost Ġ{ ĊĠĠĠĠĠ Ġval Ġpw Ġ= Ġ( parent Ġas ĠViewGroup ). width ĊĠĠĠĠĠ Ġval Ġph Ġ= Ġ( parent Ġas ĠViewGroup ). height ĊĠĠĠĠĠ Ġval Ġpadding Ġ= ĠTyped Value . apply Dimension ( Typed Value . COMPLEX _ UNIT _ DIP , Ġ 3 0 f , Ġresources . display Metrics ). toInt () ĊĠĠĠĠĠ Ġm Max Width When Out of Ġ= Ġpw Ġ- Ġpadding ĊĠĠĠĠĠ Ġm Max Height When Out of Ġ= Ġph Ġ- Ġpadding Ġ* Ġ 3 ĊĠĠĠĠĠ ĠmaxWidth Ġ= Ġm Max Width When Out of ĊĠĠĠĠĠ ĠmaxHeight Ġ= Ġm Max Height When Out of ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġval Ġm Size Tester : ĠSize Tester Ġ= Ġobject Ġ: ĠSize Tester Ġ{ ĊĠĠĠ Ġ@ Target Api ( VERSION _ CODES . J EL LY _ BE AN ) ĊĊĠĠĠ Ġoverride Ġfun Ġon Test Size ( suggest ed Size : ĠInt , Ġavailable SP ace : ĠRect F ?, Ġtext : ĠString ?): ĠInt Ġ{ ĊĠĠĠĠĠ Ġm Paint ?. text Size Ġ= Ġsuggested Size . toFloat () ĊĠĠĠĠĠ Ġm Layout Ġ= ĠStatic Layout ( text , Ġm Paint , ĊĠĠĠĠĠĠĠĠĠ Ġm Width Limit , ĠLayout . Alignment . ALIGN _ NORMAL , Ġm Spacing Mult , ĊĠĠĠĠĠĠĠĠĠ Ġm Spacing Add , Ġtrue ) ĊĠĠĠĠĠ Ġif Ġ( m Max Lines Ġ!= ĠNO _ LINE _ LIMIT ĊĠĠĠĠĠĠĠĠĠ Ġ&& Ġ( m Layout ?. line Count Ġ?: Ġ 0 Ġ> Ġm Max Lines Ġ|| Ġline Count Ġ> Ġm Max Lines )) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// å¤§ äºĨ ĊĠĠĠĠĠĠĠ ĠLog . d (" suggest ", Ġ" m Max Lines Ġreturn Ġ Ġ, max Line Ġ: Ġ$ m Max Lines ") ĊĠĠĠĠĠĠĠ Ġreturn Ġ 1 ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġval Ġtl Ġ= Ġcalculate Max Lines By Text ( text Ġ?: Ġ"") ĊĠĠĠĠĠ Ġif Ġ( m Layout ?. line Count Ġ?: Ġ 0 Ġ> Ġtl ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d (" tr inity ", Ġ" m Layout Ġreturn Ġ, tl Ġ: Ġ$ tl ") ĊĠĠĠĠĠĠĠ Ġreturn Ġ 1 ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġm Text Rect . bottom Ġ= Ġm Layout ?. height ?. toFloat () Ġ?: Ġ 0 f ĊĠĠĠĠĠ Ġm Text Rect . right Ġ= Ġget Layout Max Width (). toFloat () ĊĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġm Text Rect . offset To ( 0 f , Ġ 0 f ) ĊĠĠĠĠĠ ĠLog . d (" tr inity ", Ġ" suggest Ġsize Ġ: Ġ" Ġ+ Ġsuggested Size Ġ+ ĊĠĠĠĠĠĠĠĠĠ Ġ" Ġwidth Ġ: Ġ" Ġ+ Ġm Text Rect . right Ġ+ ĊĠĠĠĠĠĠĠĠĠ Ġ" Ġheight Ġ: Ġ" Ġ+ Ġm Text Rect . bottom Ġ+ ĊĠĠĠĠĠĠĠĠĠ Ġ" Ġmatch Ġ: Ġ" Ġ+ Ġavailable SP ace ?. contains ( m Text Rect ) Ġ+ ĊĠĠĠĠĠĠĠĠĠ Ġ" Ġline Ġ: Ġ" Ġ+ Ġline Count Ġ+ ĊĠĠĠĠĠĠĠĠĠ Ġ" Ġmax Line Ġ: Ġ" Ġ+ Ġmax Lines Ġ+ ĊĠĠĠĠĠĠĠĠĠ Ġ" Ġlayout Line Ġ: Ġ" Ġ+ Ġ( m Layout ?. line Count Ġ?: Ġ 0 ) ĊĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġreturn Ġif Ġ( available SP ace ?. contains ( m Text Rect ) Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġmay Ġbe Ġtoo Ġsmall , Ġdon 't Ġworry Ġwe Ġwill Ġfind Ġthe Ġbest Ġmatch ĊĠĠĠĠĠĠĠ Ġ- 1 ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġtoo Ġbig ĊĠĠĠĠĠĠĠĠ 1 ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġvar Ġm ImageView : ĠImageView ? Ġ= Ġnull ĊĊĠ Ġfun Ġset ImageView ( imageView : ĠImageView ?) Ġ{ ĊĠĠĠ Ġm ImageView Ġ= ĠimageView ĊĠ Ġ} ĊĊĠ Ġfun Ġlayout To Bitmap (): ĠBitmap ? Ġ{ ĊĠĠĠ Ġval Ġtext Width Ġ= Ġm Width ĊĠĠĠ Ġval Ġtext Height Ġ= Ġm Height ĊĠĠĠ Ġvar Ġlayout Ġ= Ġlayout ĊĠĠĠ Ġif Ġ( layout Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġmeasure Self ( m Width , Ġm Height ) ĊĠĠĠĠĠ Ġval Ġw Ġ= Ġm Width Ġ+ Ġpadding Left Ġ+ Ġpadding Right ĊĠĠĠĠĠ Ġval Ġh Ġ= Ġm Height Ġ+ Ġpadding Top Ġ+ Ġpadding Bottom ĊĠĠĠĠĠ Ġsuper . measure ( Measure Spec . make Measure Spec ( w , ĠMeasure Spec . EX ACT LY ), ĊĠĠĠĠĠĠĠĠĠ ĠMeasure Spec . make Measure Spec ( h , ĠMeasure Spec . EX ACT LY )) ĊĠĠĠĠĠ Ġlayout Ġ= Ġget Layout () ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( layout Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġlayout Ġ= Ġm Layout ĊĠĠĠĠĠ Ġif Ġ( layout Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġvar Ġdw Ġ= Ġwidth ĊĠĠĠ Ġvar Ġdh Ġ= Ġheight ĊĠĠĠ Ġval Ġrw Ġ= Ġlayout . width ĊĠĠĠ Ġval Ġrh Ġ= Ġlayout . height ĊĠĠĠ Ġvar Ġfirst Init Ġ= Ġfalse ĊĠĠĠ Ġif Ġ( dw Ġ== Ġ 0 Ġ|| Ġdh Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠ Ġdw Ġ= Ġm Width ĊĠĠĠĠĠ Ġdh Ġ= Ġm Height ĊĠĠĠĠĠ Ġfirst Init Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġw : ĠInt ĊĠĠĠ Ġval Ġh : ĠInt ĊĠĠĠ Ġif Ġ( is Text Only ) Ġ{ ĊĠĠĠĠĠ Ġw Ġ= Ġdw ĊĠĠĠĠĠ Ġh Ġ= Ġdh ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġif Ġ( first Init ) Ġ{ ĊĠĠĠĠĠĠĠ Ġw Ġ= Ġdw ĊĠĠĠĠĠĠĠ Ġh Ġ= Ġdh ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġw Ġ= Ġdw Ġ- Ġpadding Left Ġ- Ġpadding Right ĊĠĠĠĠĠĠĠ Ġh Ġ= Ġdh Ġ- Ġpadding Top Ġ- Ġpadding Bottom ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( w Ġ== Ġ 0 Ġ|| Ġh Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġtext B mp Ġ= ĠBitmap . create Bitmap ( w , Ġh , ĠBitmap . Config . ARGB _ 8 8 8 8 ) ĊĠĠĠ Ġval Ġcanvas Ġ= ĠCanvas ( text B mp ) ĊĠĠĠ Ġcanvas . translate (( w Ġ- Ġrw ) Ġ/ Ġ 2 . toFloat (), Ġ( h Ġ- Ġrh ) Ġ/ Ġ 2 . toFloat ()) ĊĠĠĠ Ġval Ġpaint Ġ= Ġlayout . paint ĊĠĠĠ Ġif Ġ( m Current Stroke Color Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠ Ġpaint . style Ġ= ĠPaint . Style . ST RO KE ĊĠĠĠĠĠ Ġpaint . stroke Join Ġ= Ġm Stroke Join ĊĠĠĠĠĠ Ġpaint . stroke M iter Ġ= Ġm Stroke M iter ĊĠĠĠĠĠ Ġpaint . stroke Width Ġ= Ġgenerate Stroke Width () ĊĠĠĠĠĠ Ġpaint . color Ġ= ĠmCurrent Stroke Color ĊĠĠĠĠĠ Ġlayout . draw ( canvas ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġpaint . color Ġ= ĠmCurrent Color ĊĠĠĠ Ġpaint . style Ġ= ĠPaint . Style . FILL ĊĠĠĠ Ġlayout . draw ( canvas ) ĊĠĠĠ Ġif Ġ( m ImageView Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġm ImageView !!. setImage Bitmap ( text B mp ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġset Text Width ( text Width ) ĊĠĠĠ Ġset Text Height ( text Height ) ĊĠĠĠ Ġreturn Ġtext B mp ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġgenerate File From Bitmap ( bmp : ĠBitmap , Ġoutput Path : ĠString , Ġsrc MimeType : ĠString ): ĠBoolean Ġ{ ĊĠĠĠ Ġvar Ġtype Ġ= Ġsrc MimeType ĊĠĠĠ Ġval ĠoutputFile Ġ= ĠFile ( output Path ) ĊĠĠĠ Ġif Ġ(! outputFile . exists ()) Ġ{ ĊĠĠĠĠĠ Ġval Ġdir Ġ= ĠoutputFile . parent File Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠ Ġif Ġ(! dir . exists () Ġ&& Ġdir . isDirectory ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdir . mkdir s () ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ ĠoutputFile . createNew File () ĊĠĠĠ Ġ} ĊĠĠĠ Ġval ĠoutputStream Ġ= ĠFileOutputStream ( outputFile ) ĊĠĠĠ Ġtype Ġ= Ġif Ġ( TextUtils . isEmpty ( src MimeType )) Ġ" jpeg " Ġelse Ġsrc MimeType ĊĠĠĠ Ġif Ġ( output Path . endsWith (" jpg ") Ġ|| Ġoutput Path . endsWith (" jpeg ") ĊĠĠĠĠĠĠĠ Ġ|| Ġtype . endsWith (" jpg ") Ġ|| Ġtype . endsWith (" jpeg ")) Ġ{ ĊĠĠĠĠĠ Ġbmp . compress ( Bitmap . Compress Format . JPEG , Ġ 1 0 0 , ĠoutputStream ) ĊĠĠĠ Ġ} Ġelse Ġif Ġ( output Path . endsWith (" png ") Ġ|| Ġtype . endsWith (" png ")) Ġ{ ĊĠĠĠĠĠ Ġbmp . compress ( Bitmap . Compress Format . PNG , Ġ 1 0 0 , ĠoutputStream ) ĊĠĠĠ Ġ} Ġelse Ġif Ġ( output Path . endsWith (" webp ") Ġ|| Ġtype . endsWith (" webp ")) Ġ{ ĊĠĠĠĠĠ Ġbmp . compress ( Bitmap . Compress Format . WE BP , Ġ 1 0 0 , ĠoutputStream ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ ĠLog . e (" tr inity ", Ġ" not Ġsupported Ġimage Ġformat Ġfor Ġ'$ output Path '") ĊĠĠĠĠĠ ĠoutputStream . flush () ĊĠĠĠĠĠ ĠoutputStream . close () ĊĠĠĠĠĠ Ġif Ġ( outputFile . exists ()) Ġ{ ĊĠĠĠĠĠĠĠ ĠoutputFile . delete () ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĠĠĠ ĠoutputStream . flush () ĊĠĠĠ ĠoutputStream . close () ĊĠĠĠ Ġreturn Ġtrue ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġget Layout Max Width (): ĠInt Ġ{ ĊĠĠĠ Ġvar ĠmaxWidth Ġ= Ġ- 1 ĊĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġm Layout !!. line Count ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( maxWidth Ġ< Ġm Layout !!. get LineWidth ( i )) Ġ{ ĊĠĠĠĠĠĠĠ ĠmaxWidth Ġ= Ġm Layout !!. get LineWidth ( i ). toInt () ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn ĠmaxWidth ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġbinary Search ( start : ĠInt , Ġend : ĠInt , Ġtext : ĠString , Ġsize Tester : ĠSize Tester , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġavailable Space : ĠRect F ): ĠInt Ġ{ ĊĠĠĠ Ġvar Ġlast Best Ġ= Ġstart ĊĠĠĠ Ġvar Ġlo Ġ= Ġstart ĊĠĠĠ Ġvar Ġhi Ġ= Ġend Ġ- Ġ 1 ĊĠĠĠ Ġvar Ġmid Ġ= Ġ 0 ĊĠĠĠ ĠLog . d (" tr inity ", Ġ" start Ġ: Ġ" Ġ+ Ġstart Ġ+ ĊĠĠĠĠĠĠĠ Ġ" Ġend Ġ: Ġ" Ġ+ Ġend Ġ+ ĊĠĠĠĠĠĠĠ Ġ" Ġwidth Ġ: Ġ" Ġ+ Ġavailable Space . right Ġ+ ĊĠĠĠĠĠĠĠ Ġ" Ġheight Ġ: Ġ" Ġ+ Ġavailable Space . bottom ) ĊĠĠĠ Ġwhile Ġ( lo Ġ<= Ġhi ) Ġ{ ĊĠĠĠĠĠ Ġmid Ġ= Ġlo Ġ+ Ġhi Ġ ush r Ġ 1 ĊĠĠĠĠĠ Ġval Ġmid Val Cmp Ġ= Ġsize Tester . on Test Size ( mid , Ġavailable Space , Ġtext ) ĊĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġmid Val Cmp Ġ< Ġ 0 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġlast Best Ġ= Ġlo ĊĠĠĠĠĠĠĠĠĠ Ġlo Ġ= Ġmid Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmid Val Cmp Ġ> Ġ 0 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġhi Ġ= Ġmid Ġ- Ġ 1 ĊĠĠĠĠĠĠĠĠĠ Ġlast Best Ġ= Ġhi ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġreturn Ġmid ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ ĠLog . d (" BINARY TEXT ", Ġ" last Ġbest Ġ: Ġ$ last Best ") ĊĠĠĠ Ġ// Ġmake Ġsure Ġto Ġreturn Ġlast Ġbest ĊĠĠĠ Ġ// Ġthis Ġis Ġwhat Ġshould Ġalways Ġbe Ġreturned ĊĠĠĠ Ġreturn Ġlast Best ĊĠ Ġ} ĊĊĠ Ġfun ĠgetMax Text Size (): ĠFloat Ġ{ ĊĠĠĠ Ġreturn Ġm Max Text Size ĊĠ Ġ} ĊĊĠ Ġfun Ġset Edit Completed ( is Edit Completed : ĠBoolean ) Ġ{ ĊĠĠĠ Ġthis . is Edit Completed Ġ= Ġis Edit Completed ĊĠ Ġ} ĊĊĠ Ġfun Ġset Text Width ( m Width : ĠInt ) Ġ{ ĊĠĠĠ Ġthis . m Width Ġ= Ġm Width ĊĠ Ġ} ĊĊĠ Ġfun Ġset Text Height ( m Height : ĠInt ) Ġ{ ĊĠĠĠ Ġthis . m Height Ġ= Ġm Height ĊĠ Ġ} ĊĊĠ Ġfun Ġset Text Only ( is Text Only : ĠBoolean ) Ġ{ ĊĠĠĠ Ġthis . is Text Only Ġ= Ġis Text Only ĊĠ Ġ} ĊĊĠ Ġfun Ġset Text Top ( m Top : ĠInt ) Ġ{ ĊĠĠĠ Ġthis . m Top Ġ= Ġm Top ĊĠ Ġ} ĊĊĠ Ġfun Ġset Text Bottom ( m Bottom : ĠInt ) Ġ{ ĊĠĠĠ Ġthis . m Bottom Ġ= Ġm Bottom ĊĠ Ġ} ĊĊĠ Ġfun Ġset Text Left ( m Left : ĠInt ) Ġ{ ĊĠĠĠ Ġthis . m Left Ġ= Ġm Left ĊĠ Ġ} ĊĊĠ Ġfun Ġset Text Right ( m Right : ĠInt ) Ġ{ ĊĠĠĠ Ġthis . m Right Ġ= Ġm Right ĊĠ Ġ} ĊĊĠ Ġfun Ġset Font Path ( font Path : ĠString ) Ġ{ ĊĠĠĠ Ġm Font Path Ġ= Ġfont Path ĊĠĠĠ Ġif Ġ( TextUtils . isEmpty ( font Path )) Ġ{ ĊĠĠĠĠĠ Ġtype face Ġ= ĠType face . DEFAULT ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġif Ġ( File ( m Font Path ). exists ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġtype face Ġ= ĠType face . create FromFile ( font Path ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġget Font Path (): ĠString ? Ġ{ ĊĠĠĠ Ġreturn Ġm Font Path ĊĠ Ġ} ĊĊĠ Ġfun Ġrestore ( width : ĠInt , Ġheight : ĠInt ) Ġ{ ĊĠĠĠ Ġm Last Height Ġ= Ġheight ĊĠĠĠ Ġm Last Width Ġ= Ġwidth ĊĠ Ġ} ĊĊĠ Ġfun ĠsetCurrent Color ( m Current Color : ĠInt ) Ġ{ ĊĠĠĠ Ġthis . m Current Color Ġ= ĠmCurrent Color ĊĠĠĠ Ġset TextColor ( m Current Color ) ĊĠ Ġ} ĊĊĠ Ġfun Ġset Mirror ( is Mirror : ĠBoolean ) Ġ{ ĊĠĠĠ Ġthis . is Mirror Ġ= Ġis Mirror ĊĠĠĠ Ġval Ġangle Ġ= ĠMath . to Degrees ( m Text Angle . toDouble ()). toFloat () ĊĠĠĠ Ġrotation Ġ= Ġif Ġ( is Mirror ) Ġ- angle Ġelse Ġangle ĊĠĠĠ Ġrequest Layout () ĊĠ Ġ} ĊĊĠ Ġfun Ġset Text Angle ( m Text Angle : ĠFloat ) Ġ{ ĊĠĠĠ Ġthis . m Text Angle Ġ= Ġm Text Angle ĊĠĠĠ Ġrotation Ġ= ĠMath . to Degrees ( m Text Angle . toDouble ()). toFloat () ĊĠ Ġ} ĊĊĠ Ġfun ĠgetText Rotation (): ĠFloat Ġ{ ĊĠĠĠ Ġreturn Ġm Text Angle ĊĠ Ġ} ĊĊĠ Ġfun Ġset Text Stroke Color ( current Stroke Color : ĠInt ) Ġ{ ĊĠĠĠ ĠmCurrent Stroke Color Ġ= Ġcurrent Stroke Color ĊĠĠĠ Ġinvalidate () ĊĠ Ġ} ĊĊĠ Ġfun Ġget TextColor (): ĠInt Ġ{ ĊĠĠĠ Ġreturn ĠmCurrent Color ĊĠ Ġ} ĊĊĠ Ġfun ĠgetText Stroke Color (): ĠInt Ġ{ ĊĠĠĠ Ġreturn ĠmCurrent Stroke Color !! ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġset Text ( text : ĠCharSequence , Ġtype : ĠBuffer Type ?) Ġ{ ĊĠĠĠ Ġsuper . setText ( fil tr ate Text ( text ), Ġtype ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġcalculate Max Lines By Text ( text : ĠCharSequence ): ĠInt Ġ{ ĊĠĠĠ Ġif Ġ( TextUtils . isEmpty ( text )) Ġ{ ĊĠĠĠĠĠ Ġreturn Ġ 1 ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġsb Ġ= ĠStringBuilder ( text ) ĊĠĠĠ Ġvar Ġline Ġ= Ġsb . toString (). split ("\ n "). to Typed Array (). size ĊĠĠĠ Ġwhile Ġ( sb . isNotEmpty () Ġ&& Ġsb [ sb . length Ġ- Ġ 1 ] Ġ== Ġ'\ n ') Ġ{ ĊĠĠĠĠĠ Ġline ++ ĊĠĠĠĠĠ Ġsb . delete Char At ( sb . length Ġ- Ġ 1 ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġline ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġfil tr ate Text ( text : ĠCharSequence ): ĠCharSequence ? Ġ{ ĊĠĠĠ Ġif Ġ( TextUtils . isEmpty ( text )) Ġ{ ĊĠĠĠĠĠ Ġreturn Ġtext ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ(! is Text Only ) Ġ{ ĊĠĠĠĠĠ Ġval Ġresult Ġ= Ġcount ( text . toString ()) ĊĠĠĠĠĠ Ġif Ġ( result [ 0 ] Ġ> Ġ 1 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtext . sub Sequence ( 0 , Ġresult [ 1 ]) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġtext ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġis Chinese ( name : ĠString ): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġch Ġ= Ġname . toCharArray (); ĊĠĠĠ Ġch . forEach Ġ{ ĊĠĠĠĠĠ Ġval Ġub Ġ= ĠCharacter . Unicode Block . of ( it ) ĊĠĠĠĠĠ Ġreturn Ġub Ġ=== ĠCharacter . Unicode Block . C JK _ UN IFI ED _ IDE O GR AP HS ĊĠĠĠĠĠĠĠĠĠ Ġ|| Ġub Ġ=== ĠCharacter . Unicode Block . C JK _ COMPAT IBILITY _ IDE O GR AP HS ĊĠĠĠĠĠĠĠĠĠ Ġ|| Ġub Ġ=== ĠCharacter . Unicode Block . C JK _ UN IFI ED _ IDE O GR AP HS _ EXTENSION _ A ĊĠĠĠĠĠĠĠĠĠ Ġ|| Ġub Ġ=== ĠCharacter . Unicode Block . C JK _ UN IFI ED _ IDE O GR AP HS _ EXTENSION _ B ĊĠĠĠĠĠĠĠĠĠ Ġ|| Ġub Ġ=== ĠCharacter . Unicode Block . C JK _ SYMBOL S _ AND _ PUN CT UATION ĊĠĠĠĠĠĠĠĠĠ Ġ|| Ġub Ġ=== ĠCharacter . Unicode Block . HALF WIDTH _ AND _ FULL WIDTH _ FOR MS ĊĠĠĠĠĠĠĠĠĠ Ġ|| Ġub Ġ=== ĠCharacter . Unicode Block . GENERAL _ PUN CT UATION ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġfalse ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġcount ( text : ĠString ): ĠInt Array Ġ{ ĊĠĠĠ Ġval Ġlen Ġ= Ġtext . length ĊĠĠĠ Ġvar Ġskip : ĠInt ĊĠĠĠ Ġvar Ġletter Ġ= Ġ 0 ĊĠĠĠ Ġvar Ġch inese Ġ= Ġ 0 ĊĠĠĠ Ġvar Ġcount Ġ= Ġ 0 ĊĠĠĠ Ġvar Ġlimit Ġ= Ġ 0 ĊĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠ Ġwhile Ġ( i Ġ< Ġlen ) Ġ{ ĊĠĠĠĠĠ Ġval Ġcode Ġ= Ġtext . code Point At ( i ) ĊĠĠĠĠĠ Ġskip Ġ= ĠCharacter . char Count ( code ) ĊĠĠĠĠĠ Ġif Ġ( code Ġ== Ġ 1 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġi Ġ+= Ġskip ĊĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġval Ġs Ġ= Ġtext . substring ( i , Ġi Ġ+ Ġskip ) ĊĠĠĠĠĠ Ġif Ġ( is Chinese ( s )) Ġ{ ĊĠĠĠĠĠĠĠ Ġch inese ++ ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġletter ++ ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġcount Ġ= Ġ( if Ġ( letter Ġ% Ġ 2 Ġ== Ġ 0 ) Ġletter Ġ/ Ġ 2 Ġelse Ġletter Ġ/ Ġ 2 Ġ+ Ġ 1 ) Ġ+ Ġch inese ĊĠĠĠĠĠ Ġif Ġ( count Ġ== Ġ 1 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlimit Ġ= Ġi Ġ+ Ġ 1 ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġi Ġ+= Ġskip ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġresult Ġ= ĠInt Array ( 2 ) ĊĠĠĠ Ġresult [ 0 ] Ġ= Ġcount ĊĠĠĠ Ġresult [ 1 ] Ġ= Ġlimit ĊĠĠĠ Ġreturn Ġresult ĊĠ Ġ} ĊĊĠ Ġfun Ġget m Stroke Width (): ĠFloat Ġ{ ĊĠĠĠ Ġreturn Ġm Stroke Width ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun ĠgetMax Lines (): ĠInt Ġ{ ĊĠĠĠ Ġreturn Ġm Max Lines ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġset Max Lines ( max lines : ĠInt ) Ġ{ ĊĠĠĠ Ġsuper . setMax Lines ( max lines ) ĊĠĠĠ Ġm Max Lines Ġ= Ġmax lines ĊĠĠĠ Ġre Adjust () ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġset Single Line () Ġ{ ĊĠĠĠ Ġsuper . set Single Line () ĊĠĠĠ Ġm Max Lines Ġ= Ġ 1 ĊĠĠĠ Ġre Adjust () ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġset Single Line ( single Line : ĠBoolean ) Ġ{ ĊĠĠĠ Ġsuper . set Single Line ( single Line ) ĊĠĠĠ Ġif Ġ( single Line ) Ġ{ ĊĠĠĠĠĠ Ġm Max Lines Ġ= Ġ 1 ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġm Max Lines Ġ= ĠNO _ LINE _ LIMIT ĊĠĠĠ Ġ} ĊĠĠĠ Ġre Adjust () ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġset Lines ( lines : ĠInt ) Ġ{ ĊĠĠĠ Ġsuper . set Lines ( lines ) ĊĠĠĠ Ġm Max Lines Ġ= Ġlines ĊĠĠĠ Ġre Adjust () ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġset Line Spacing ( add : ĠFloat , Ġmult : ĠFloat ) Ġ{ ĊĠĠĠ Ġsuper . set Line Spacing ( add , Ġmult ) ĊĠĠĠ Ġm Spacing Mult Ġ= Ġmult ĊĠĠĠ Ġm Spacing Add Ġ= Ġadd ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠSet Ġthe Ġlower Ġtext Ġsize Ġlimit Ġand Ġinvalidate Ġthe Ġview ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ param Ġmin Text Size ĊĠĠ Ġ*/ ĊĠ Ġfun Ġset Min Text Size ( min Text Size : ĠFloat ) Ġ{ ĊĠĠĠ Ġm Min Text Size Ġ= Ġmin Text Size ĊĠĠĠ Ġre Adjust () ĊĠ Ġ} ĊĊĠ Ġfun Ġre Adjust () Ġ{ ĊĠĠĠ Ġadjust Text Size () ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġadjust Text Size () Ġ{ ĊĠĠĠ Ġif Ġ(! m Initialized ) Ġ{ ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( TextUtils . isEmpty ( text )) Ġ{ ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġstart Size Ġ= Ġm Min Text Size . toInt () ĊĠĠĠ Ġvar Ġmax Text Size Ġ= Ġ 0 f ĊĠĠĠ Ġmax Text Size Ġ= Ġif Ġ( is Edit Completed ) Ġ{ ĊĠĠĠĠĠ Ġm Max Text Size ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġval Ġbase Ġ= Ġtext Size ĊĠĠĠĠĠ Ġval Ġmin Limit Ġ= ĠTyped Value . apply Dimension ( Typed Value . COMPLEX _ UNIT _ SP , Ġ 1 0 f , Ġresources . display Metrics ) ĊĠĠĠĠĠ Ġmax ( base , Ġmin Limit ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġm Width Limit Ġ= Ġm Available Space Rect !!. right . toInt () ĊĠĠĠ Ġ// å¤ĦçĲĨ åģ ¶ çİ° è®¡ç®Ĺ è¡Į æķ° ä¸į åĩĨ ç¡® çļĦéĹ®é¢ĺ ĊĠĠĠ Ġm Width Limit Ġ= Ġif Ġ( m Width Limit Ġ< Ġ 1 ) Ġm Width Limit Ġelse Ġm Width Limit Ġ- Ġ 1 ĊĠĠĠ ĠLog . i (" m Width Limit ", Ġ" m Width Limit Ġ: Ġ$ m Width Limit ") ĊĠĠĠ Ġm Paint Ġ= ĠText Paint ( paint ) ĊĠĠĠ Ġsuper . setText Size ( ĊĠĠĠĠĠĠĠ ĠTyped Value . COMPLEX _ UNIT _ PX , ĊĠĠĠĠĠĠĠ Ġefficient Text Size Search ( start Size , Ġmax Text Size . toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Size Tester , Ġm Available Space Rect !! ). toFloat ()) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġefficient Text Size Search ( start : ĠInt , Ġend : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize Tester : ĠSize Tester , Ġavailable Space : ĠRect F ): ĠInt Ġ{ ĊĠĠĠ Ġvar Ġtext Ġ= Ġtext . toString () ĊĠĠĠ Ġif Ġ( is Text Only ) Ġ{ ĊĠĠĠĠĠ Ġ// æ·»åĬł 1 0 ä¸ª åŃĹ æį¢ è¡Į ĊĠĠĠĠĠ Ġtext Ġ= ĠText Dialog . line Feed Text ( getText (). toString ()) Ġ?: Ġ"" ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġbinary Search ( start , Ġend , Ġtext , Ġsize Tester , Ġavailable Space ) ĊĠ Ġ} ĊĊĠ Ġprotected Ġfun Ġis Need Self Measure (): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġ! is Edit Completed ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Measure ( width Measure Spec : ĠInt , Ġheight Measure Spec : ĠInt ) Ġ{ ĊĠĠĠ Ġval Ġw : ĠInt ĊĠĠĠ Ġval Ġh : ĠInt ĊĠĠĠ Ġif Ġ( is Need Self Measure ()) Ġ{ ĊĠĠĠĠĠ Ġsuper . on Measure ( ViewGroup . LayoutParams . WRAP _ CONTENT , ĊĠĠĠĠĠĠĠĠĠ ĠViewGroup . LayoutParams . WRAP _ CONTENT ) ĊĠĠĠĠĠ Ġw Ġ= Ġmeasured Width ĊĠĠĠĠĠ Ġh Ġ= Ġmeasured Height ĊĠĠĠĠĠ Ġset Measured Dimension ( w Ġ+ Ġ 3 0 , Ġh Ġ+ Ġ 3 0 ) ĊĠĠĠĠĠ Ġif Ġ( w Ġ!= Ġm Max Width When Out of Ġ|| Ġh Ġ!= Ġm Max Height When Out of ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġw Ġ= ĠMeasure Spec . getSize ( width Measure Spec ) ĊĠĠĠĠĠ Ġh Ġ= ĠMeasure Spec . getSize ( height Measure Spec ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( m Last Height Ġ== Ġ 0 Ġ|| Ġm Last Width Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠ Ġm Last Height Ġ= Ġh ĊĠĠĠĠĠ Ġm Last Width Ġ= Ġw ĊĠĠĠ Ġ} ĊĠĠĠ Ġset Measured Dimension ( w , Ġh ) ĊĠĠĠ Ġmeasure Self ( w , Ġh ) ĊĠ Ġ} ĊĊĠ Ġprotected Ġfun Ġmeasure Self ( width : ĠInt , Ġheight : ĠInt ) Ġ{ ĊĠĠĠ Ġif Ġ( width Ġ== Ġ 0 Ġ|| Ġheight Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĠĠĠ Ġvar Ġw : ĠInt ĊĠĠĠ Ġvar Ġh : ĠInt ĊĠĠĠ Ġvar Ġtop Ġ= Ġ 0 ĊĠĠĠ Ġvar Ġleft Ġ= Ġ 0 ĊĠĠĠ Ġvar Ġright Ġ= Ġ 0 ĊĠĠĠ Ġvar Ġbottom Ġ= Ġ 0 ĊĠĠĠ Ġval Ġro tx : ĠFloat ĊĠĠĠ Ġval Ġro ty : ĠFloat ĊĠĠĠ Ġif Ġ( m Last Height Ġ== Ġ 0 Ġ|| Ġm Last Width Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠ Ġro tx Ġ= Ġ 1 f ĊĠĠĠĠĠ Ġro ty Ġ= Ġ 1 f ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġro tx Ġ= Ġwidth . toFloat () Ġ/ Ġm Last Width . toFloat () ĊĠĠĠĠĠ Ġro ty Ġ= Ġheight . toFloat () Ġ/ Ġm Last Height . toFloat () ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( m Width Ġ== Ġ 0 Ġ|| Ġm Height Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠ Ġm Width Ġ= Ġm Last Width ĊĠĠĠĠĠ Ġm Height Ġ= Ġm Last Height ĊĠĠĠ Ġ} ĊĠĠĠ Ġw Ġ= Ġ( m Width Ġ* Ġro tx ). toInt () ĊĠĠĠ Ġh Ġ= Ġ( m Height Ġ* Ġro ty ). toInt () ĊĠĠĠ Ġleft Ġ= Ġ( m Left Ġ* Ġro tx ). toInt () ĊĠĠĠ Ġtop Ġ= Ġ( m Top Ġ* Ġro ty ). toInt () ĊĠĠĠ Ġright Ġ= Ġ( m Right Ġ* Ġro tx ). toInt () ĊĠĠĠ Ġbottom Ġ= Ġ( m Bottom Ġ* Ġro ty ). toInt () ĊĠĠĠ Ġif Ġ( is Mirror ) Ġ{ ĊĠĠĠĠĠ Ġval Ġtemp Ġ= Ġleft ĊĠĠĠĠĠ Ġleft Ġ= Ġright ĊĠĠĠĠĠ Ġright Ġ= Ġtemp ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( w Ġ== Ġ 0 Ġ|| Ġh Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠ Ġw Ġ= Ġwidth ĊĠĠĠĠĠ Ġh Ġ= Ġheight ĊĠĠĠ Ġ} ĊĠĠĠ Ġm Available Space Rect !!. right Ġ= Ġw . toFloat () ĊĠĠĠ Ġm Available Space Rect !!. bottom Ġ= Ġh . toFloat () ĊĠĠĠ Ġadjust Text Size () ĊĠĠĠ Ġset Padding ( left , Ġtop , Ġright , Ġbottom ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Draw ( canvas : ĠCanvas ?) Ġ{ ĊĠĠĠ Ġif Ġ( m Scale By Drawable ) Ġ{ ĊĠĠĠĠĠ Ġval Ġalpha Ġ= Ġpaint . alpha ĊĠĠĠĠĠ Ġpaint . alpha Ġ= Ġ 0 ĊĠĠĠĠĠ Ġsuper . on Draw ( canvas ) ĊĠĠĠĠĠ Ġpaint . alpha Ġ= Ġalpha ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĠĠĠ Ġfreeze () ĊĠĠĠ Ġval Ġrestore Color Ġ= Ġthis . current TextColor ĊĠĠĠ Ġset Shadow Layer ( 0 f , Ġ 0 f , Ġ 0 f , Ġ 0 ) ĊĠĠĠ Ġif Ġ( m Current Stroke Color Ġ!= Ġnull Ġ&& ĠmCurrent Stroke Color Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠ Ġval Ġpaint Ġ= Ġthis . paint ĊĠĠĠĠĠ Ġpaint . style Ġ= ĠPaint . Style . ST RO KE ĊĠĠĠĠĠ Ġpaint . stroke Join Ġ= Ġm Stroke Join ĊĠĠĠĠĠ Ġpaint . stroke M iter Ġ= Ġm Stroke M iter ĊĠĠĠĠĠ Ġthis . setTextColor ( m Current Stroke Color Ġ?: ĠColor . WHITE ) ĊĠĠĠĠĠ Ġm Stroke Width Ġ= Ġgenerate Stroke Width () ĊĠĠĠĠĠ Ġpaint . stroke Width Ġ= Ġm Stroke Width ĊĠĠĠĠĠ Ġsuper . on Draw ( canvas ) ĊĠĠĠĠĠ Ġpaint . style Ġ= ĠPaint . Style . FILL ĊĠĠĠ Ġ} ĊĠĠĠ Ġthis . setTextColor ( restore Color ) ĊĠĠĠ Ġun freeze () ĊĠĠĠ Ġsuper . on Draw ( canvas ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġgenerate Stroke Width (): ĠFloat Ġ{ ĊĠĠĠ Ġval Ġvalue Ġ= Ġtext Size ĊĠĠĠ Ġvar Ġsize Ġ= Ġpx 2 sp ( context , Ġvalue ) ĊĠĠĠ Ġval ĠstrokeWidth Ġ= ĠTyped Value . apply Dimension ( Typed Value . COMPLEX _ UNIT _ DIP , Ġ 1 f , Ġresources . display Metrics ) ĊĠĠĠ Ġreturn Ġif Ġ( size Ġ<= Ġ 2 7 ) Ġ{ ĊĠĠĠĠĠ ĠstrokeWidth ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġsize Ġ-= Ġ 2 7 ĊĠĠĠĠĠ Ġvar Ġwidth Ġ= ĠstrokeWidth Ġ* Ġ( size . toFloat () Ġ/ Ġ 1 5 f Ġ+ Ġ 1 ) ĊĠĠĠĠĠ Ġif Ġ( VERSION . SDK _ INT Ġ== ĠVERSION _ CODES . KIT K AT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( value Ġ> Ġ 2 5 6 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġwidth Ġ/= Ġ 5 f ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġwidth ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* Ġå°Ĩ px åĢ¼ è½¬æį¢ ä¸º sp åĢ¼ ï¼Į ä¿Ŀè¯ģ æĸĩåŃĹ å¤§å°ı ä¸į åıĺ ĊĠĠ Ġ*/ ĊĠ Ġfun Ġpx 2 sp ( context : ĠContext , Ġpx Value : ĠFloat ): ĠInt Ġ{ ĊĠĠĠ Ġval Ġfont Scale Ġ= Ġcontext . resources . display Metrics . scaled Density ĊĠĠĠ Ġreturn Ġ( px Value Ġ/ Ġfont Scale Ġ+ Ġ 0 . 5 f ). toInt () ĊĠ Ġ} ĊĊĠ Ġ// ĠKeep Ġthese Ġthings Ġlocked Ġwhile Ġon Draw Ġin Ġprocessing ĊĠ Ġfun Ġfreeze () Ġ{ ĊĠĠĠ Ġm Frozen Ġ= Ġtrue ĊĠ Ġ} ĊĊĠ Ġfun Ġun freeze () Ġ{ ĊĠĠĠ Ġm Frozen Ġ= Ġfalse ĊĠ Ġ} ĊĊĊĠ Ġoverride Ġfun Ġrequest Layout () Ġ{ ĊĠĠĠ Ġif Ġ(! mF rozen ) Ġ{ ĊĠĠĠĠĠ Ġsuper . request Layout () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġpost Invalidate () Ġ{ ĊĠĠĠ Ġif Ġ(! mF rozen ) Ġ{ ĊĠĠĠĠĠ Ġsuper . post Invalidate () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġpost Invalidate ( left : ĠInt , Ġtop : ĠInt , Ġright : ĠInt , Ġbottom : ĠInt ) Ġ{ ĊĠĠĠ Ġif Ġ(! mF rozen ) Ġ{ ĊĠĠĠĠĠ Ġsuper . post Invalidate ( left , Ġtop , Ġright , Ġbottom ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġinvalidate () Ġ{ ĊĠĠĠ Ġif Ġ(! mF rozen ) Ġ{ ĊĠĠĠĠĠ Ġsuper . invalidate () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġinvalidate ( rect : ĠRect ?) Ġ{ ĊĠĠĠ Ġif Ġ(! mF rozen ) Ġ{ ĊĠĠĠĠĠ Ġsuper . invalidate ( rect ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġinvalidate ( l : ĠInt , Ġt : ĠInt , Ġr : ĠInt , Ġb : ĠInt ) Ġ{ ĊĠĠĠ Ġif Ġ(! mF rozen ) Ġ{ ĊĠĠĠĠĠ Ġsuper . invalidate ( l , Ġt , Ġr , Ġb ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* Ġ è¯¥ æĸ¹æ³ķ ä¼ļ åľ¨ éĿŀ UI çº¿ç¨ĭ è¢« è°ĥçĶ¨ ï¼Į åĽłæŃ¤ ä¸įèĥ½ æī§è¡Į UI æĽ´æĸ° æĵįä½ľ ĊĠĠ Ġ* Ġ@ param Ġbmp Width ĊĠĠ Ġ* Ġ@ param Ġbmp Height ĊĠĠ Ġ* Ġ@ return ĊĠĠ Ġ*/ ĊĠ Ġfun Ġgenerate Bitmap ( bmp Width : ĠInt , Ġbmp Height : ĠInt ): ĠBitmap ? Ġ{ ĊĠĠĠ Ġif Ġ( m Bitmap Generator Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġm Text Bitmap Ġ= ĠText Bitmap () ĊĠĠĠĠĠ Ġm Bitmap Generator Ġ= ĠText Bitmap Generator () ĊĠĠĠ Ġ} ĊĠĠĠ Ġm Text Bitmap ?. m Text Ġ= Ġtext . toString () ĊĠĠĠ Ġm Text Bitmap ?. m Font Path Ġ= Ġm Font Path !! ĊĠĠĠ Ġm Text Bitmap ?. mB mp Width Ġ= Ġbmp Width ĊĠĠĠ Ġm Text Bitmap ?. mB mp Height Ġ= Ġbmp Height ĊĠĠĠ Ġm Text Bitmap ?. m Text Width Ġ= Ġbmp Width ĊĠĠĠ Ġm Text Bitmap ?. m Text Height Ġ= Ġbmp Height ĊĠĠĠ Ġm Text Bitmap ?. m TextColor Ġ= ĠmCurrent Color ĊĠĠĠ Ġm Text Bitmap ?. m Text Stroke Color Ġ= ĠmCurrent Stroke Color !! ĊĠĠĠ Ġm Text Bitmap ?. m Text Alignment Ġ= ĠLayout . Alignment . ALIGN _ CENTER ĊĠĠĠ Ġm Bitmap Generator ?. update Text Bitmap ( m Text Bitmap ) ĊĠĠĠ Ġreturn Ġm Bitmap Generator ?. generate Bitmap ( bmp Width , Ġbmp Height ) ĊĠ Ġ} ĊĊĠ Ġfun ĠgetText Width (): ĠInt Ġ{ ĊĠĠĠ Ġvar Ġlayout Ġ= Ġlayout ĊĠĠĠ Ġif Ġ( layout Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġmeasure Self ( m Width , Ġm Height ) ĊĠĠĠĠĠ Ġval Ġw Ġ= Ġm Width Ġ+ Ġpadding Left Ġ+ Ġpadding Right ĊĠĠĠĠĠ Ġval Ġh Ġ= Ġm Height Ġ+ Ġpadding Top Ġ+ Ġpadding Bottom ĊĠĠĠĠĠ Ġsuper . measure ( Measure Spec . make Measure Spec ( w , ĠMeasure Spec . EX ACT LY ), ĊĠĠĠĠĠĠĠĠĠ ĠMeasure Spec . make Measure Spec ( h , ĠMeasure Spec . EX ACT LY )) ĊĠĠĠĠĠ Ġlayout Ġ= Ġget Layout () ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( layout Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġlayout Ġ= Ġm Layout ĊĠĠĠĠĠ Ġif Ġ( layout Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ 0 ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġlayout . width ĊĠ Ġ} ĊĊĠ Ġfun ĠgetText Height (): ĠInt Ġ{ ĊĠĠĠ Ġvar Ġlayout Ġ= Ġlayout ĊĠĠĠ Ġif Ġ( layout Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġmeasure Self ( m Width , Ġm Height ) ĊĠĠĠĠĠ Ġval Ġw Ġ= Ġm Width Ġ+ Ġpadding Left Ġ+ Ġpadding Right ĊĠĠĠĠĠ Ġval Ġh Ġ= Ġm Height Ġ+ Ġpadding Top Ġ+ Ġpadding Bottom ĊĠĠĠĠĠ Ġsuper . measure ( Measure Spec . make Measure Spec ( w , ĠMeasure Spec . EX ACT LY ), ĊĠĠĠĠĠĠĠĠĠ ĠMeasure Spec . make Measure Spec ( h , ĠMeasure Spec . EX ACT LY )) ĊĠĠĠĠĠ Ġlayout Ġ= Ġget Layout () ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( layout Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġlayout Ġ= Ġm Layout ĊĠĠĠĠĠ Ġif Ġ( layout Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ 0 ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġlayout . height ĊĠ Ġ} ĊĊĠ Ġprivate Ġinterface ĠSize Tester Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ param Ġsuggested Size Ġ ĠSize Ġof Ġtext Ġto Ġbe Ġtested ĊĠĠĠĠ Ġ* Ġ@ param Ġavailable Space Ġavailable Ġspace Ġin Ġwhich Ġtext Ġmust Ġfit ĊĠĠĠĠ Ġ* Ġ@ return Ġan Ġinteger Ġ< Ġ 0 Ġif Ġafter Ġapplying Ġ` suggest ed Size ` Ġto ĊĠĠĠĠ Ġ* Ġtext , Ġit Ġtakes Ġless Ġspace Ġthan Ġ` available Space `, Ġ> Ġ 0 ĊĠĠĠĠ Ġ* Ġotherwise ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġon Test Size ( suggest ed Size : ĠInt , Ġavailable Space : ĠRect F ?, Ġtext : ĠString ?): ĠInt ĊĠ Ġ} Ċ }