package Ġcom . tak use mb a . crop me Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . graphics . PointF Ċ import Ġandroid . graphics . Rect Ċ import Ġandroid . graphics . Rect F Ċ import Ġandroid . graphics . drawable . Bitmap Drawable Ċ import Ġandroid . net . Uri Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . view . Gravity Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . view . View Tree Observer Ċ import Ġandroid . widget . Frame Layout Ċ import Ġandroid . widget . ImageView Ċ import Ġcom . bump tech . glide . G lide Ċ import Ġio . reactivex . dis pos ables . Composite Disposable Ċ import Ġio . reactivex . rx kotlin . addTo Ċ import Ġio . reactivex . subjects . Publish Subject Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ /** Ċ Ġ* ĠC rop View Ċ Ġ* Ċ Ġ* Ġ@ author Ġtak use mb a Ċ Ġ* Ġ@ since Ġ 0 5 / 0 9 / 2 0 1 7 Ċ Ġ*/ Ċ class ĠC rop View Ġ@ Jvm Over loads Ġconstructor ( context : ĠContext , Ġattrs : ĠAttributeSet ? Ġ= Ġnull , Ġdef Style Attr : ĠInt Ġ= Ġ 0 ) Ġ: ĠFrame Layout ( context , Ġattrs , Ġdef Style Attr ), ĠC ro pp able Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġhorizontal Animator : ĠMove Animator ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġvertical Animator : ĠMove Animator ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġscale Animator : ĠScale Animator ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġaction Detector : ĠAction Detector ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval Ġpercent Width : ĠFloat ĊĠĠĠ Ġprivate Ġval Ġpercent Height : ĠFloat ĊĠĠĠ Ġprivate Ġval Ġmax Scale : ĠInt ĊĠĠĠ Ġprivate Ġvar Ġrestriction : ĠRect F ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġbackground Alpha : ĠInt ĊĠĠĠ Ġprivate Ġval Ġwith Border : ĠBoolean ĊĊĠĠĠ Ġprivate Ġvar Ġuri : ĠUri ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġscale : ĠScale XY ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġpoint : ĠPoint F ? Ġ= Ġnull ĊĊĠĠĠ Ġvar Ġon Crop ChangeListener : ĠOn Crop ChangeListener ? Ġ= Ġnull ĊĊĠĠĠ Ġvar Ġcrop Change Subject : ĠPublish Subject < Pair < Uri , ĠC rop Info >> Ġ= ĠPublish Subject . create () ĊĠĠĠ Ġvar Ġdis posable : ĠComposite Disposable Ġ= ĠComposite Disposable () ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġa Ġ= ĠgetContext (). obtain Styled Attributes ( attrs , ĠR . style able . Crop View ) ĊĊĠĠĠĠĠĠĠ Ġpercent Width Ġ= Ġa . get Fraction ( R . style able . Crop View _ crop me _ result _ width , ĠDEFAULT _ BASE , ĠDEFAULT _ P BASE , ĠDEFAULT _ PERCENT _ WIDTH ) ĊĠĠĠĠĠĠĠ Ġif Ġ( percent Width Ġ< ĠMIN _ PERCENT Ġ|| ĠMAX _ PERCENT Ġ< Ġpercent Width ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" sr _ result _ width Ġmust Ġbe Ġset Ġfrom Ġ 0 % Ġto Ġ 1 0 0 % ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġpercent Height Ġ= Ġa . get Fraction ( R . style able . Crop View _ crop me _ result _ height , ĠDEFAULT _ BASE , ĠDEFAULT _ P BASE , ĠDEFAULT _ PERCENT _ HEIGHT ) ĊĠĠĠĠĠĠĠ Ġif Ġ( percent Height Ġ< ĠMIN _ PERCENT Ġ|| ĠMAX _ PERCENT Ġ< Ġpercent Height ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" sr _ result _ height Ġmust Ġbe Ġset Ġfrom Ġ 0 % Ġto Ġ 1 0 0 % ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġmax Scale Ġ= Ġa . getInt ( R . style able . Crop View _ crop me _ max _ scale , ĠDEFAULT _ MAX _ SCALE ) ĊĠĠĠĠĠĠĠ Ġif Ġ( max Scale Ġ< ĠMIN _ SCALE Ġ|| ĠMAX _ SCALE Ġ< Ġmax Scale ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" sr _ max _ scale Ġmust Ġbe Ġset Ġfrom Ġ 1 Ġto Ġ 5 ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbackground Alpha Ġ= Ġ( a . get Fraction ( R . style able . Crop View _ crop me _ background _ alpha , ĠDEFAULT _ BASE , ĠDEFAULT _ P BASE , ĠDEFAULT _ BACKGROUND _ ALPHA ) Ġ* ĠCOLOR _ D ENS ITY ). toInt () ĊĠĠĠĠĠĠĠ Ġif Ġ( percent Width Ġ< ĠMIN _ PERCENT Ġ|| ĠMAX _ PERCENT Ġ< Ġpercent Width ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" sr _ background _ alpha Ġmust Ġbe Ġset Ġfrom Ġ 0 % Ġto Ġ 1 0 0 % ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwith Border Ġ= Ġa . getBoolean ( R . style able . Crop View _ crop me _ with _ border , ĠDEFAULT _ WITH _ BORDER ) ĊĊĠĠĠĠĠĠĠ Ġa . recycle () ĊĊĠĠĠĠĠĠĠ Ġinit () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Detached From Window () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Detached From Window () ĊĠĠĠĠĠĠĠ Ġdis posable . dispose () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġstart Action Detector () ĊĠĠĠĠĠĠĠ Ġadd Layouts () ĊĊĠĠĠĠĠĠĠ Ġcrop Change Subject . throttle Last ( 1 0 0 , ĠTimeUnit . MILLISECONDS ). subscribe Ġ{ Ġpair Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Crop ChangeListener ?. on Crop Change ( pair . first , Ġpair . second ) ĊĠĠĠĠĠĠĠ Ġ}. addTo ( dis posable ) ĊĊĠĠĠĠĠĠĠ Ġview Tree Observer . add On Pre Draw Listener ( object Ġ: ĠView Tree Observer . On Pre Draw Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Pre Draw (): ĠBoolean Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget Ġ= ĠfindViewById < Crop ImageView >( R . id . crop me _ image _ view ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoverlay View Ġ= ĠfindViewById < Crop Overlay View >( R . id . crop me _ overlay ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Width Ġ= Ġwidth Ġ* Ġpercent Width ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Height Ġ= Ġheight Ġ* Ġpercent Height ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrestriction Ġ= ĠRect F (( width Ġ- Ġresult Width ) Ġ/ Ġ 2 f , Ġ( height Ġ- Ġresult Height ) Ġ/ Ġ 2 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( width Ġ+ Ġresult Width ) Ġ/ Ġ 2 f , Ġ( height Ġ+ Ġresult Height ) Ġ/ Ġ 2 f ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhorizontal Animator Ġ= ĠHorizontal Move Animator Impl ( target , Ġrestriction , Ġmax Scale ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvertical Animator Ġ= ĠVertical Move Animator Impl ( target , Ġrestriction , Ġmax Scale ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscale Animator Ġ= ĠScale Animator Impl ( target , Ġmax Scale ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget . set Result Rect ( restriction ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverlay View . set Attrs ( restriction , Ġbackground Alpha , Ġwith Border ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Tree Observer . remove On Pre Draw Listener ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġval Ġtarget Ġ= ĠfindViewById < Crop ImageView >( R . id . crop me _ image _ view ) ĊĠĠĠĠĠĠĠ Ġview Tree Observer . add On Draw Listener Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget Rect Ġ= ĠRect () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtarget . get Hit Rect ( target Rect ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Crop Info () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Action Detector () Ġ{ ĊĠĠĠĠĠĠĠ Ġaction Detector Ġ= ĠAction Detector ( context , Ġobject Ġ: ĠActionListener Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Scaled ( scale : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Crop View . scale Ġ= Ġscale Animator !!. scale ( scale ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Scale Ended () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Crop View . scale Ġ= Ġscale Animator !!. re Scale IfNeeded () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Crop Info () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Moved ( dx : ĠFloat , Ġdy : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġhorizontal Animator !!. move ( dx ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġvertical Animator !!. move ( dy ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Crop View . point Ġ= ĠPoint F ( x , Ġy ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Fl ing ed ( velocity X : ĠFloat , Ġvelocity Y : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhorizontal Animator !!. fl ing ( velocity X ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvertical Animator !!. fl ing ( velocity Y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Move Ended () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( horizontal Animator !!. isNot Fl ing ing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġhorizontal Animator !!. re Move IfNeeded ( 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Crop View . point Ġ= ĠPoint F ( x , Ġthis @ Crop View . point ?. y Ġ?: Ġ 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( vertical Animator !!. isNot Fl ing ing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġvertical Animator !!. re Move IfNeeded ( 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Crop View . point Ġ= ĠPoint F ( this @ Crop View . point ?. x Ġ?: Ġ 0 f , Ġy ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Crop Info () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġset On Touch Listener Ġ{ Ġv , Ġevent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction Detector !!. detect Action ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Crop Info (){ ĊĠĠĠĠĠĠĠ Ġuri ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcrop Change Subject . onNext ( Pair ( it , Ġthis @ Crop View . crop Info ())) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcrop Info (): ĠC rop Info Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtarget Ġ= ĠfindViewById < Crop ImageView >( R . id . crop me _ image _ view ) ĊĠĠĠĠĠĠĠ Ġval Ġtarget Rect Ġ= ĠRect () ĊĠĠĠĠĠĠĠ Ġtarget . get Hit Rect ( target Rect ) ĊĊĠĠĠĠĠĠĠ Ġval Ġscale Ġ= Ġif Ġ( this @ Crop View . scale Ġ== Ġnull ) ĠScale XY ( 1 . 0 f , Ġ 1 . 0 f ) Ġelse ĠScale XY ( this @ Crop View . scale !!. x , Ġthis @ Crop View . scale !!. y ) ĊĠĠĠĠĠĠĠ Ġval Ġpoint Ġ= Ġif Ġ( this @ Crop View . point Ġ== Ġnull ) Ġnull Ġelse ĠPoint F ( this @ Crop View . point !!. x , Ġthis @ Crop View . point !!. y ) ĊĠĠĠĠĠĠĠ Ġreturn ĠC rop Info ( scale , Ġpoint , Ġtarget Rect , Ġrestriction ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd Layouts () Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠimageView Ġ= ĠC rop ImageView ( context ) ĊĠĠĠĠĠĠĠ ĠimageView . id Ġ= ĠR . id . crop me _ image _ view ĊĠĠĠĠĠĠĠ Ġval Ġimage Params Ġ= ĠFrame Layout . LayoutParams ( ViewGroup . LayoutParams . WRAP _ CONTENT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠViewGroup . LayoutParams . WRAP _ CONTENT , ĠGr avity . CENTER ) ĊĠĠĠĠĠĠĠ ĠimageView . scale Type Ġ= ĠImageView . Scale Type . FIT _ XY ĊĠĠĠĠĠĠĠ ĠimageView . adjust View Bounds Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġadd View ( imageView , Ġimage Params ) ĊĊĠĠĠĠĠĠĠ Ġval Ġoverlay View Ġ= ĠC rop Overlay View ( context ) ĊĠĠĠĠĠĠĠ Ġoverlay View . id Ġ= ĠR . id . crop me _ overlay ĊĠĠĠĠĠĠĠ Ġval Ġoverlay Params Ġ= ĠFrame Layout . LayoutParams ( ViewGroup . LayoutParams . MATCH _ PARENT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠViewGroup . LayoutParams . MATCH _ PARENT ) ĊĠĠĠĠĠĠĠ Ġadd View ( overlay View , Ġoverlay Params ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Uri ( uri : ĠUri ) Ġ{ ĊĠĠĠĠĠĠĠ Ġset Uri ( uri , Ġnull , Ġnull , Ġnull ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Uri ( uri : ĠUri , Ġscale : ĠScale XY ?, Ġoffset X : ĠFloat ?, Ġoffset Y : ĠFloat ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġimage Ġ= ĠfindViewById < ImageView >( R . id . crop me _ image _ view ) ĊĠĠĠĠĠĠĠ Ġthis . uri Ġ= Ġuri ĊĠĠĠĠĠĠĠ ĠG lide . with ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. load ( uri ). into ( image ) ĊĠĠĠĠĠĠĠ Ġimage . request Layout () ĊĠĠĠĠĠĠĠ Ġif Ġ( scale Ġ!= Ġnull Ġ&& Ġoffset X Ġ!= Ġnull Ġ&& Ġoffset Y Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimage . post Delayed ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage . scale X Ġ= Ġscale . x ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage . scale Y Ġ= Ġscale . x ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage . translation Y Ġ= Ġoffset Y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage . translation X Ġ= Ġoffset X ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ 1 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . scale Ġ= ĠScale XY ( scale . x , Ġscale . y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . point Ġ= ĠPoint F ( offset X , Ġoffset Y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Crop Info () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimage . post Delayed ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage . scale X Ġ= Ġ 1 . 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage . scale Y Ġ= Ġ 1 . 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage . translation X Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage . translation Y Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ 1 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . scale Ġ= ĠScale XY ( 1 . 0 f , Ġ 1 . 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . point Ġ= ĠPoint F ( 0 f , Ġ 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Crop Info () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Bitmap ( bitmap : ĠBitmap ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġimage Ġ= ĠfindViewById < ImageView >( R . id . crop me _ image _ view ) ĊĠĠĠĠĠĠĠ Ġimage . setImage Bitmap ( bitmap ) ĊĠĠĠĠĠĠĠ Ġimage . request Layout () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcrop ( listener : ĠOn Crop Listener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtarget Ġ= ĠfindViewById < Crop ImageView >( R . id . crop me _ image _ view ) ĊĠĠĠĠĠĠĠ Ġval Ġtarget Rect Ġ= ĠRect () ĊĠĠĠĠĠĠĠ Ġtarget . get Hit Rect ( target Rect ) ĊĠĠĠĠĠĠĠ Ġvar Ġbitmap Ġ= Ġ( target . drawable Ġas ĠBitmap Drawable ). bitmap ĊĠĠĠĠĠĠĠ Ġbitmap Ġ= ĠBitmap . create Scaled Bitmap ( bitmap , Ġtarget Rect . width (), Ġtarget Rect . height (), Ġfalse ) ĊĠĠĠĠĠĠĠ Ġvar Ġleft Offset Ġ= Ġ( restriction !!. left Ġ- Ġtarget Rect . left ). toInt () ĊĠĠĠĠĠĠĠ Ġvar Ġtop Offset Ġ= Ġ( restriction !!. top Ġ- Ġtarget Rect . top ). toInt () ĊĠĠĠĠĠĠĠ Ġval Ġright Offset Ġ= Ġ( target Rect . right Ġ- Ġrestriction !!. right ). toInt () ĊĠĠĠĠĠĠĠ Ġval Ġbottom Offset Ġ= Ġ( target Rect . bottom Ġ- Ġrestriction !!. bottom ). toInt () ĊĠĠĠĠĠĠĠ Ġvar Ġwidth Ġ= Ġrestriction !!. width (). toInt () ĊĠĠĠĠĠĠĠ Ġvar Ġheight Ġ= Ġrestriction !!. height (). toInt () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( left Offset Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwidth Ġ+= Ġleft Offset ĊĠĠĠĠĠĠĠĠĠĠĠ Ġleft Offset Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( top Offset Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheight Ġ+= Ġtop Offset ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtop Offset Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( right Offset Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwidth Ġ+= Ġright Offset ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( bottom Offset Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheight Ġ+= Ġbottom Offset ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( width Ġ< Ġ 0 Ġ|| Ġheight Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Failure () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠBitmap . create Bitmap ( bitmap , Ġleft Offset , Ġtop Offset , Ġwidth , Ġheight ) ĊĠĠĠĠĠĠĠ Ġif Ġ( result Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Success ( result ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Failure () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠDEFAULT _ BASE Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠDEFAULT _ P BASE Ġ= Ġ 1 ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠMIN _ PERCENT Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠMAX _ PERCENT Ġ= Ġ 1 ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠDEFAULT _ PERCENT _ WIDTH Ġ= Ġ 0 . 8 f ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠDEFAULT _ PERCENT _ HEIGHT Ġ= Ġ 0 . 8 f ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠDEFAULT _ MAX _ SCALE Ġ= Ġ 2 ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠMIN _ SCALE Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠMAX _ SCALE Ġ= Ġ 5 ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠDEFAULT _ BACKGROUND _ ALPHA Ġ= Ġ 0 . 8 f ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠCOLOR _ D ENS ITY Ġ= Ġ 2 5 5 f ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠDEFAULT _ WITH _ BORDER Ġ= Ġtrue ĊĠĠĠ Ġ} Ċ } Ċ