这篇文章中,介绍到的其它组件有TextInputLayout,FloatingActionButton,Snackbar,CoordinatorLayout。
该专题的其它文章:
『Material Design入门学习笔记』前言
『Material Design入门学习笔记』动画(含demo)
『Material Design 入门学习笔记』主题与 AppCompatActivity(附 demo)
『Material Design入门学习笔记』RecyclerView与CardView(附demo)
demo下载javascript
这一篇讲的组件有些多,因此要从头提及,头是哪呢?就是布局文件,布局文件的头是哪呢?就是CoordinatorLayout。
CoordinatorLayout被誉为超级FrameLayout。
主要是实现两个功能:java
compile 'com.android.support:design:22.2.1'复制代码
app:layout_scrollFlags
有一下几种设置:scroll
:设为scroll的View会跟随滚动事件一块儿发生移动, 全部想滚动出屏幕的view都须要设置这个flag,没有设置这个flag的view将被固定在屏幕顶部。enterAlways
:设为enterAlways的View,当ScrollView往下滚动时,该View会直接往下滚动,而不用考虑ScrollView是否在滚动,这个flag让任意向下的滚动都会致使该view变为可见,如启用快速“返回模式”。exitUntilCollapsed
:值设为exitUntilCollapsed的View,当这个View要往上逐渐“消逝”时,会一直往上滑动,直到剩下的的高度达到它的最小高度后,再响应ScrollView的内部滑动事件。简而言之,滚动退出屏幕,最后折叠在顶端。enterAlwaysCollapsed
:是enterAlways的附加选项,通常跟enterAlways一块儿使用,它是指,View在往下“出现”的时候,首先是enterAlways效果,当View的高度达到最小高度时(注意你的view须要设置minHeight属性),View就暂时不去往下滚动,直到ScrollView滑动到顶部再也不滑动时,View再继续往下滑动,直到滑到View的顶部结束。app:contentScrim
这个参数可让CollapsingToolbarLayout在收缩的时候,背景图片消失的时候,指定一个颜色。app:collapsedTitleGravity
指定折叠状态的标题如何放置,可选值:top、bottom等app:collapsedTitleTextAppearance
指定折叠状态标题文字的样貌app:expandedTitleTextAppearance
指定展开状态标题文字的样貌app:expandedTitleGravity
展开状态的标题如何放置app:titleEnabled
指定是否显示标题文本app:toolbarId
指定与之关联的ToolBar,若是未指定则默认使用第一个被发现的ToolBar子Viewapp:expandedTitleMarginStart
指定展开状态标题距离开始位置的高度app:expandedTitleMarginBottom
指定展开状态标题距离底部的距离app:expandedTitleMarginEnd
指定展开状态标题距离结束位置的高度app:layout_collapseParallaxMultiplier
="0.7"设置视差的系数,介于0.0-1.0之间。app:layout_collapseMode
“pin”:固定模式,在折叠的时候最后固定在顶端;“parallax”:视差模式,在折叠的时候会有个视差折叠的效果。app:layout_anchor``app:layout_anchorGravity
两个属性连同一块儿,与某一个AppBarLayout控件相关联,肯定位置。<?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:fitsSystemWindows="true">
<android.support.design.widget.AppBarLayout
android:id="@+id/appbar"
android:layout_width="match_parent"
android:layout_height="256dp"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
android:fitsSystemWindows="true">
<android.support.design.widget.CollapsingToolbarLayout
android:id="@+id/collapsing_toolbar"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_scrollFlags="scroll|exitUntilCollapsed"
android:fitsSystemWindows="true"
app:contentScrim="?attr/colorPrimary"
app:expandedTitleMarginStart="48dp"
app:expandedTitleMarginEnd="64dp">
<ImageView
android:id="@+id/backdrop"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop"
android:fitsSystemWindows="true"
android:src="@drawable/logo"
app:layout_collapseMode="parallax"
/>
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
app:layout_collapseMode="pin" />
</android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>
<android.support.design.widget.TextInputLayout
android:id="@+id/inputwrapper"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<EditText
android:id="@+id/input"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="输入内容"/>
</android.support.design.widget.TextInputLayout>
<android.support.design.widget.FloatingActionButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_anchor="@id/appbar"
app:layout_anchorGravity="bottom|right|end"
android:src="@mipmap/ic_launcher"
android:id="@+id/btn_ok"
/>
</android.support.design.widget.CoordinatorLayout>复制代码
在该布局文件中使用了Toolbar,关于它的相关属性,能够参考我以前的文章,这里再也不重复介绍。
TextInputLayout有人会问为何TextInputLayout使用app:layout_behavior="@string/appbar_scrolling_view_behavior"
,其实为了适配好位置,最好在外面加一层NestedScrollView,由于涉及到滑动嘛,可是这里暂时不用,由于那是下一篇文章的内容。android
下面贴出相关的代码:git
public class CollapsingActivity extends AppCompatActivity {
private FloatingActionButton okBtn;
private EditText editText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_collapsing);
initToolBar();
TextInputLayout inputWrapper = (TextInputLayout) findViewById(R.id.inputwrapper);
editText = (EditText)findViewById(R.id.input);
okBtn = (FloatingActionButton)findViewById(R.id.btn_ok);
okBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
hideKeyboard();
Snackbar mySnackbar = Snackbar.make(findViewById(R.id.main_content),editText.getText().toString(),Snackbar.LENGTH_SHORT);
mySnackbar.setAction(editText.getText().toString(), new OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(CollapsingActivity.this,"click Snackbar",Toast.LENGTH_LONG).show();
}
});
mySnackbar.show();
}
});
okBtn.setCompatElevation(0);
inputWrapper.setHintAnimationEnabled(true);
inputWrapper.setHint("请输入内容");
}
private void hideKeyboard() {
View view = getCurrentFocus();
if (view != null) {
((InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE)).
hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
}
private void initToolBar(){
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
setTitle("CollapsingActivity");//设置标题
toolbar.setNavigationIcon(R.mipmap.ic_launcher_round);//设置返回键,我这里没有,就有icon代替吧
toolbar.setNavigationOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
finish();
}
});//返回监听
toolbar.setSubtitle("by deep");//设置副标题
}
}复制代码
简单说一下代码的逻辑,在界面上有个输入框,输入内容,点击FloatingActionButton,会将内容作一个Snackbar的展现,这是在底部会有一个Snackbar,Snackbar能够经过setAction
方法设置点击事件,它的第一个参数是按钮显示的文字,第二个参数是点击事件,我这里是点击Snackbar会再弹出一个Toast。
关于Snackbar的初始化,可使用make
方法,这里须要注意它的参数:github
public static abstract class Behavior<V extends View>
,咱们能够根据View随意去实现。layoutDependsOn
用来肯定依赖关系,原文是:
Determine whether the supplied child view has another specific sibling view as a layout dependency.
意思是,这个view有没有兄弟view。app
onDependentViewChanged
ide
Respond to a change in a child's dependent view
当咱们的 dependency 发生改变的时候,这个方法会调用,而咱们在 onDependentViewChanged 方法里根据需求作相应的界面处理便可。
咱们简单写一个FloatingActionButton跟随AppBarLayout移动的例子:
```
public class CustomBehavior extends CoordinatorLayout.Behavior{ 布局
public CustomBehavior() {
}
public CustomBehavior(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean layoutDependsOn(CoordinatorLayout parent, FloatingActionButton child, View dependency) {
return dependency instanceof AppBarLayout;
}
@Override
public boolean onDependentViewChanged(CoordinatorLayout parent, FloatingActionButton child, View dependency) {
float translationY = Math.abs(dependency.getTop());
Log.e("xxxxxx ","translationY="+translationY);
child.setY(800-translationY);
return true;
}复制代码
}post
而后设置到布局文件的对应位置:复制代码
```
自定义Behavior的方式就介绍到这。
原本想在文章中插图,可是因为动图过大,上传老是失败,因此,仍是请感兴趣的朋友运行demo看一下效果便可。后面的文章仍是对本文的延伸,增添了一些新的组件,敬请关注。
有问题能够给我留言,或者关注个人公众号留言。