- snapMargins
不知道
- exitUntilCollapsed
上拉的时候,这个View也会跟着滑动,直到变成折叠后的模样
这些属性可以直接在xml中使用,也可在在代码中通过 setScrollFlags(int Flag)
来加。
了解之后,有没有发现这个属性很嗨吊。我们平时使用的App都会有这种交互。
我们来在AppLayout里面加一张图片。然后改变一下属性:
…
<android.support.design.widget.AppBarLayout
android:id=“@+id/appbar”
android:layout_width=“match_parent”
android:layout_height=“wrap_content”
android:theme=“@style/ThemeOverlay.AppCompat.Dark.ActionBar”>
<ImageView
android:layout_width=“match_parent”
android:layout_height=“200dp”
android:scaleType=“fitXY”
android:src=“@drawable/ic_jojo3”
app:layout_scrollFlags=“scroll|enterAlways” />
…
效果如下
发现这个没有折叠效果,还是有点不是很好,那么我们来看下和它有关的CollapsingToolbarLayout
它是一个包装工具栏的Layout,它可以做到折叠标题、内容装饰等功能。
它通常做为AppBarLayout的子View,为其子View设置了一个关键属性: collaspseMode
,它有这么几个值
- pin
固定视图,也就是说,不论这么滑动,它都一定在,它就是折叠的样子
- parallax
这滑动的时候,这个view会出现 视觉特差的情况,什么是视觉特差?
就是 出现的时候是渐渐出来, 消失的时候渐渐消失的,不像刚刚那样的图片消失的很僵硬。
- none
不会显示出折叠效果。
这里直接拿来用:
<android.support.design.widget.AppBarLayout
android:id=“@+id/appbar”
android:layout_width=“match_parent”
android:layout_height=“wrap_content”
android:theme=“@style/ThemeOverlay.AppCompat.Dark.ActionBar”>
<android.support.design.widget.CollapsingToolbarLayout
android:layout_width=“match_parent”
android:layout_height=“200dp”
android:fitsSystemWindows=“true”
app:contentScrim=“?attr/colorPrimary”
app:expandedTitleMarginEnd=“64dp”
app:expandedTitleMarginStart=“48dp”
app:layout_scrollFlags=“scroll|exitUntilCollapsed”>
<ImageView
android:layout_width=“match_parent”
android:layout_height=“match_parent”
android:scaleType=“centerCrop”
android:src=“@drawable/ic_jojo3”
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”>
<TextView
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:text=“阿强”
android:textColor=“#ffffff”
android:textSize=“20sp” />
</android.support.v7.widget.Toolbar>
</android.support.design.widget.CollapsingToolbarLayout>
<RelativeLayout
android:layout_width=“match_parent”
android:layout_height=“?attr/actionBarSize”
android:background=“?attr/colorPrimary”
app:popupTheme=“@style/ThemeOverlay.AppCompat.Light”>
<TextView
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:layout_centerVertical=“true”
android:layout_marginStart=“20dp”
android:text=“我是 盖尔·里卡·德沃”
android:textColor=“#ffffff”
android:textSize=“15sp” />
</android.support.design.widget.AppBarLayout>
效果如下:
图片的消失就没有那么的僵硬,阿强所在的ToolBarLayout因为是pin的关系,已经被固定在了上面。
其实看到这里,大家都肯定已经明白了,我这个效果,不就是模仿朋友圈的交互效果吗?
我们在RecyclerView定义了它的behavior
,这个Behavior其实也很关键,它是 CoordinatorLayout的精髓所在,所以学习CoordinatorLayout,不自定义一个behavior,那等于白学。
我们给除了 AppBarLayout的控件添加了app:layout_behavior="@string/appbar_scrolling_view_behavior"
当然除了这个值还有别的值,但这个用的比较多,和AppBarLayout配合的也是最好的。它的效果就是配合AppBarLayout来滑动。
因为Behavior是一个抽象类,所以我们可以自定义Behavior
来达成我们想要的交互效果,我们来看下其样子(必须是CoordinatorLayout的Behavior)因为有很多控件的包都有自己的Behavior - -!!
public abstract static class Behavior {
…
}
它的泛型是继承自View的控件,也就是说只要是控件,都能实现这些效果。我们来看下可以选择重写的方法:
onInterceptTouchEvent()
是否拦截触摸事件
onTouchEvent()
处理触摸事件
layoutDependsOn()
确定使用Behavior的View要依赖的View类型
onDependentViewChanged()
当被依赖的View状态改变时的回调
onDependentViewRemoved()
当被依赖的View被移除时回调
onMeasureChild()
测量使用Behavior的View尺寸
onLayoutChild
确定使用Behavior的View的位置
onStartNestedScroll()
滑动开始,确定Behavior是否要监听此次事件
onStopNestedScroll()
嵌套滑动结束
onNestedScroll()
滑动进行中,要监听的子 View的滑动事件已经被消费
onNestedPreScroll()
嵌套滑动进行中,要监听的子 View将要滑动,滑动事件即将被消费(但最终被谁消费,可以通过代码控制)
onNestedFling()
要监听的子 View在快速滑动中
onNestedPreFling()
要监听的子View即将快速滑动
学习了这些,我们来自定义一个Behavior
通常Behavior分为两种情况。
-
某个View依赖另一个View,监听器位置、尺寸等状态的变化
-
某个View监听CoordinatorLayout内实现了NestedScrollingChild接口的子View的滑动状态变化
我们来实现一个:
public class MyBehavior extends CoordinatorLayout.Behavior {
// 列表顶部和title底部重合时,列表的滑动距离。
private float deltaY;
public MyBehavior() {
}
public MyBehavior(Context context, AttributeSet attrs) {
super(context, attrs);
}
//是否使用在Recycler上
@Override
public boolean layoutDependsOn(@NonNull CoordinatorLayout parent, @NonNull View child, @NonNull View dependency) {
return dependency instanceof RecyclerView;
}
@Override
public boolean onDependentViewChanged(@NonNull CoordinatorLayout parent, @NonNull View child, @NonNull View dependency) {
if (deltaY == 0) {
deltaY = dependency.getY() - child.getHeight();
}
float dy = dependency.getY() - child.getHeight();
dy = dy < 0 ? 0 : dy;
float y = -(dy / deltaY) * child.getHeight();
float alpha = 1 - (dy / deltaY);
child.setAlpha(alpha);
child.setTranslationY(y);
return true;
}
}
上面的 layoutDependsOn和 onDependentViewChanged 是一定要重写的。
child是我们要使用Behavior的View,dependency是依赖的View,我们把以来的View设置成RcyclerView。
然后在我们滑动RecyclerView的时候,来让Child也移动,xml如下:
<?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”
xmlns:tools=“http://schemas.android.com/tools”
android:id=“@+id/main_content”
android:layout_width=“match_parent”
android:layout_height=“match_parent”
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)
Android核心知识点
面试成功其实是必然的,因为我做足了充分的准备工作,包括刷题啊,看一些Android核心的知识点,看一些面试的博客吸取大家面试的一些经验。
下面这份PDF是我翻阅了差不多3个月左右一些Android大博主的博客从他们那里取其精华去其糟泊所整理出来的一些Android的核心知识点,全部都是精华中的精华,我能面试到现在2-2资深开发人员跟我整理的这本Android核心知识点有密不可分的关系,在这里本着共赢的心态分享给各位朋友。
不管是Android基础还是Java基础以及常见的数据结构,这些是无原则地必须要熟练掌握的,尤其是非计算机专业的同学,面试官一上来肯定是问你基础,要是基础表现不好很容易被扣上基础不扎实的帽子,常见的就那些,只要你平时认真思考过基本上面试是没太大问题的。
最后为了帮助大家深刻理解Android相关知识点的原理以及面试相关知识,这里放上我搜集整理的2019-2021BAT 面试真题解析,我把大厂面试中常被问到的技术点整理成了PDF,包知识脉络 + 诸多细节。
节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!
这本Android核心知识点有密不可分的关系,在这里本着共赢的心态分享给各位朋友。
[外链图片转存中…(img-klhkVJi4-1711960246380)]
不管是Android基础还是Java基础以及常见的数据结构,这些是无原则地必须要熟练掌握的,尤其是非计算机专业的同学,面试官一上来肯定是问你基础,要是基础表现不好很容易被扣上基础不扎实的帽子,常见的就那些,只要你平时认真思考过基本上面试是没太大问题的。
最后为了帮助大家深刻理解Android相关知识点的原理以及面试相关知识,这里放上我搜集整理的2019-2021BAT 面试真题解析,我把大厂面试中常被问到的技术点整理成了PDF,包知识脉络 + 诸多细节。
节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。