Сохранение представления в нижней части библиотеки SlidingUpPanel
Я использую SlidingUpPanel
library в одном из моих приложений Media Player
.
На панели слайдов у меня есть средства управления носителями, и я хотел бы отобразить на нем дорожку. Проблема, с которой я сталкиваюсь, заключается в том, что я бы хотел, чтобы средства управления мультимедиа всегда оставались в нижней части экрана (даже когда пользователь перетаскивает панель, а это значит, что я должен использовать метод 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
соответственно.
Основная активность (MyListActivity.java)
Должен быть другой способ!
Ответы
Ответ 1
Я понял! Мозг не работал в течение последних нескольких дней, я думаю, лол. Это была просто математика!
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);
}
}
Ответ 2
Во-первых, в 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())
;
Ответ 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");
}
});
Ответ 4
попробуйте обернуть список listview и details_slide_bar внутри RelativeLayout и изменить LayoutParams внутри onPanelExpanded и onPaanelCollapsed. Ниже приведен пример из моего проекта с использованием этой библиотеки.
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");
}
});
Ответ 5
Думаю, вам стоит попробовать относительный макет.
Если у вас есть относительный макет, который заполняет весь экран, вы должны иметь возможность использовать android: layout_alignParentBottom, чтобы переместить кнопку в нижней части экрана.
сначала в вашем файле макета и поместите остальную часть макета выше с помощью android: layout_above.
Создавая как HEADER, так и FOOTER, вот пример
[Layout XML]