import android.animation.Animator;
import android.content.Context;
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.ViewPropertyAnimator;
import android.view.animation.Interpolator;
/**
* CoordinatorLayout Behavior for a quick return footer
*
* When a nested ScrollView is scrolled down, the quick return view will disappear.
* When the ScrollView is scrolled back up, the quick return view will reappear.
*
* @author bherbst
*/
@SuppressWarnings("unused")
public class QuickReturnFooterBehavior extends CoordinatorLayout.Behavior<View> {
private static final Interpolator INTERPOLATOR = new FastOutSlowInInterpolator();
private int mDySinceDirectionChange;
public QuickReturnFooterBehavior(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, View child, View directTargetChild, View target, int nestedScrollAxes) {
return (nestedScrollAxes & ViewCompat.SCROLL_AXIS_VERTICAL) != 0;
}
@Override
public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, View child, View target, int dx, int dy, int[] consumed) {
if (dy > 0 && mDySinceDirectionChange < 0
|| dy < 0 && mDySinceDirectionChange > 0) {
// We detected a direction change- cancel existing animations and reset our cumulative delta Y
child.animate().cancel();
mDySinceDirectionChange = 0;
}
mDySinceDirectionChange += dy;
if (mDySinceDirectionChange > child.getHeight() && child.getVisibility() == View.VISIBLE) {
hide(child);
} else if (mDySinceDirectionChange < 0 && child.getVisibility() == View.GONE) {
show(child);
}
}
/**
* Hide the quick return view.
*
* Animates hiding the view, with the view sliding down and out of the screen.
* After the view has disappeared, its visibility will change to GONE.
*
* @param view The quick return view
*/
private void hide(final View view) {
ViewPropertyAnimator animator = view.animate()
.translationY(view.getHeight())
.setInterpolator(INTERPOLATOR)
.setDuration(200);
animator.setListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animator) {}
@Override
public void onAnimationEnd(Animator animator) {
// Prevent drawing the View after it is gone
view.setVisibility(View.GONE);
}
@Override
public void onAnimationCancel(Animator animator) {
// Canceling a hide should show the view
show(view);
}
@Override
public void onAnimationRepeat(Animator animator) {}
});
animator.start();
}
/**
* Show the quick return view.
*
* Animates showing the view, with the view sliding up from the bottom of the screen.
* After the view has reappeared, its visibility will change to VISIBLE.
*
* @param view The quick return view
*/
private void show(final View view) {
ViewPropertyAnimator animator = view.animate()
.translationY(0)
.setInterpolator(INTERPOLATOR)
.setDuration(200);
animator.setListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animator) {
view.setVisibility(View.VISIBLE);
}
@Override
public void onAnimationEnd(Animator animator) {}
@Override
public void onAnimationCancel(Animator animator) {
// Canceling a show should hide the view
hide(view);
}
@Override
public void onAnimationRepeat(Animator animator) {}
});
animator.start();
}
}
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerview"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
app:layout_behavior="com.mb.widget.QuickReturnFooterBehavior"
android:background="@color/quickreturn_background"
android:gravity="center"
android:padding="16dp"
android:text="QuickReturn Footer"
android:textAppearance="@style/TextAppearance.AppCompat.Headline"
android:textColor="@android:color/white" />
</android.support.design.widget.CoordinatorLayout>
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerview);
recyclerView.setAdapter(new SimpleStringRecyclerViewAdapter(this,Arrays.asList(Cheeses.sCheeseStrings)));
recyclerView.setLayoutManager(new LinearLayoutManager(this));
}
}
SwipeDismissBehavior用法及实现原理
http://www.open-open.com/lib/view/open1446609550545.html
https://github.com/hugeterry/CoordinatorTabLayout
- 大小: 38.7 KB
分享到:
相关推荐
`Behavior`的概念是`CoordinatorLayout`的核心特性,它允许开发者自定义特定视图的行为,尤其是当这个视图和其他视图或者`ScrollView`、`NestedScrollView`等可滚动视图一起使用时。`Behavior`可以监听并响应各种...
`CoordinatorLayout` 的核心功能在于它能够协调其子视图之间的行为,通过自定义`Behavior`,开发者可以实现高度定制化的布局动画和交互。这篇博客的文章标题是“CoordinatorLayout自定义Behavior”,显然,它将引导...
CoordinatorLayout 是 Google 在 Design Support 包中提供的一个十分强大的布局视图,它允许开发者通过制定 Behavior 从而实现各种复杂的 UI 效果。工程导入可以直接运行。。。
本示例将详细介绍`CoordinatorLayout`与`Behavior`的实际使用,帮助开发者理解和掌握这一强大的布局组件。 `CoordinatorLayout`是一个顶级布局容器,它可以智能地协调其子视图的行为。它最显著的特点就是能够处理子...
该项目是为了练习-> 使用CoordinatorLayout.Behavior 实现页面复杂联动效果 代码模仿实现美团商家详情界面内容联动 开发使用知识点顺带涉及到: Scroller+Handler 实现View自动滑动 View属性动画 触摸事件分发机制 ...
3. **设置Behavior**:在XML布局中,我们可以使用`app:layout_behavior` 属性将自定义的`Behavior` 应用到相应的视图上。例如,对于`Toolbar`,我们可以这样设置: ```xml android:id="@+id/toolbar" android:...
该项目是为了练习-> 使用CoordinatorLayout.Behavior 实现页面复杂联动效果 代码模仿实现美团商家详情界面内容联动 download apk 开发使用知识点顺带涉及到: Scroller Handler 实现View自动滑动 View属性动画 ...
上次简单的说了一下CoordinatorLayout的基本用法(android特性之CoordinatorLayout用法探析实例)。其中CoordinatorLayout给我们提供了一种新的事件的处理方式,Behavior。还记得那一串字符串吗? app:layout_...
3. **设置Behavior**:将 Behavior 设置给需要响应滚动的 View,例如使用 `app:layout_behavior` 属性在 XML 中声明,或者在代码中使用 `CoordinatorLayout.LayoutParams` 设置。 4. **动画平滑性**:为了保证用户...
- 要将自定义Behavior应用到视图上,需要在布局XML中使用 `android.behavior` 属性指定Behavior类。例如,`android:behavior="@string/custom_behavior"`,其中 `custom_behavior` 是在 strings.xml 文件中定义的...
CoordinatorLayout.Behavior的示例程序。 惊人的行为 这是CoordinatorLayout行为的示例。 它包含具有自定义行为的可拖动TextView。 自定义行为将使对象无论在何处都遵循可拖动的“ TextView”。 屏幕截图 每个人都在...
理解和熟练使用`CoordinatorLayout`及其`Behavior`机制,能够极大地提升应用的用户体验和设计感。在实际项目中,开发者可以根据需求灵活地组合和定制这些组件,创建出富有动态和创新的界面效果。
本篇将详细介绍`CoordinatorLayout`的基本使用以及如何利用它来实现通讯录详情效果。 `CoordinatorLayout`的核心特性在于协调行为(Behavior),它可以感知其子视图之间的交互,使得布局能够根据用户操作或其他视图...
通过实现`CoordinatorLayout.Behavior`接口,我们可以自定义一个行为对象,定义视图在特定事件(如滑动)下的响应方式。例如,当NestedScrollView滚动时,可以设置FloatingActionButton跟随滚动隐藏或显示。 2. **...
本篇文章将全面介绍`CoordinatorLayout`的使用方法和核心特性。 ### CoordinatorLayout简介 `CoordinatorLayout`是Android支持库中的一个`FrameLayout`的子类,它扩展了布局的功能,特别适合用于创建具有复杂依赖...
2. 自定义`Behavior`:如果项目中包含了自定义的`Behavior`类,那么开发者可能已经扩展了`CoordinatorLayout.Behavior`,以便为特定的视图添加自定义的滚动行为。 3. 主题和样式:可能包含了自定义的主题和样式资源...
自定义Behavior Demo,可以结合任何View使用,可以自定义动画等!详解请移步严振杰的博客:http://blog.csdn.net/yanzhenjie1003/article/details/52205665