2016-08-22 79 views
7

我想实现一个“底部工作表”类型的布局,但扭曲的地方,“底部”工作表将成为一个MapFragment,作为一个向上/向下的可拖动视图不能很好地工作。相当于“底部表单”的Android“顶部表单”?

我有一个可能天真的想法,将逻辑“翻转”到“顶层”设计,在顶层工作表上/下拖动显示更多/更少的底层MapFragment。

即:从这个...
Bottom Sheet Example

...为[像]这个...
Top Sheet Example

这可能给予的支持设计工具,或将我像我自己一样推出这样的东西?

+2

我想你会注册做大量的繁重工作来做两件事。首先,创建您的自定义实现。其次,确定您的实现与android实现之间的冲突,并针对这些情况进行辩护。我个人认为,材料设计语言已经到位,可以直观地传达您的用户可以期望与应用程序进行交互的方式。像这样的事情可能是个人努力的学习,但是一旦你进入市场 - 你需要期望每个人都不会理解如何使用你的应用程序。 – apelsoczi

+0

我刚刚添加了一个底部工作表布局,其顶部有一个工具栏,允许用户向上拖动工具栏。诀窍在于当用户拖动工具栏时调整地图大小。如果有人感兴趣,我可以发布我的代码。 – swooby

+0

我想看看它@swooby,我试图做类似 – odiggity

回答

1

这是我上面评论过的解决方案的基础。 我稍后会回来补充。

@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

你遇到过这个解决方案的兼容性问题吗?如果您在使用此功能的Playstore中有工作应用程序,那么查看它会很棒:) – carlosavoy