0

First let me give a short introduction and then show you what end goal looks:

So far I've added a scrolllistener to my listactivity, so that I can detect scrolling, though it does not give me any animation on android:animateLayoutChanges="true". So when i change the margin's of the view programmatically, it just does these changes instantly, and not that well, any help is most welcomed.

End goal picture

As you can see in my xml, i place the item I'm going to hide slowly first so other will be above it on the Z-axis.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:lector="http://schemas.android.com/apk/res-auto"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:animateLayoutChanges="true"
    android:background="@color/background_greyish">
<LinearLayout
    android:id="@+id/disappearingHeaderLabel"
    android:layout_width="fill_parent"
    android:layout_alignParentTop="true"
    android:layout_alignParentLeft="true"
    android:layout_marginTop="60dp"
    android:animateLayoutChanges="true"
    android:layout_height="50dp"
    android:background="@color/solid_white"
    android:orientation="horizontal"
    android:weightSum="7">

    <TextView
        android:id="@+id/ProductDetailLabel"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginBottom="5dip"
        android:layout_marginLeft="15dp"
        android:layout_marginRight="5dp"
        android:layout_marginTop="10dip"
        android:layout_weight="4"
        android:singleLine="true"
        android:text="PRODUKTER"
        android:textColor="@color/solid_red"
        android:textSize="20dp" />

    <Button
        android:id="@+id/priceChooserButton"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginBottom="5dp"
        android:layout_marginLeft="5dp"
        android:layout_marginRight="15dp"
        android:layout_marginTop="10dp"
        android:layout_weight="3"
        android:background="@drawable/buttonbackground"
        android:clickable="true"
        android:singleLine="true"
        android:text="@string/retailprice"
        android:textColor="@android:color/white"
        android:textSize="15dp"
        android:textStyle="bold" />
</LinearLayout>

<dk.myapp.mobile.views.PageHeaderView
    android:id="@+id/header"
    android:layout_alignParentTop="true"
    android:layout_alignParentLeft="true"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"></dk.myapp.mobile.views.PageHeaderView>

<LinearLayout
    android:id="@+id/expandingListContainer"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:animateLayoutChanges="true"
    android:layout_alignParentLeft="true"
    android:layout_marginTop="110dp"
    android:layout_above="@+id/paginationBarContainer"
    android:orientation="vertical">


    <LinearLayout
        android:id="@+id/headerLabel"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="15dp"
        android:layout_marginRight="15dp"
        android:background="@color/transparent"
        android:orientation="horizontal"
        android:weightSum="11">

        <LinearLayout
            android:layout_width="0dp"
            android:layout_weight="3"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <TextView
                android:id="@+id/sortAmountLabel"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="10dip"
                android:singleLine="false"
                android:text="1354"
                android:textColor="@color/solid_red"
                android:textSize="15dp" />

            <TextView
                android:id="@+id/sortLabel"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginBottom="5dip"
                android:text="Produkter"
                android:singleLine="true"
                android:textColor="@color/solid_red"
                android:textSize="15dp" />

        </LinearLayout>

        <Button
            android:id="@+id/filterBtn"
            android:layout_width="0dp"
            android:layout_height="35dp"
            android:layout_marginBottom="10dp"
            android:layout_marginLeft="5dp"
            android:layout_marginRight="15dp"
            android:layout_marginTop="10dp"
            android:layout_weight="4"
            android:background="@drawable/button_background_red"
            android:clickable="true"
            android:singleLine="true"
            android:text="@string/retailprice"
            android:textColor="@color/solid_white"
            android:textSize="15dp"
            android:textStyle="bold" />


        <Spinner
            android:id="@+id/sortSpinner"
            android:layout_width="0dp"
            android:layout_weight="4"
            android:layout_height="35dp"
            android:layout_marginBottom="10dp"
            android:layout_marginTop="10dp"
            android:background="@drawable/spinner_background"
            android:drawSelectorOnTop="true"
            android:focusable="false"
            android:focusableInTouchMode="false"
            android:prompt="@string/sort" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="1dip"
        android:background="@color/divider_color"></LinearLayout>

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical">

        <ListView
            android:id="@+id/android:list"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:divider="@color/divider_color"
            android:dividerHeight="1dip"
            android:paddingLeft="15dip"
            android:scrollbarStyle="outsideInset"
            android:layout_marginLeft="5dp"
            android:layout_marginRight="5dp" />

    </LinearLayout>
