Skip to content

Commit 44eabe3

Browse files
imhappidsn5ft
authored andcommitted
[SearchBar] Fix animation calculations for predictive back
PiperOrigin-RevId: 743652844
1 parent 9fd5a67 commit 44eabe3

File tree

1 file changed

+28
-24
lines changed

1 file changed

+28
-24
lines changed

lib/java/com/google/android/material/search/SearchViewAnimationHelper.java

Lines changed: 28 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import android.view.Menu;
3535
import android.view.View;
3636
import android.view.ViewGroup.MarginLayoutParams;
37+
import android.view.ViewParent;
3738
import android.widget.EditText;
3839
import android.widget.FrameLayout;
3940
import android.widget.ImageButton;
@@ -574,24 +575,34 @@ private Animator getTranslationAnimatorForText(boolean show, View v) {
574575
&& textView.getHint() != textView.getText()) {
575576
String text = textView.getText().toString();
576577
Rect bounds = new Rect();
577-
578578
textView.getPaint().getTextBounds(text, 0, text.length(), bounds);
579579
additionalMovement = max(0, searchBar.getTextView().getMeasuredWidth() / 2 - bounds.width() / 2);
580580
}
581-
int[] searchBarTextViewLoc = new int[2];
582-
searchBar.getTextView().getLocationOnScreen(searchBarTextViewLoc);
583-
int[] searchBarLoc = new int[2];
584-
searchBar.getLocationOnScreen(searchBarLoc);
585-
int[] searchViewToolbarLoc = new int[2];
586-
searchView.getToolbar().getLocationOnScreen(searchViewToolbarLoc);
587-
588581
int startX =
589-
searchBarTextViewLoc[0]
590-
- searchViewToolbarLoc[0]
582+
getViewLeftFromSearchViewParent(searchBar.getTextView())
591583
+ additionalMovement
592584
- (v.getLeft() + textContainer.getLeft());
593-
return getTranslationAnimator(
594-
show, v, startX, getFromTranslationY(searchBarLoc[1] - searchViewToolbarLoc[1]));
585+
return getTranslationAnimator(show, v, startX, getFromTranslationY());
586+
}
587+
588+
private int getViewLeftFromSearchViewParent(@NonNull View v) {
589+
int left = v.getLeft();
590+
ViewParent viewParent = v.getParent();
591+
while (viewParent instanceof View && viewParent != searchView.getParent()) {
592+
left += ((View) viewParent).getLeft();
593+
viewParent = viewParent.getParent();
594+
}
595+
return left;
596+
}
597+
598+
private int getViewTopFromSearchViewParent(@NonNull View v) {
599+
int top = v.getTop();
600+
ViewParent viewParent = v.getParent();
601+
while (viewParent instanceof View && viewParent != searchView.getParent()) {
602+
top += ((View) viewParent).getTop();
603+
viewParent = viewParent.getParent();
604+
}
605+
return top;
595606
}
596607

597608
private Animator getContentAnimator(boolean show) {
@@ -667,19 +678,12 @@ private int getFromTranslationXEnd(View view) {
667678
: searchBar.getRight() - searchView.getWidth() + marginEnd;
668679
}
669680

670-
private int getFromTranslationY(int searchBarViewVerticalDistance) {
671-
return searchBarViewVerticalDistance
672-
+ searchBar.getMeasuredHeight() / 2
673-
- toolbarContainer.getMeasuredHeight() / 2;
674-
}
675-
676681
private int getFromTranslationY() {
677-
int[] searchBarLoc = new int[2];
678-
searchBar.getLocationOnScreen(searchBarLoc);
679-
int[] searchViewToolbarLoc = new int[2];
680-
searchView.getToolbar().getLocationOnScreen(searchViewToolbarLoc);
681-
682-
return getFromTranslationY(searchBarLoc[1] - searchViewToolbarLoc[1]);
682+
int toolbarMiddleY = toolbarContainer.getTop() + toolbarContainer.getMeasuredHeight() / 2;
683+
int searchBarMiddleY =
684+
getViewTopFromSearchViewParent(searchBar)
685+
+ searchBar.getMeasuredHeight() / 2;
686+
return searchBarMiddleY - toolbarMiddleY;
683687
}
684688

685689
private void setUpDummyToolbarIfNeeded() {

0 commit comments

Comments
 (0)