package com.smartandroid.sa.fading;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.FrameLayout;
public class RootLayout extends FrameLayout {
private View mHeaderContainer;
private View mListViewBackground;
private boolean mInitialized = false;
private Context c;
public RootLayout(Context context) {
super(context);
this.c = context;
}
public RootLayout(Context context, AttributeSet attrs) {
super(context, attrs);
this.c = context;
}
public RootLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
this.c = context;
}
protected void onLayout(boolean changed, int left, int top, int right,
int bottom) {
// at first find headerViewContainer and listViewBackground
if (mHeaderContainer == null)
mHeaderContainer = findViewById(getResources().getIdentifier(
"fab__header_container", "id", c.getPackageName()));
// mHeaderContainer = findViewById(R.id.fab__header_container);
if (mListViewBackground == null)
mListViewBackground = findViewById(getResources().getIdentifier(
"fab__listview_background", "id", c.getPackageName()));
// mListViewBackground = findViewById(R.id.fab__listview_background);
// if there's no headerViewContainer then fallback to standard
// FrameLayout
if (mHeaderContainer == null) {
super.onLayout(changed, left, top, right, bottom);
return;
}
if (!mInitialized) {
super.onLayout(changed, left, top, right, bottom);
// if mListViewBackground not exists or mListViewBackground exists
// and its top is at headercontainer height then view is initialized
if (mListViewBackground == null
|| mListViewBackground.getTop() == mHeaderContainer
.getHeight())
mInitialized = true;
return;
}
// get last header and listViewBackground position
int headerTopPrevious = mHeaderContainer.getTop();
int listViewBackgroundTopPrevious = mListViewBackground != null ? mListViewBackground
.getTop() : 0;
// relayout
super.onLayout(changed, left, top, right, bottom);
// revert header top position
int headerTopCurrent = mHeaderContainer.getTop();
if (headerTopCurrent != headerTopPrevious) {
mHeaderContainer.offsetTopAndBottom(headerTopPrevious
- headerTopCurrent);
}
// revert listViewBackground top position
int listViewBackgroundTopCurrent = mListViewBackground != null ? mListViewBackground
.getTop() : 0;
if (listViewBackgroundTopCurrent != listViewBackgroundTopPrevious) {
mListViewBackground
.offsetTopAndBottom(listViewBackgroundTopPrevious
- listViewBackgroundTopCurrent);
}
}
}