</LinearLayout>

 @Override
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
        int marginRemoved = firstVisibleItem * 30;
        if (marginRemoved > 110) {
            marginRemoved = 110;
        }
        if (previousMarginRemoved != marginRemoved) {
            previousMarginRemoved = marginRemoved;

            LinearLayout disappearingHeaderContainer = (LinearLayout) findViewById(R.id.disappearingHeaderLabel);
            RelativeLayout.LayoutParams disappearingHeaderContainerLayoutParams = (RelativeLayout.LayoutParams) disappearingHeaderContainer.getLayoutParams();
            LinearLayout expandingListViewContainer = (LinearLayout) findViewById(R.id.expandingListContainer);
            RelativeLayout.LayoutParams expandingListViewContainerParams = (RelativeLayout.LayoutParams) expandingListViewContainer.getLayoutParams();

            if (disappearingHeaderStartMargin == -1 && expandingHeaderStartMargin == -1) {
                disappearingHeaderStartMargin = disappearingHeaderContainerLayoutParams.topMargin;
                expandingHeaderStartMargin = expandingListViewContainerParams.topMargin;
            }

            float disappearingHeaderTopMarginFloat = disappearingHeaderStartMargin - (marginRemoved * pixelDensity);
            int disappearingHeaderTopMargin = Math.round(disappearingHeaderTopMarginFloat);

            if (marginRemoved > 50) {
                marginRemoved = 50;
            }

            float expandingContainerTopMarginFloat = expandingHeaderStartMargin - (marginRemoved * pixelDensity);
            int expandingContainerTopMargin = Math.round(expandingContainerTopMarginFloat);

            disappearingHeaderContainerLayoutParams.setMargins(disappearingHeaderContainerLayoutParams.leftMargin,
                    disappearingHeaderTopMargin,
                    disappearingHeaderContainerLayoutParams.rightMargin,
                    disappearingHeaderContainerLayoutParams.bottomMargin);

            expandingListViewContainerParams.setMargins(expandingListViewContainerParams.leftMargin,
                    expandingContainerTopMargin,
                    expandingListViewContainerParams.rightMargin,
                    expandingListViewContainerParams.bottomMargin);

            if ((lastChangeDate < System.currentTimeMillis()-100)) {
                lastChangeDate = System.currentTimeMillis();
                disappearingHeaderContainer.setLayoutParams(disappearingHeaderContainerLayoutParams);
                expandingListViewContainer.setLayoutParams(expandingListViewContainerParams);
            }
        }
    }
};
codeMagic
  • 44,549
  • 13
  • 77
  • 93
Anders Metnik
  • 6,096
  • 7
  • 40
  • 79
  • What's your minimum support level? – DeeV Jan 22 '15 at 14:46
  • SDK version 14 (everything from 4 and up) – Anders Metnik Jan 22 '15 at 14:55
  • animateLayoutTransitions was introduced in 11, so this isn't going to work right in 4 - 10 anyway. You can try suggested here and add the `LayoutTransition.CHANGING` which seems to be disabled by default for some reason. http://stackoverflow.com/questions/20103888/animatelayoutchanges-does-not-work-well-with-nested-layout – DeeV Jan 22 '15 at 15:10
  • Also negative margins can crash on some devices. The way I think they do it is by overriding `onInterceptTouchEvent` and shifting the toolbar by View properties (Chrome minimum is 14). – DeeV Jan 22 '15 at 15:22
  • Argh sorry @DeeV I meant 4.0.0 and up – Anders Metnik Jan 23 '15 at 07:00
  • I was working on a widget that actually does this then I ended up stumbling across this. Maybe it'll help. http://stackoverflow.com/questions/13559275/hiding-the-actionbar-on-recyclerview-listview-onscroll – DeeV Jan 23 '15 at 07:02

0 Answers0