【问题标题】:Keeping a view at the bottom with the SlidingUpPanel library使用 SlidingUpPanel 库在底部保持视图
【发布时间】:2016-06-02 22:22:48
【问题描述】:

我在我的一个Media Player 应用程序中使用SlidingUpPanel library

在滑动面板中,我有媒体控件,我想在顶部显示轨道的艺术作品。我遇到的问题是我希望媒体控件始终位于屏幕底部(即使用户正在拖动面板,这意味着我必须使用 onPanelSlide () 方法)。也许就像视差效果(不确定这是否是正确的名称)。这就是我现在所拥有的:

折叠/展开/拖动:

如您所见,当我拖动面板时,控件粘在顶部。我希望它贴在屏幕底部并在其上方显示艺术品。

我在想CoordinatorLayout,但我不知道它是如何工作的!

我的代码:

activity.xml

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.sothree.slidinguppanel.SlidingUpPanelLayout
        android:id="@+id/sliding_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="bottom"
        sothree:umanoPanelHeight="92dp"
        sothree:umanoShadowHeight="4dp">

        <ListView
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>

        <include layout="@layout/details_slide_bar" />
    </com.sothree.slidinguppanel.SlidingUpPanelLayout>

</RelativeLayout>

details_slide_bar.xml

<LinearLayout
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:layout_gravity="bottom"
              android:orientation="vertical">

    <ImageView
        android:id="@+id/ivArtworkBar"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:visibility="gone"/>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="92dp"
        android:orientation="horizontal"
        android:id="@+id/lDetailsBar">

        /!-- Content of the detalBar !-->
    </RelativeLayout>
</LinearLayout>

目前,我只是检查面板的状态并相应地调整艺术品的visibility

The Main Activity (MyListActivity.java)

一定有别的办法!

