package Ġcom . b ore al . common utils . component . round able layout Ċ Ċ import Ġandroid . annotation . Target Api Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics .* Ċ import Ġandroid . graphics . drawable . Gradient Drawable Ċ import Ġandroid . os . Build Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . view . View Ċ import Ġandroid . view . View Outline Provider Ċ import Ġandroidx . annotation . Color Int Ċ import Ġandroidx . constraint layout . widget . Constraint Layout Ċ import Ġcom . b ore al . common utils . R Ċ Ċ class ĠCUR ound able Layout Ġ: ĠConstraint Layout Ġ{ ĊĊĠĠĠ Ġvar Ġpath : ĠPath ? Ġ= Ġnull ĊĊĠĠĠ Ġ/** Ġcorner Ġradius Ġ*/ ĊĠĠĠ Ġvar Ġcorner Left Top : ĠFloat Ġ= Ġ 0 F ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost Invalidate () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġcorner Right Top : ĠFloat Ġ= Ġ 0 F ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost Invalidate () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġcorner Left Bottom : ĠFloat Ġ= Ġ 0 F ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost Invalidate () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġcorner Right Bottom : ĠFloat Ġ= Ġ 0 F ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost Invalidate () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** Ġside Ġoption Ġmeans Ġtop Ġand Ġbottom Ġcorner Ġ*/ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġif Ġleft Ġside Ġvalue Ġexisted , ĊĠĠĠĠ Ġ* Ġleft Top Ġand Ġleft Bottom Ġvalue Ġis Ġequal Ġto Ġleft Side Ġvalue . ĊĠĠĠĠ Ġ* Ġthis Ġis Ġmade Ġin Ġconsideration Ġof Ġthe Ġcu Â © st om Ġattribute Ġof Ġmotion Ġlayout . ĊĠĠĠĠ Ġ* Ġbecause ĠConstraint Ġonly Ġhas Ġmaximum Ġtwo Ġcustom Ġattribute . Ġ( 2 . 0 . 0 - beta 2 ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġcorner Left Side : ĠFloat Ġ= Ġ 0 F ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( field Ġ!= Ġ 0 F ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcorner Left Top Ġ= Ġfield ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcorner Left Bottom Ġ= Ġfield ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost Invalidate () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġcorner Right Side : ĠFloat Ġ= Ġ 0 F ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( field Ġ!= Ġ 0 F ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcorner Right Top Ġ= Ġfield ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcorner Right Bottom Ġ= Ġfield ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost Invalidate () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** Ġbackground Ġcolor Ġ*/ ĊĠĠĠ Ġvar ĠbackgroundColor : ĠInt ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġset (@ Color Int Ġvalue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost Invalidate () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset BackgroundColor ( color : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ ĠbackgroundColor Ġ= Ġcolor ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** Ġstroke Ġ& Ġdash Ġoptions Ġ*/ ĊĠĠĠ Ġvar Ġstroke LineWidth : ĠFloat Ġ= Ġ 0 F ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost Invalidate () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġstroke Line Color Ġ= Ġ 0 X FFFFFFFF . toInt () ĊĠĠĠĠĠĠĠ Ġset (@ Color Int Ġvalue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost Invalidate () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġdash Line Gap : ĠFloat Ġ= Ġ 0 F ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost Invalidate () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġdash LineWidth : ĠFloat Ġ= Ġ 0 F ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost Invalidate () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( context : ĠContext , Ġattrs : ĠAttributeSet , Ġdef Style Attr : ĠInt ) Ġ: Ġsuper ( ĊĠĠĠĠĠĠĠ Ġcontext , ĊĠĠĠĠĠĠĠ Ġattrs , ĊĠĠĠĠĠĠĠ Ġdef Style Attr ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrender ( attrs ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( context : ĠContext , Ġattrs : ĠAttributeSet ) Ġ: Ġsuper ( context , Ġattrs ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrender ( attrs ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( context : ĠContext ) Ġ: Ġsuper ( context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrender ( null ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrender ( attrs : ĠAttributeSet ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġattrs ?. let Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/** Ġset Ġcorner Ġrad ii Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . obtain Styled Attributes ( it , ĠR . style able . CUR ound able Layout ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcorner Left Top Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Dimension Pixel Size ( R . style able . CUR ound able Layout _ cu _ corner Left Top , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcorner Right Top Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Dimension Pixel Size ( R . style able . CUR ound able Layout _ cu _ corner Right Top , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcorner Left Bottom Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Dimension Pixel Size ( R . style able . CUR ound able Layout _ cu _ corner Left Bottom , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcorner Right Bottom Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Dimension Pixel Size ( R . style able . CUR ound able Layout _ cu _ corner Right Bottom , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠbackgroundColor Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Color ( R . style able . CUR ound able Layout _ cu _ backgroundColor , ĠColor . WHITE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstroke LineWidth Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Dimension Pixel Size ( R . style able . CUR ound able Layout _ cu _ stroke LineWidth , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstroke Line Color Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Color ( R . style able . CUR ound able Layout _ cu _ stroke Line Color , ĠColor . BLACK ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdash LineWidth Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Dimension Pixel Size ( R . style able . CUR ound able Layout _ cu _ dash LineWidth , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdash Line Gap Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Dimension Pixel Size ( R . style able . CUR ound able Layout _ cu _ dash Line Gap , Ġ 0 ). toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcorner Left Side Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Dimension Pixel Size ( R . style able . CUR ound able Layout _ cu _ corner Left Side , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcorner Right Side Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Dimension Pixel Size ( R . style able . CUR ound able Layout _ cu _ corner Right Side , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( get Dimension Pixel Size ( R . style able . CUR ound able Layout _ cu _ corner All , Ġ 0 ) Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrounded Size Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Dimension Pixel Size ( R . style able . CUR ound able Layout _ cu _ corner All , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcorner Right Side Ġ= Ġrounded Size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcorner Left Side Ġ= Ġrounded Size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . recycle () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdispatch Draw ( canvas : ĠCanvas ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** Ġfor Ġoutline Ġre make Ġwhen en ver Ġdraw Ġ*/ ĊĠĠĠĠĠĠĠ Ġpath Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġif Ġ( path Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpath Ġ= ĠPath () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfloat ArrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcorner Left Top , Ġcorner Left Top , Ġcorner Right Top , Ġcorner Right Top , Ġcorner Right Bottom , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcorner Right Bottom , Ġcorner Left Bottom , Ġcorner Left Bottom ĊĠĠĠĠĠĠĠ Ġ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclip Path Canvas ( canvas , Ġthis ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** Ġset Ġdrawable Ġresource Ġcorner Ġ& Ġbackground Ġ& Ġstroke Ġ*/ ĊĠĠĠĠĠĠĠ ĠGradient Drawable (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . corner Rad ii Ġ= Ġfloat ArrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcorner Left Top , Ġcorner Left Top , Ġcorner Right Top , Ġcorner Right Top , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcorner Right Bottom , Ġcorner Right Bottom , Ġcorner Left Bottom , Ġcorner Left Bottom ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( stroke LineWidth Ġ!= Ġ 0 F Ġ&& Ġstroke Line Color Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . set Stroke ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstroke LineWidth . toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstroke Line Color !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdash LineWidth , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdash Line Gap ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠbackgroundColor ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** Ġset Ġbackground Ġcolor Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . setColor ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġthis . setColor ( Color . WHITE ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/** Ġset Ġbackground Ġcolor Ġdefault Ġ: ĠWH ITE Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbackground Ġ= Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġoutline Provider Ġ= Ġget Outline Provider () ĊĊĠĠĠĠĠĠĠ Ġclip Children Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġsuper . dispatch Draw ( canvas ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġclip Path Canvas ( canvas : ĠCanvas , Ġfloat Array : ĠFloat Array ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpath ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . add Round Rect ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRect F ( 0 F , Ġ 0 F , Ġcanvas . width . toFloat (), Ġcanvas . height . toFloat ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfloat Array , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPath . Direction . CW ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . clip Path ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠFor Ġnot Ġshowing Ġred Ġunderline Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġset Outline Provider ( provider : ĠView Outline Provider ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . set Outline Provider ( provider ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠFor Ġnot Ġshowing Ġred Ġunderline Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġset Elevation ( elevation : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . set Elevation ( elevation ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠFor Ġnot Ġshowing Ġred Ġunderline Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġset Translation Z ( translation Z : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . set Translation Z ( translation Z ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Target Api ( Build . VERSION _ CODES . LO L LI POP ) ĊĠĠĠ Ġoverride Ġfun Ġget Outline Provider (): ĠView Outline Provider Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠView Outline Provider () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Outline ( view : ĠView , Ġoutline : ĠOut line ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutline . set Convex Path ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġthrow ĠException () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊ Ċ }