coordinatorLayout 的一个小效果
来源:互联网 发布:淘宝直通车退款 编辑:程序博客网 时间:2024/05/16 01:14
Design Support Library中 有个CoordinatorLayout类,效果挺不错的。先看看下面的效果:
布局代码:
<?xml version="1.0" encoding="utf-8"?><android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/main_content" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/white" android:fitsSystemWindows="true"> <android.support.design.widget.AppBarLayout android:id="@+id/appbar" android:layout_width="match_parent" android:layout_height="200.0dp" android:fitsSystemWindows="true" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" app:layout_collapseMode="parallax"> <android.support.design.widget.CollapsingToolbarLayout android:id="@+id/collapsing_toolbar" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" app:contentScrim="?attr/colorPrimary" app:expandedTitleMarginEnd="64dp" app:expandedTitleMarginStart="48dp" app:layout_scrollFlags="scroll|exitUntilCollapsed"> <ImageView android:id="@+id/backdrop" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" android:scaleType="centerCrop" android:src="@drawable/img_text2" app:layout_collapseMode="parallax" /> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" app:layout_collapseMode="pin" app:popupTheme="@style/ThemeOverlay.AppCompat.Light" /> </android.support.design.widget.CollapsingToolbarLayout> </android.support.design.widget.AppBarLayout> <android.support.v4.widget.NestedScrollView android:id="@+id/scrollview" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior"> <LinearLayout android:layout_width="match_parent" android:layout_height="1000.0dp" android:orientation="vertical" android:paddingBottom="10.0dp" android:paddingTop="24dp"> </LinearLayout> </android.support.v4.widget.NestedScrollView> <android.support.design.widget.FloatingActionButton android:id="@+id/fab" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="@dimen/fab_margin" android:src="@android:drawable/ic_dialog_email" app:layout_anchor="@id/appbar" app:layout_anchorGravity="bottom|right|end" /></android.support.design.widget.CoordinatorLayout>看了上面的效果,但是别误会了,我这篇文章要将的小效果是FloatingActionButton渐进渐出的效果,这个控件实现的效果跟NestScrollview中的layout_behavior中的的类同一个原理。都是去实现一个Behavior类来控制控件的效果。当有一个需求要在
FloatingActionButton的位置上放一个更复杂的布局,而不单单是一个FloatingActionButton,例如放其它的一个View。这时我们可以自己写一个behavior。先看看效果:
下面是自定义behavior的代码:
package com.example.arze.apptotest.Untils.AnimUntils;/** * Created by arze on 2016/3/14. */import android.content.Context;import android.os.Build;import android.support.design.widget.AppBarLayout;import android.support.design.widget.CoordinatorLayout;import android.support.v4.view.ViewCompat;import android.support.v4.view.ViewPropertyAnimatorListener;import android.support.v4.view.animation.FastOutSlowInInterpolator;import android.util.AttributeSet;import android.view.View;import android.view.animation.Animation;import android.view.animation.AnimationUtils;import com.example.arze.apptotest.R;/** * Created by arze on 2016/3/14. */public class ViewBehavior extends CoordinatorLayout.Behavior<View> { private boolean isOut = false; private boolean isIn = false; private Animation mAnimIn; private Animation mAnimOut; public ViewBehavior () { super(); } public ViewBehavior(Context context, AttributeSet attrs) { super(context, attrs); mAnimIn = AnimationUtils.loadAnimation(context, R.anim.view_in); mAnimOut = AnimationUtils.loadAnimation(context, R.anim.view_out); } /** * * @param parent coordinatorLayout 父布局 * @param child 跟随变化的view * @param dependency 这个view的改变会引发child的改变 ,当然要返回为true * @return */ public boolean layoutDependsOn(CoordinatorLayout parent, View child, View dependency) { return dependency instanceof AppBarLayout; } /** * 这个函数执行child的变换 * @param parent coordinatorLayout 父布局 * @param child 跟随变化的view * @param dependency 这个view的改变会引发child的改变 * @return */ public boolean onDependentViewChanged(CoordinatorLayout parent, View child, View dependency) { if (Math.abs(dependency.getTop()) > dependency.getHeight() / 2 && View.VISIBLE == child.getVisibility() && !isOut) { animateOut(child); } else if (Math.abs(dependency.getTop()) < dependency.getHeight() / 2 && View.GONE == child.getVisibility() && !isIn) { animateIn(child); } return false; } /** * 出现动画 * @param view */ private void animateIn(final View view) { if (Build.VERSION.SDK_INT >= 14) { ViewCompat.animate(view).scaleX(1.0F).scaleY(1.0F).alpha(1.0F).setInterpolator( new FastOutSlowInInterpolator()).withLayer().setListener(new ViewPropertyAnimatorListener() { @Override public void onAnimationStart(View view) { view.setVisibility(View.VISIBLE); isIn = true; } @Override public void onAnimationEnd(View view) { isIn = false; } @Override public void onAnimationCancel(View view) { } }).start(); } else { mAnimIn.setInterpolator(new FastOutSlowInInterpolator()); mAnimIn.setDuration(200L); mAnimIn.setAnimationListener(new Animation.AnimationListener() { @Override public void onAnimationStart(Animation animation) { view.setVisibility(View.VISIBLE); isIn = true; } @Override public void onAnimationEnd(Animation animation) { isIn = false; } @Override public void onAnimationRepeat(Animation animation) { } }); view.startAnimation(mAnimIn); } } /** *消失动画 * @param view */ private void animateOut(final View view) { if (Build.VERSION.SDK_INT >= 14) { ViewCompat.animate(view).scaleX(0.0F).scaleY(0.0F).alpha(0.0F).setInterpolator( new FastOutSlowInInterpolator()).withLayer().setListener(new ViewPropertyAnimatorListener() { public void onAnimationStart(View view) { isOut = true; } public void onAnimationCancel(View view) { } public void onAnimationEnd(View view) { isOut = false; view.setVisibility(View.GONE); } }).start(); } else { mAnimOut.setInterpolator(new FastOutSlowInInterpolator()); mAnimOut.setDuration(200L); mAnimOut.setAnimationListener(new Animation.AnimationListener() { @Override public void onAnimationStart(Animation animation) { isOut = true; } @Override public void onAnimationEnd(Animation animation) { isOut = false; view.setVisibility(View.GONE); } @Override public void onAnimationRepeat(Animation animation) { } }); view.startAnimation(mAnimOut); } }}使用方法是在布局文件中要跟随变化的view中添加layout_behavior = ViewBehavior的路径名 ,最终由CoordinatorLayout用过反射来实现类的实例化。当然这里只是简单的实现了behavior,因为Behavior这个抽象类还有很多方法。
用动画控制这个效果不太灵活,动画从开始到结束这个过程是固定的。我们可以通过view.set属性来控制view的变化。需要一个dependency 这个view的变化细节,比如定义一个float 类型来表示dependency 在一定区间内的变化率。用这个变化率来实现view的属性变化。
1 0
- coordinatorLayout 的一个小效果
- CoordinatorLayout的一个例子
- CoordinatorLayout的一个简单使用
- CoordinatorLayout实现的一个小玩意儿
- CoordinatorLayout.Behavior自定义效果的实现
- CoordinatorLayout:CollapsingToolbarLayout折叠效果的布局容器
- 自定义 LinearLayout 实现类似 CoordinatorLayout 的效果
- CoordinatorLayout实现view的联动效果
- CoordinatorLayout实现优雅的炫酷效果
- jquery 做一个小的倒计时效果
- <TextView>实现一个有趣的小效果
- 一个已经废弃的小效果title
- 自己写类似coordinatorlayout的实现效果,解决一些coordinatorlayout不能满足的要求
- CoordinatorLayout 实际应用效果
- Material Design实现之 CoordinatorLayout的滚动效果
- CoordinatorLayout初体验以及标题栏下方图片的回弹效果
- android中CoordinatorLayout结合TollBar自定义View的使用效果
- 使用CoordinatorLayout打造各种炫酷的效果
- 机器学习:文本挖掘之特征选择
- HDU.1027 Ignatius and the Princess II【全排列:关于next_permutation问题】(3.14)
- [BZOJ 2176]Strange string
- 顺时针旋转矩阵
- vector--resize
- coordinatorLayout 的一个小效果
- 浅析 C++ 调用 Python 模块
- rucheng_hjp_tables
- D11
- GNU ERE正则表达式实现方案
- HDU 2120 Ice_cream's world I
- JAVA学习总结(1)
- hibernate中cascade和inverse区别
- 使用JAVA SACLA 开发 Spark SQL DataFrame IMF内部课程