【问题讨论】:

    标签: java android android-layout


    【解决方案1】:

    首先,在你的活动的 onCreate 中

    mLayout = (SlidingUpPanelLayout) findViewById(R.id.sliding_layout);
    

    然后设置面板状态为折叠。

     mLayout.setPanelState(SlidingUpPanelLayout.PanelState.COLLAPSED);
     mLayout.setEnableDragViewTouchEvents(false);
     mLayout.setDragView(null);
     mLayout.setEnabled(false);
     mLayout.setClickable(false);
    

    如果你的滑动面板不可见,那么

    mLayout.setPanelHeight(your panel height);
    

    这里your panel height 的值必须是整数。甚至你也可以像mLayout.setPanelHeight(your_drag_layout.getHeight()) 那样动态地做;

    【讨论】:

    • 但问题是我希望 detailsBar(媒体控件)始终保持在屏幕底部(即使在拖动过程中)
    • 当然。我回家后会这样做,
    • 完成。将活动代码上传到 PasteBin 并编辑问题
    • 我明白了!提交了我的解决方案。不过感谢您的帮助:)
    【解决方案2】:

    我明白了!最近几天大脑一直没有工作,我猜哈哈。这只是简单的数学!

    private SlidingUpPanelLayout slidingLayout;
    
    @Ovverride
    public void onCreate(Bundle bundle) {
        slidingLayout = (SlidingUpPanelLayout) findViewById(R.id.sliding_layout);
    
    }
    
    @Override
    public void onPanelSlide(View panel, float slideOffset) {
        if (lDetails != null) {
            if (!varsInitialized) {
                relativeParams = (RelativeLayout.LayoutParams) lDetails.getLayoutParams();
                varsInitialized = true;
            }
            int adjustedMargin = slidingLayout.getHeight() - slidingLayout.getPanelHeight() - panel.getTop();
            relativeParams.setMargins(0, adjustedMargin, 0, 0);  // left, top, right, bottom
            lDetails.setLayoutParams(relativeParams);
        }
    }
    

    【讨论】:

      【解决方案3】:

      嗯,这是非常具体的实现。也许你可以这样做

              mLayout = (SlidingUpPanelLayout) findViewById(R.id.sliding_layout);
              mLayout.setDragView(findViewById(R.id.userInfoRoot));
              mLayout.setPanelSlideListener(new SlidingUpPanelLayout.PanelSlideListener() {
                  @Override
                  public void onPanelSlide(View panel, float slideOffset) {
                      Log.i(TAG, "onPanelSlide, offset " + slideOffset);
                  }
      
                  @Override
                  public void onPanelExpanded(View panel) {
                      Log.i(TAG, "onPanelExpanded");
                      mLayout.setPanelState(SlidingUpPanelLayout.PanelState.COLLAPSED);
                  }
      
                  @Override
                  public void onPanelCollapsed(View panel) {
                      Log.i(TAG, "onPanelCollapsed");
      
                  }
      
                  @Override
                  public void onPanelAnchored(View panel) {
                      Log.i(TAG, "onPanelAnchored");
                  }
      
                  @Override
                  public void onPanelHidden(View panel) {
                      Log.i(TAG, "onPanelHidden");
                  }
              });
      

      【讨论】:

      • 我已经让面板工作了,我只是想不出一种方法让播放器控件始终保持在底部
      • 你用过这个吗:setTouchEnabled(false)
      • mLayout.setTouchEnabled(false);
      【解决方案4】:

      尝试将您的 listview 和 details_slide_bar 包装在 RelativeLayout 中,并更改 onPanelExpanded 和 onPaanelCollapsed 中的 LayoutParams。下面是我使用该库的一些项目中的示例。

      activity_main.xml

      <android.support.v4.widget.DrawerLayout
              xmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:app="http://schemas.android.com/apk/res-auto"
              xmlns:tools="http://schemas.android.com/tools"
              android:id="@+id/drawer_layout"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              tools:context="com.nerdability.android.ArticleListActivity">
      
      
          <com.sothree.slidinguppanel.SlidingUpPanelLayout
                  xmlns:sothree="http://schemas.android.com/apk/res-auto"
                  android:id="@+id/sliding_layout"
                  android:layout_width="match_parent"
                  android:layout_height="match_parent"
                  android:gravity="bottom"
                  sothree:umanoPanelHeight="?attr/actionBarSize"
                  sothree:umanoShadowHeight="4dp"
                  sothree:umanoDragView="@+id/dragView">
              <!-- MAIN CONTENT -->
              <RelativeLayout
                      xmlns:android="http://schemas.android.com/apk/res/android"
                      xmlns:tools="http://schemas.android.com/tools"
                      android:layout_width="match_parent"
                      android:layout_height="match_parent"
                      android:layout_marginLeft="0dp"
                      android:divider="?android:attr/dividerHorizontal"
                      android:orientation="horizontal"
                      android:showDividers="middle">
                  <LinearLayout
                          android:id="@+id/toolbarContainer"
                          android:layout_width="match_parent"
                          android:layout_height="?attr/actionBarSize"
                          android:minHeight="?attr/actionBarSize">
                      <include layout="@layout/toolbar"/>
                  </LinearLayout>
                  <LinearLayout
                          android:layout_below="@id/toolbarContainer"
                          android:layout_width="match_parent"
                          android:layout_height="match_parent"
                          android:layout_marginLeft="0dp"
                          android:layout_marginStart="0dp"
                          android:divider="?android:attr/dividerHorizontal"
                          android:baselineAligned="false"
                          android:orientation="horizontal"
                          android:showDividers="middle"
                          tools:context=".ArticleListActivity" >
                      <FrameLayout
                              android:id="@+id/article_list"
                              android:layout_width="0dp"
                              android:layout_height="match_parent"
                              android:layout_weight="1"/>
      
      
                  </LinearLayout>
      
              </RelativeLayout>
      
              <!-- SLIDING LAYOUT -->
              <RelativeLayout
                      android:layout_width="match_parent"
                      android:layout_height="match_parent"
                      android:orientation="vertical"
                      android:clickable="false"
                      android:focusable="true"
                      android:id="@+id/dragView">
                      <ImageView
                          android:id="@+id/img"
                          android:layout_centerInParent="true"
                          android:layout_marginTop="25dp"
                          android:layout_width="fill_parent"
                          android:layout_height="wrap_content"/>
      
                  <LinearLayout
                          android:id="@+id/toolbar_view"
                          android:layout_alignParentTop="true"
                          android:layout_width="match_parent"
                          android:background="@color/holo_blue_light"
                          android:layout_height="?attr/actionBarSize"
                          android:orientation="horizontal">
                      <TextView
                              android:layout_width="wrap_content"
                              android:ellipsize="end"
                              android:layout_gravity="center_vertical"
                              android:layout_height="wrap_content"
                              android:textSize="25sp"
                              android:textColor="@color/white"
                              android:paddingLeft="20dp"
                              android:text="@string/app_name"/>
                  </LinearLayout>
                  <include
                          android:id="@+id/player_view"
                          android:layout_alignParentTop="true"
                          android:layout_width="match_parent"
                          android:layout_height="?attr/actionBarSize"
                          layout="@layout/player" />
              </RelativeLayout>
      
          </com.sothree.slidinguppanel.SlidingUpPanelLayout>
      </android.support.v4.widget.DrawerLayout>
      

      MainActivity.Java

      mLayout = (SlidingUpPanelLayout) findViewById(R.id.sliding_layout);
              mLayout.setPanelSlideListener(new SlidingUpPanelLayout.PanelSlideListener() {
                  View playerView = (View) findViewById(R.id.player_view);
                  View toolbarView = (View) findViewById(R.id.toolbar_view);
      
                  @Override
                  public void onPanelSlide(View panel, float slideOffset) {
                      Log.i(TAG, "onPanelSlide, offset " + slideOffset);
                  }
      
                  @Override
                  public void onPanelExpanded(View panel) {
                      Log.i(TAG, "onPanelExpanded");
                      RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) playerView.getLayoutParams();
                      lp.removeRule(RelativeLayout.ALIGN_PARENT_TOP);
                      lp.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE);
                      playerView.setLayoutParams(lp);
                      playerView.bringToFront();
      
                  }
      
                  @Override
                  public void onPanelCollapsed(View panel) {
                      Log.i(TAG, "onPanelCollapsed");
                      RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) playerView.getLayoutParams();
                      lp.removeRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
                      lp.addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE);
      
                      playerView.setLayoutParams(lp);
                      playerView.bringToFront();
                  }
      
                  @Override
                  public void onPanelAnchored(View panel) {
                          Log.i(TAG, "onPanelAnchored");
                      }
                  @Override
                  public void onPanelHidden(View panel) {
                          Log.i(TAG, "onPanelHidden");
                      }
              });
      

      【讨论】:

      • 但问题是我希望 detailsBar(媒体控件)始终保持在屏幕底部(即使在拖动过程中)
      【解决方案5】:

      我认为您应该尝试相对布局。 如果您有一个填充整个屏幕的相对布局,您应该能够使用 android:layout_alignParentBottom 将按钮移动到屏幕底部。 首先在您的布局文件中,然后使用 android:layout_above 定位上面布局的其余部分。

      同时创建 HEADER 和 FOOTER,这是一个示例

      [布局 XML]

      【讨论】:

      • 看不到您的示例。我的解决方案运行良好,但如果您的解决方案使用较少的 cpu,我宁愿使用它:)
      • 我不能说 CPU 使用率
      • 我不能说 cpu 使用率是你更关心空间和时间的复杂性。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-11
      • 1970-01-01
      • 1970-01-01
      • 2015-07-28
      • 2016-01-21
      • 2019-01-03
      相关资源
      最近更新 更多