2016-08-22 10 views
7

Chcę zaimplementować układ typu "Dolny arkusz", ale z akcentem, w którym "dolnym" arkuszem będzie MapFragment, który nie będzie działał zbyt dobrze jako widok przeciągalny w górę/dół.Android "Top Sheet" odpowiednik "Bottom Sheet"?

Miałem prawdopodobnie naiwną myśl, aby "przerzucić" logikę na projekt "górnego arkusza", w którym przeciągnij górny arkusz w górę/dół, aby pokazać więcej/mniej dolnej części mapy.

tj: Od tego ...
Bottom Sheet Example

... na [coś podobnego] ten ...
Top Sheet Example

Czy to możliwe, biorąc pod uwagę narzędzia wspomagające projektowanie, albo będę musiał przetworzyć coś takiego na własną rękę?

+2

Myślę, że zamierzasz zarejestrować się, aby wykonać znaczną ilość ciężkiego podnoszenia, aby zrobić dwie rzeczy. Po pierwsze, aby utworzyć niestandardową implementację. Po drugie, aby określić, w jaki sposób implementacja jest w konflikcie z implementacją Androida i bronić się przed tymi scenariuszami. Moja osobista opinia, język projektowania materiałów, został wprowadzony w celu wizualnej komunikacji z użytkownikami, którzy mogą oczekiwać interakcji z aplikacją. Coś takiego może być świetne jako osobisty wysiłek na rzecz nauki, ale gdy już trafisz na rynek - musisz oczekiwać, że każda osoba nie będzie rozumieć, jak korzystać z aplikacji. – apelsoczi

+0

Skończyło się na tym, że dodałem układ półek, który ma na górze pasek narzędzi, który pozwala użytkownikowi przeciągnąć pasek narzędzi do góry. Sztuczka polega wtedy na zmianie rozmiaru mapy, gdy użytkownik przeciąga pasek narzędzi. Mogę opublikować mój kod, jeśli ktoś jest zainteresowany. – swooby

+0

Chciałbym to zobaczyć @wowooby, próbuję zrobić coś podobnego – odiggity

Odpowiedz

1

Oto podstawa mojego rozwiązania, o którym mówiłem powyżej. Wrócę i uzupełnię to później.

@Override 
protected void onCreate(
     @Nullable 
       Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    if (isFinishing()) 
    { 
     return; 
    } 


    setContentView(R.layout.activity_home); 

    ... 

    mGroupBottomSheetFiller = (ViewGroup) findViewById(R.id.groupBottomSheetFiller); 

    final NestedScrollView bottomSheetMap = (NestedScrollView) findViewById(R.id.bottomSheetMap); 
    mBottomSheetMapBehavior = BottomSheetBehavior.from(bottomSheetMap); 
    mBottomSheetMapBehavior.setBottomSheetCallback(new BottomSheetCallback() 
    { 
     @Override 
     public void onStateChanged(
       @NonNull 
         View bottomSheet, 
       int newState) 
     { 
      //Log.e(TAG, "mBottomSheetMapBehavior.onStateChanged(bottomSheet, newState=" + 
      //    bottomSheetBehaviorStateToString(newState) + ')'); 
      int visibility = isBottomSheetExpanded(mBottomSheetMapBehavior) ? View.VISIBLE : View.GONE; 
      mImageBottomSheetMapClose.setVisibility(visibility); 
     } 

     @Override 
     public void onSlide(
       @NonNull 
         View bottomSheet, 
       float slideOffset) 
     { 
      //Log.e(TAG, "mBottomSheetMapBehavior.onStateChanged(bottomSheet, slideOffset=" + slideOffset + ')'); 
      resizeMap(); 
     } 
    }); 
    bottomSheetMap.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() 
    { 
     @Override 
     public void onGlobalLayout() 
     { 
      //Log.e(TAG, "onGlobalLayout()"); 
      bottomSheetMap.getViewTreeObserver().removeOnGlobalLayoutListener(this); 
      resizeMap(); 
     } 
    }); 

    ... 
} 

private void resizeMap() 
{ 
    int screenHeightPixels = PbPlatformUtils.getScreenHeightPixels(); 
    //Log.e(TAG, "resizeMap: screenHeightPixels=" + screenHeightPixels); 

    int[] location = new int[2]; 
    mGroupMap.getLocationInWindow(location); 
    //Log.e(TAG, "resizeMap: getLocationInWindow=" + Arrays.toString(location)); 

    LayoutParams groupMapLayoutParams = mGroupMap.getLayoutParams(); 
    groupMapLayoutParams.height = screenHeightPixels - location[1]; 
    mGroupMap.requestLayout(); 
} 

public static String bottomSheetBehaviorStateToString(int state) 
{ 
    String s; 
    switch (state) 
    { 
     case BottomSheetBehavior.STATE_COLLAPSED: 
      s = "STATE_COLLAPSED"; 
      break; 
     case BottomSheetBehavior.STATE_DRAGGING: 
      s = "STATE_DRAGGING"; 
      break; 
     case BottomSheetBehavior.STATE_EXPANDED: 
      s = "STATE_EXPANDED"; 
      break; 
     case BottomSheetBehavior.STATE_HIDDEN: 
      s = "STATE_HIDDEN"; 
      break; 
     case BottomSheetBehavior.STATE_SETTLING: 
      s = "STATE_SETTLING"; 
      break; 
     default: 
      s = "UNKNOWN"; 
      break; 
    } 
    return s + '(' + state + ')'; 
} 

private static boolean isBottomSheetExpanded(
     @NonNull 
       BottomSheetBehavior bottomSheetBehavior) 
{ 
    return bottomSheetBehavior.getState() == BottomSheetBehavior.STATE_EXPANDED; 
} 

private void bottomSheetMapExpand() 
{ 
    mGroupBottomSheetFiller.setVisibility(View.VISIBLE); 
    int peekHeightPx = getResources().getDimensionPixelSize(R.dimen.home_bottom_sheet_map_peek_height); 
    mBottomSheetMapBehavior.setPeekHeight(peekHeightPx); 
    mBottomSheetMapBehavior.setState(BottomSheetBehavior.STATE_EXPANDED); 
    mBottomSheetMapBehavior.setHideable(false); 
} 

private void bottomSheetMapCollapse() 
{ 
    mGroupBottomSheetFiller.setVisibility(View.VISIBLE); 
    int peekHeightPx = getResources().getDimensionPixelSize(R.dimen.home_bottom_sheet_map_peek_height); 
    mBottomSheetMapBehavior.setPeekHeight(peekHeightPx); 
    mBottomSheetMapBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED); 
    mBottomSheetMapBehavior.setHideable(false); 
} 

private void bottomSheetMapHide() 
{ 
    mBottomSheetMapBehavior.setHideable(true); 
    mBottomSheetMapBehavior.setPeekHeight(0); 
    mBottomSheetMapBehavior.setState(BottomSheetBehavior.STATE_HIDDEN); 
    mGroupBottomSheetFiller.setVisibility(View.GONE); 
} 
+1

czy wystąpiły problemy ze zgodnością z tym rozwiązaniem? jeśli masz działającą aplikację w playstore przy użyciu tej funkcjonalności, byłoby wspaniale to sprawdzić :) – carlosavoy

Powiązane problemy