44
44
import me .vkryl .android .ViewUtils ;
45
45
import me .vkryl .android .animator .BoolAnimator ;
46
46
import me .vkryl .core .ColorUtils ;
47
+ import me .vkryl .core .MathUtils ;
47
48
48
49
public class ChatBottomBarView extends BaseView {
49
50
private Drawable drawable ;
@@ -100,16 +101,32 @@ private int calculateRadius () {
100
101
return (int ) (Screen .dp (48f ) / 2f * collapseFactor );
101
102
}
102
103
104
+ private final RectF fromRect = new RectF (), toRect = new RectF ();
105
+
103
106
private RectF buildRectF () {
104
- int fromWidth = getMeasuredWidth () - getPaddingLeft () - getPaddingRight ();
105
- int fromHeight = getMeasuredHeight () - getPaddingTop () - getPaddingBottom ();
106
- int cx = getPaddingLeft () + fromWidth / 2 ;
107
- int cy = getPaddingTop () + fromHeight / 2 ;
107
+ int fromWidth = getMeasuredWidth ();
108
+ int fromHeight = getMeasuredHeight ();
108
109
int toSize = Screen .dp (48f );
109
- int width = fromWidth + (int ) ((float ) (toSize - fromWidth ) * collapseFactor );
110
- int height = fromHeight + (int ) ((float ) (toSize - fromHeight ) * collapseFactor );
110
+
111
111
RectF rectF = Paints .getRectF ();
112
- rectF .set (cx - width / 2 , cy - height / 2 , cx + width / 2 , cy + height / 2 );
112
+
113
+ float centerX = fromWidth / 2f ;
114
+ float centerY = getPaddingTop () + (getMeasuredHeight () - getPaddingTop () - getPaddingBottom ()) / 2f ;
115
+
116
+ fromRect .set (0 , 0 , fromWidth , fromHeight );
117
+ toRect .set (
118
+ centerX - toSize / 2f ,
119
+ centerY - toSize / 2f ,
120
+ centerX + toSize / 2f ,
121
+ centerY + toSize / 2f
122
+ );
123
+
124
+ rectF .set (
125
+ MathUtils .fromTo (fromRect .left , toRect .left , collapseFactor ),
126
+ MathUtils .fromTo (fromRect .top , toRect .top , collapseFactor ),
127
+ MathUtils .fromTo (fromRect .right , toRect .right , collapseFactor ),
128
+ MathUtils .fromTo (fromRect .bottom , toRect .bottom , collapseFactor )
129
+ );
113
130
return rectF ;
114
131
}
115
132
@@ -149,16 +166,19 @@ public void layout (int width) {
149
166
150
167
private static final float SCALE = .8f ;
151
168
152
- public void draw (Canvas c , View view , float collapseFactor , float factor ) {
153
- int cx = view .getPaddingLeft () + (view .getMeasuredWidth () - view .getPaddingRight () - view .getPaddingLeft ()) / 2 ;
154
- int cy = view .getPaddingTop () + (view .getMeasuredHeight () - view .getPaddingBottom () - view .getPaddingTop ()) / 2 ;
169
+ public void draw (Canvas c , View view , float collapseFactor , float factor , float rectX , float rectY ) {
170
+ float fromCx = view .getPaddingLeft () + (view .getMeasuredWidth () - view .getPaddingRight () - view .getPaddingLeft ()) / 2f ;
171
+ float fromCy = view .getPaddingTop () + (view .getMeasuredHeight () - view .getPaddingBottom () - view .getPaddingTop ()) / 2f ;
172
+
173
+ float cx = fromCx + (rectX - fromCx ) * collapseFactor ;
174
+ float cy = fromCy + (rectY - fromCy ) * collapseFactor ;
155
175
156
176
if (prevState != null ) {
157
177
c .save ();
158
178
float displayFactor = 1f - this .factor ;
159
179
float scale = SCALE + (1f - SCALE ) * displayFactor ;
160
180
c .scale (scale , scale , cx , cy );
161
- prevState .draw (c , view , collapseFactor , displayFactor );
181
+ prevState .draw (c , view , collapseFactor , displayFactor , cx , cy );
162
182
c .restore ();
163
183
}
164
184
factor *= this .factor ;
@@ -172,11 +192,11 @@ public void draw (Canvas c, View view, float collapseFactor, float factor) {
172
192
saveCount = -1 ;
173
193
}
174
194
if (drawingText != null && collapseFactor < 1f ) {
175
- drawingText .draw (c , cx - drawingText .getWidth () / 2 , cy - drawingText .getHeight () / 2 , null , factor * (1f - collapseFactor ));
195
+ drawingText .draw (c , ( int ) ( cx - drawingText .getWidth () / 2f ), ( int ) ( cy - drawingText .getHeight () / 2f ) , null , factor * (1f - collapseFactor ));
176
196
}
177
197
if (collapseFactor > 0f && drawable != null ) {
178
198
Paint paint = PorterDuffPaint .get (ColorId .circleButtonChatIcon , factor * collapseFactor );
179
- Drawables .draw (c , drawable , cx - drawable . getMinimumWidth () / 2 , cy - drawable . getMinimumHeight () / 2 , paint );
199
+ Drawables .drawCentered (c , drawable , cx , cy , paint );
180
200
}
181
201
if (needScale ) {
182
202
Views .restore (c , saveCount );
@@ -247,7 +267,7 @@ protected void onDraw (Canvas c) {
247
267
RectF rectF = buildRectF ();
248
268
c .save ();
249
269
c .clipRect (rectF .left , rectF .top , rectF .right , rectF .bottom );
250
- state .draw (c , this , collapseFactor , 1f );
270
+ state .draw (c , this , collapseFactor , 1f , rectF . centerX (), rectF . centerY () );
251
271
c .restore ();
252
272
}
253
273
}
0 commit comments