自定義 Behavior,伸縮的搜索框
懸浮 + 伸縮 的搜索框
GIF.gif
前幾天 用華為商店, 無意中發現了這個效果, 覺得挺贊的,簡單來說,就是 搜索框在滑動到某個位置的時候,觸發展開和折疊的效果.
FloatExpandSearchBehavior
package org.alex.behavior.floatexpandsearch;
import android.content.Context;
import android.content.res.TypedArray;
import android.support.annotation.Nullable;
import android.support.design.widget.CoordinatorLayout;
import android.support.v4.view.ViewCompat;
import android.support.v4.view.animation.FastOutSlowInInterpolator;
import android.util.AttributeSet;
import android.view.View;
import android.view.animation.Interpolator;
import org.alex.mdlibrary.R;
import org.alex.util.LogTrack;
import java.lang.ref.WeakReference;
/**
* 作者:Alex
* 時間:2017/2/27 22:30
* 簡述:
*/
public class FloatExpandSearchBehavior extends CoordinatorLayout.Behavior<View> {
private static final Interpolator INTERPOLATOR = new FastOutSlowInInterpolator();
private int dependentViewId;
/**
* 依賴 控件
*/
private WeakReference<View> dependentViewWeakReference;
private WeakReference<View> childViewWeakReference;
private int childWidth;
private float childY;
private int targetY;
private int offsetY;
private int dependencyHeight;
private float lastProgress;
private float progress;
private float childTopMargin;
private IFloatExpandSearch floatExpandSearch;
/**
* Default constructor for instantiating Behaviors.
*/
public FloatExpandSearchBehavior() {
}
/**
* Default constructor for inflating Behaviors from layout. The Behavior will have
* the opportunity to parse specially defined layout parameters. These parameters will
* appear on the child view tag.
*
* @param context
* @param attrs
*/
public FloatExpandSearchBehavior(Context context, AttributeSet attrs) {
super(context, attrs);
initBehavior(context, attrs);
}
private void initBehavior(Context context, AttributeSet attrs) {
childTopMargin = -1;
dependencyHeight = -1;
lastProgress = -1F;
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.FloatExpandSearchBehavior);
dependentViewId = typedArray.getResourceId(R.styleable.FloatExpandSearchBehavior_fesb_dependentViewId, -1);
targetY = typedArray.getDimensionPixelOffset(R.styleable.FloatExpandSearchBehavior_fesb_targetY, 0);
offsetY = typedArray.getDimensionPixelOffset(R.styleable.FloatExpandSearchBehavior_fesb_offsetY, 0);
typedArray.recycle();
}
/**
* 我們將 該 Behavior 綁定給一個控件,
* 在 CoordinateLayout 中,與所綁定的控件 同一 目錄級別的 控件中, 確定 所依賴的
* 確定所提供的子視圖是否有另一個特定的同級視圖作為布局從屬,確定你依賴哪些View。
* 返回 true 即可確立依賴關系
*/
@Override
public boolean layoutDependsOn(CoordinatorLayout parent, View child, View dependency) {
boolean isHeadView = dependency.getId() == dependentViewId;
floatExpandSearch = (IFloatExpandSearch) child;
childViewWeakReference = (childViewWeakReference == null) ? new WeakReference<>(dependency) : childViewWeakReference;
if (isHeadView) {
dependentViewWeakReference = (dependentViewWeakReference == null) ? new WeakReference<>(dependency) : dependentViewWeakReference;
}
return isHeadView;
}
@Override
public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, View child, View directTargetChild, View target, int nestedScrollAxes) {
return (nestedScrollAxes & ViewCompat.SCROLL_AXIS_VERTICAL) != 0;
}
@Override
public void onNestedScroll(CoordinatorLayout coordinatorLayout, View child, View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed) {
super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed);
//offsetChildView(coordinatorLayout, child, dependency);
//LogTrack.i("--");
autoShowOrHide(coordinatorLayout, child);
}
/**
* 子控件 需要發生改變 返回 true
*
* @param parent
* @param child
* @param dependency
* @return
*/
@Override
public boolean onDependentViewChanged(CoordinatorLayout parent, View child, View dependency) {
offsetChildView(parent, child, dependency);
autoShowOrHide(parent, child);
return true;
}
private void autoShowOrHide(final CoordinatorLayout parent, final View child) {
lastProgress = (lastProgress < 0) ? progress : lastProgress;
int floatEnum = floatExpandSearch.getFloatEnum();
LogTrack.i(progress + " " + floatEnum + " " + (progress == 0F));
if (progress == 0F && floatExpandSearch.isUnFolded()) {
floatExpandSearch.startFolding();
} else if (progress == 1F) {
//LogTrack.i(progress);
floatExpandSearch.startUnFolding(-1);
}
if (lastProgress > progress && progress < 0.5F) {
if (IFloatExpandSearch.FloatEnum.FOLDED_2_UNFOLDED == floatEnum) {
/*正在由折疊狀態 -> 展開狀態 需要變成 折疊狀態*/
//LogTrack.i("正在由折疊狀態 -> 展開狀態 需要變成 折疊狀態");
floatExpandSearch.cancelUnFolding();
hide(child);
} else if (IFloatExpandSearch.FloatEnum.UNFOLDED == floatEnum) {
/*正處于展開狀態 要變成 折疊狀態*/
//LogTrack.i("正處于展開狀態 要變成 折疊狀態");
hide(child);
} else {
//LogTrack.i("往上推 隱藏 " + floatEnum);
}
} else if (lastProgress < progress && progress > 0.5F) {
if (IFloatExpandSearch.FloatEnum.UNFOLDED_2_FOLDED == floatEnum) {
/*正在由展開狀態 -> 折疊狀態 需要變成 展開狀態*/
//LogTrack.i("正在由展開狀態 -> 折疊狀態 需要變成 展開狀態");
floatExpandSearch.cancelFolding();
show(child);
} else if (IFloatExpandSearch.FloatEnum.FOLDED == floatEnum) {
/*正處于折疊狀態 要變成 展開狀態*/
//LogTrack.i("正處于折疊狀態 要變成 展開狀態");
show(child);
} else {
//LogTrack.i("往下拉 展示 " + floatEnum);
}
}
lastProgress = progress;
}
private void offsetChildView(final CoordinatorLayout parent, final View child, final View dependentView) {
dependencyHeight = (dependencyHeight < 0) ? dependentView.getMeasuredHeight() : dependencyHeight;
childWidth = (childWidth < 0) ? child.getMeasuredWidth() : childWidth;
childY = (childY < 0) ? child.getY() : childY;
progress = (dependencyHeight - offsetY + dependentView.getY()) * 100 / (dependencyHeight - offsetY);
progress *= 0.01F;
//LogTrack.i(progress);
CoordinatorLayout.LayoutParams childLayoutParams = (CoordinatorLayout.LayoutParams) child.getLayoutParams();
childTopMargin = (childTopMargin < 0) ? childLayoutParams.topMargin : childTopMargin;
childLayoutParams.topMargin = (int) (childTopMargin * progress);
childLayoutParams.topMargin = (childLayoutParams.topMargin >= targetY) ? childLayoutParams.topMargin : targetY;
child.setLayoutParams(childLayoutParams);
}
private View getChildView() {
return childViewWeakReference.get();
}
/**
* 隱藏時的動畫
*/
private void hide(final View view) {
floatExpandSearch.startFolding();
}
/**
* 顯示時的動畫
*/
private void show(final View view) {
floatExpandSearch.startUnFolding();
}
@Nullable
private View getDependentView() {
return (dependentViewWeakReference == null) ? null : dependentViewWeakReference.get();
}
private int getDependentHeight() {
View dependentView = getDependentView();
return dependentView == null ? 0 : dependentView.getMeasuredHeight();
}
}
FloatExpandSearchBehavior
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="FloatExpandSearchBehavior">
<attr name="fesb_dependentViewId" format="reference"/>
<attr name="fesb_targetY" format="dimension"/>
<attr name="fesb_offsetY" format="dimension"/>
</declare-styleable>
</resources>
SearchLayout
package com.alex.materialdesign.widget;
import android.animation.Animator;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.content.Context;
import android.graphics.drawable.GradientDrawable;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.RelativeLayout;
import com.alex.materialdesign.R;
import com.alex.materialdesign.callback.SimpleAnimatorListener;
import org.alex.behavior.floatexpandsearch.IFloatExpandSearch;
/**
* 作者:Alex
* 時間:2017/2/27 19:55
* 簡述:
*/
public class SearchLayout extends RelativeLayout implements IFloatExpandSearch {
/**
* 展開 動畫
*/
private AnimatorSet unFoldingAnimatorSet;
/**
* 折疊 動畫
*/
private AnimatorSet foldingAnimatorSet;
private View runnerView;
private int currRunnerViewWidth;
private int runnerViewWidth;
private int runnerViewHeight;
/**
* 折疊 時間
*/
private int foldingDuration;
/**
* 展開 時間
*/
private int unFoldingDuration;
private ObjectAnimator foldingXObjectAnimator;
private ObjectAnimator unFoldingXObjectAnimator;
private int floatEnum;
private GradientDrawable runnerDrawable;
/**
* 折疊 狀態的 顏色
*/
private int foldingAlpha;
/**
* 展開 狀態的 顏色
*/
private int unFoldingAlpha;
private ObjectAnimator foldingColorObjectAnimator;
private ObjectAnimator unFoldingColorObjectAnimator;
/**
* 不讓 折疊
*/
private boolean isOnShowCannotFold;
public SearchLayout(Context context) {
super(context);
initView(context, null);
}
public SearchLayout(Context context, AttributeSet attrs) {
super(context, attrs);
initView(context, attrs);
}
private void initView(Context context, AttributeSet attrs) {
foldingAlpha = 255;
unFoldingAlpha = 200;
foldingDuration = 500;
unFoldingDuration = 500;
runnerViewWidth = -1;
runnerViewHeight = -1;
floatEnum = FloatEnum.FOLDED;
View childView = LayoutInflater.from(context).inflate(R.layout.layout_search, this, false);
runnerView = childView.findViewById(R.id.search_runner);
runnerDrawable = (GradientDrawable) runnerView.getBackground();
addView(childView);
setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
}
/**
* 開始 展開
*
* @param duration
*/
@Override
public void startUnFolding(int duration) {
if (duration <= 0) {
floatEnum = FloatEnum.UNFOLDED;
setRunnerViewWidth(runnerViewWidth);
return;
}
floatEnum = FloatEnum.FOLDED_2_UNFOLDED;
unFoldingAnimatorSet = (unFoldingAnimatorSet == null) ? new AnimatorSet() : unFoldingAnimatorSet;
unFoldingColorObjectAnimator = ObjectAnimator.ofInt(this, "runnerViewColor", foldingAlpha, unFoldingAlpha);
if (unFoldingColorObjectAnimator == null) {
}
if (unFoldingXObjectAnimator == null) {
unFoldingXObjectAnimator = ObjectAnimator.ofInt(this, "runnerViewWidth", runnerViewHeight, runnerViewWidth);
}
unFoldingAnimatorSet.addListener(new SimpleAnimatorListener() {
@Override
public void onAnimationEnd(Animator animation) {
floatEnum = FloatEnum.UNFOLDED;
}
});
unFoldingAnimatorSet.play(unFoldingXObjectAnimator).before(unFoldingColorObjectAnimator);
unFoldingAnimatorSet.setDuration(duration);
if (!unFoldingAnimatorSet.isRunning()) {
unFoldingAnimatorSet.start();
}
}
/**
* 開始 展開
*/
@Override
public void startUnFolding() {
startUnFolding(unFoldingDuration);
}
public boolean isOnShowCannotFold() {
return isOnShowCannotFold;
}
@Override
public void setOnShowCannotFold(boolean onShowCannotFold) {
isOnShowCannotFold = onShowCannotFold;
}
/**
* 開始 折疊
*
* @param duration
*/
@Override
public void startFolding(int duration) {
if (duration <= 0) {
floatEnum = FloatEnum.FOLDED;
setRunnerViewWidth(runnerViewHeight);
return;
}
floatEnum = FloatEnum.UNFOLDED_2_FOLDED;
foldingAnimatorSet = (foldingAnimatorSet == null) ? new AnimatorSet() : foldingAnimatorSet;
foldingColorObjectAnimator = ObjectAnimator.ofInt(this, "runnerViewColor", unFoldingAlpha, foldingAlpha);
if (foldingColorObjectAnimator == null) {
}
if (foldingXObjectAnimator == null) {
//setRunnerViewColor
foldingXObjectAnimator = ObjectAnimator.ofInt(this, "runnerViewWidth", runnerViewWidth, runnerViewHeight);
}
foldingAnimatorSet.addListener(new SimpleAnimatorListener() {
@Override
public void onAnimationEnd(Animator animation) {
floatEnum = FloatEnum.FOLDED;
}
});
foldingAnimatorSet.play(foldingXObjectAnimator).before(foldingColorObjectAnimator);
foldingAnimatorSet.setDuration(duration);
if (!foldingAnimatorSet.isRunning()) {
foldingAnimatorSet.start();
}
}
/**
* 開始 折疊
*/
@Override
public void startFolding() {
startFolding(foldingDuration);
}
/**
* 取消 折疊 動畫
*/
@Override
public void cancelFolding() {
if (foldingAnimatorSet != null && foldingAnimatorSet.isRunning()) {
foldingAnimatorSet.cancel();
}
}
/**
* 取消 展開 動畫
*/
@Override
public void cancelUnFolding() {
if (unFoldingAnimatorSet != null && unFoldingAnimatorSet.isRunning()) {
unFoldingAnimatorSet.cancel();
}
}
/**
* 獲取 搜索框的 狀態
*
* @return
*/
@Override
public int getFloatEnum() {
return floatEnum;
}
@Override
public boolean isUnFolded() {
return currRunnerViewWidth!=runnerViewHeight;
}
public void autoFoldedOrUnFolded(){
if(floatEnum == FloatEnum.FOLDED){
startUnFolding();
}else if(floatEnum == FloatEnum.UNFOLDED){
startFolding();
}
}
private void setRunnerViewWidth(int width) {
//LogTrack.e("width = " + width);
currRunnerViewWidth = width;
LayoutParams params = new LayoutParams(width, runnerViewHeight);
runnerView.setLayoutParams(params);
}
private void setRunnerViewColor(int alpha) {
runnerDrawable.setAlpha(alpha);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int measureWidth = measureWidth(0, widthMeasureSpec);
int measureHeight = measureHeight(0, heightMeasureSpec);
if (runnerViewHeight >= 0 || runnerViewWidth >= 0) {
return;
}
for (int i = 0; i < getChildCount() && i < 1; i++) {
View childView = getChildAt(i);
ViewGroup.LayoutParams childViewLayoutParams = childView.getLayoutParams();
int widthSpec = 0;
int heightSpec = 0;
if (childViewLayoutParams.width > 0) {
widthSpec = MeasureSpec.makeMeasureSpec(childViewLayoutParams.width, MeasureSpec.EXACTLY);
} else if (childViewLayoutParams.width == -1) {
widthSpec = MeasureSpec.makeMeasureSpec(measureWidth, MeasureSpec.EXACTLY);
} else if (childViewLayoutParams.width == -2) {
widthSpec = MeasureSpec.makeMeasureSpec(measureWidth, MeasureSpec.AT_MOST);
}
if (childViewLayoutParams.height > 0) {
heightSpec = MeasureSpec.makeMeasureSpec(childViewLayoutParams.height, MeasureSpec.EXACTLY);
} else if (childViewLayoutParams.height == -1) {
heightSpec = MeasureSpec.makeMeasureSpec(measureHeight, MeasureSpec.EXACTLY);
} else if (childViewLayoutParams.height == -2) {
heightSpec = MeasureSpec.makeMeasureSpec(measureWidth, MeasureSpec.AT_MOST);
}
childView.measure(widthSpec, heightSpec);
runnerViewWidth = childView.getMeasuredWidth();
runnerViewHeight = childView.getMeasuredHeight();
}
//LogTrack.i(runnerViewWidth + " " + runnerViewHeight);
//LogTrack.e(measureWidth + " " + measureHeight);
}
/**
* MeasureSpec.EXACTLY是精確尺寸, 50dip或者為 MATCH_PARENT是,
* MeasureSpec.AT_MOST是最大尺寸, WRAP_CONTENT時
* MeasureSpec.UNSPECIFIED是未指定尺寸,這種情況不多,一般都是父控件是AdapterView,
*/
private int measureWidth(int size, int widthMeasureSpec) {
int result = size;
int widthMode = MeasureSpec.getMode(widthMeasureSpec);// 得到模式
int widthSize = MeasureSpec.getSize(widthMeasureSpec);// 得到尺寸
switch (widthMode) {
case MeasureSpec.AT_MOST:
case MeasureSpec.EXACTLY:
result = widthSize;
break;
}
return result;
}
/**
* MeasureSpec.EXACTLY是精確尺寸, 50dip或者為 MATCH_PARENT是,
* MeasureSpec.AT_MOST是最大尺寸, WRAP_CONTENT時
* MeasureSpec.UNSPECIFIED是未指定尺寸,這種情況不多,一般都是父控件是AdapterView,
*/
private int measureHeight(int size, int heightMeasureSpec) {
int result = size;
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
int heightSize = MeasureSpec.getSize(heightMeasureSpec);
switch (heightMode) {
case MeasureSpec.AT_MOST:
case MeasureSpec.EXACTLY:
result = heightSize;
break;
}
return result;
}
}
activity_float_expand_search
Paste_Image.png
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.design.widget.CoordinatorLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.design.widget.AppBarLayout
android:id="@+id/ab_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.design.widget.CollapsingToolbarLayout
android:id="@+id/toolbar_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fitsSystemWindows="true"
app:contentScrim="@color/colorPrimary"
app:layout_scrollFlags="scroll|exitUntilCollapsed"
app:statusBarScrim="#4a90e2">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="48dp"
android:background="@color/colorPrimary"
app:layout_collapseMode="pin"
/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center|top"
android:gravity="center"
android:orientation="vertical"
android:paddingBottom="40dp"
android:paddingTop="190dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Alex"
android:textColor="@android:color/white"
android:textSize="30dp"
android:textStyle="bold"/>
</LinearLayout>
</android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>
<ImageView
android:id="@+id/iv_portrait"
android:layout_width="108dp"
android:layout_height="108dp"
android:layout_gravity="top"
android:layout_marginTop="50dp"
android:background="#009688"
android:elevation="10dp"
android:src="@drawable/logo_alex_cin"
app:layout_behavior="org.alex.behavior.scrollportrait.ScrollPortraitBehavior"
app:sb_dependentViewId="@+id/ab_layout"
app:sb_offsetY="48dp"
app:sb_targetHeight="36dp"
app:sb_targetWidth="36dp"
app:sb_targetX="36dp"
app:sb_targetY="6dp"
/>
<android.support.v4.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<LinearLayout
android:background="#FFFFFF"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:lineSpacingMultiplier="1.5"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:paddingTop="16dp"
android:text="@string/info_1"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:lineSpacingMultiplier="1.5"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:paddingTop="16dp"
android:text="@string/info_1"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:lineSpacingMultiplier="1.5"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:paddingTop="16dp"
android:text="@string/info_1"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:lineSpacingMultiplier="1.5"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:paddingTop="16dp"
android:text="@string/info_1"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:lineSpacingMultiplier="1.5"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:paddingTop="16dp"
android:text="@string/info_1"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:lineSpacingMultiplier="1.5"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:paddingTop="16dp"
android:text="@string/info_1"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:lineSpacingMultiplier="1.5"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:paddingTop="16dp"
android:text="@string/info_1"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:lineSpacingMultiplier="1.5"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:paddingTop="16dp"
android:text="@string/info_1"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:lineSpacingMultiplier="1.5"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:paddingTop="16dp"
android:text="@string/info_1"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:lineSpacingMultiplier="1.5"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:paddingTop="16dp"
android:text="@string/info_1"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:lineSpacingMultiplier="1.5"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:paddingTop="16dp"
android:text="@string/info_1"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:lineSpacingMultiplier="1.5"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:paddingTop="16dp"
android:text="@string/info_1"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:lineSpacingMultiplier="1.5"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:paddingTop="16dp"
android:text="@string/info_1"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:lineSpacingMultiplier="1.5"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:paddingTop="16dp"
android:text="@string/info_1"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:lineSpacingMultiplier="1.5"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:paddingTop="16dp"
android:text="@string/info_1"/>
</LinearLayout>
</android.support.v4.widget.NestedScrollView>
<com.alex.materialdesign.widget.SearchLayout
android:id="@+id/sl"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top|right"
android:layout_marginTop="230dp"
android:layout_marginRight="16dp"
android:layout_marginLeft="16dp"
app:fesb_dependentViewId="@+id/ab_layout"
app:fesb_offsetY="48dp"
app:fesb_targetY="56dp"
app:layout_behavior="org.alex.behavior.floatexpandsearch.FloatExpandSearchBehavior"
/>
</android.support.design.widget.CoordinatorLayout>
</LinearLayout>
來自:http://www.jianshu.com/p/ec2ad90e9db7
本文由用戶 zhouhongid123 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!