Android开发--折叠式标题
来源:互联网 发布:末代沙皇公主知乎 编辑:程序博客网 时间:2024/04/30 13:30
要实现可折叠式的标题栏可以借助CollapsingToolbarLayout来实现。CollapsingToolbarLayout是不能单独存在的,只能作为AppBarLayout的直接子布局来使用,而AppBarLayout又必须是CoordinatorLayout的子布局。
在正文部分,也就是点击进入到文章正文。我们这里做成折叠式的模式,搜先我们需要定义正文的头部和正文的内容
头部如下操作
<?xml version="1.0" encoding="utf-8"?><android.support.design.widget.CoordinatorLayoutxmlns: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:layout_width="match_parent"android:layout_height="match_parent"tools:context="website.dengta.drawerlayout.FruitActivity"> <android.support.design.widget.AppBarLayout android:id="@+id/appBar" android:layout_width="match_parent" android:layout_height="250dp"> <android.support.design.widget.CollapsingToolbarLayout android:id="@+id/collapsing_toolbar" android:layout_width="match_parent" android:layout_height="match_parent" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" app:contentScrim="?attr/colorPrimary" app:layout_scrollFlags="scroll|exitUntilCollapsed" <ImageView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/fruit_image_view" android:scaleType="centerCrop" app:layout_collapseMode="parallax" /> <android.support.v7.widget.Toolbar android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" app:layout_collapseMode="pin"> </android.support.v7.widget.Toolbar> </android.support.design.widget.CollapsingToolbarLayout> </android.support.design.widget.AppBarLayout></android.support.design.widget.CoordinatorLayout>
app:contentScrim 属性用于指定CollapsingToolbarLayout 在趋于折叠状态以及折叠之后的背泉色,其实CollapsingToolbarLayout在折叠之后就是一个普通的Toolbar, 那么背景色肯定应该是colorPrimary 了,具体的效果我们待会儿就能看到。app:layout— scrol lFlags 属性我们也是见过的,只不过之前是给Toolbar 指定的,现在也移到外面来了。其中, scroll 表示CollapsingToolbarLayout 会随着水果内容详情的滚动一起滚动, exitUntilCol lapsed 表示当CollapsingToolbarLayout 随着滚动完成折叠之后就保留在界面上,不再移出屏幕。
效果如图所示
这里定义的大多数属性我们都是见过的,就不再解释了,只有一个app:layout_collapseMode 比较陌生。它用于指定当前控件在CollapsingToolbarLayout 折叠过程中的折叠模式,其中Toolbar 指定成pin, 表示在折叠的过程中位置始终保持不变, ImageView 指定成parallax, 表示会在折叠的过程中产生一定的错位偏移,这种模式的视觉效果会非常好。
内容部分操作如下
继续操作上面的xml布局文件
<!--正文内容部分--><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:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content"> <android.support.v7.widget.CardView android:layout_marginBottom="15dp" android:layout_marginLeft="15dp" android:layout_marginRight="15dp" android:layout_marginTop="35dp" app:cardCornerRadius="4dp" android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:id="@+id/fruit_content_text" android:layout_margin="10dp" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </android.support.v7.widget.CardView> </LinearLayout></android.support.v4.widget.NestedScrollView>
NestedScrollView 在此基础之上还增加了嵌套响应滚动事件的功能。由于CoordinatorLayout 本身已经可以响应滚动事件了,因此我们在它的内部就需要使用NestedScrollView 或RecyclerView这样的布局。另外,这里还通过app:layout—behavior 属性指定了一个布局行为,这和之前在Recycler View 中的用法是一模一样的。
在文章正文中加入一个悬浮的评论按钮
<!--悬浮的评论按钮--><android.support.design.widget.FloatingActionButton android:layout_margin="16dp" android:src="@drawable/comments" app:layout_anchor="@id/appBar" app:layout_anchorGravity="bottom|end" android:layout_width="wrap_content" android:layout_height="wrap_content" />
FloatingActionButton 中使用app:layout_anchor 属性指定了一个描点,我们将描点
设置为AppBarLayout, 这样悬浮按钮就会出现在水果标题栏的区域内,接着又使用app:layout_anchorGravity 属性将悬浮按钮定位在标题栏区域的右下角。
效果如图所示
代码如下
FruitActivity.java
package website.dengta.drawerlayout;import android.content.Intent;import android.support.design.widget.CollapsingToolbarLayout;import android.support.v7.app.ActionBar;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.support.v7.widget.Toolbar;import android.view.MenuItem;import android.widget.ImageView;import android.widget.TextView;import com.bumptech.glide.Glide;public class FruitActivity extends AppCompatActivity {public static final String FRUIT_NAME = "fruit_name";public static final String FRUIT_IMAGE_ID = "fruit_image_id";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_fruit);Intent intent = getIntent();String fruitName = intent.getStringExtra(FRUIT_NAME);int fruitImageId = intent.getIntExtra(FRUIT_IMAGE_ID,0);Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);CollapsingToolbarLayout collapsingToolbar = (CollapsingToolbarLayout) findViewById(R.id.collapsing_toolbar);ImageView fruitImageView = (ImageView) findViewById(R.id.fruit_image_view);TextView fruitContentText = (TextView) findViewById(R.id.fruit_content_text);setSupportActionBar(toolbar);ActionBar actionBar = getSupportActionBar();if (actionBar != null) {actionBar.setDisplayHomeAsUpEnabled(true);}collapsingToolbar.setTitle(fruitName);Glide.with(this).load(fruitImageId).into(fruitImageView);String fruitContent = generateFruitContent(fruitName);fruitContentText.setText(fruitContent);}private String generateFruitContent(String fruitName) {StringBuilder fruitContent = new StringBuilder();for (int i = 0; i < 500; i++) {fruitContent.append(fruitName);}return fruitContent.toString();}@Overridepublic boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: finish(); return true; } return super.onOptionsItemSelected(item);}}
通过Intent 获取到传入的水果名和水果图片的资源id, 然后通过findViewByid() 方法拿到刚才在布局文件中定义的各个控件的实例。接着就是使用了Toolbar 的标准用法,将它作为ActionBar 显示,并启用HomeAsUp 按钮。由于HomeAsUp 按钮的默认图标就是一个返回箭头,这正是我们所期望的,因此就不用再额外设置别的图标了。
调用CollapsingToolbarLayout 的setTitle() 方法将水果名设置成当前界面的标题,然后使用Glide 加载传入的水果图片,并设置到标题栏的ImageView 上面。接着需要填充水果的内容详情,由于这只是一个示例程序,并不需要什么真实的数据,所以我使用了一个enerateFruitContent ()方法将水果名循环拼接500 次,从而生成了一个比较长的字符串,将它设置到了TextView 上面。
在onOptionsitemSelected() 方法中处理了HomeAsUp 按钮的点击事件,当点击了这个按钮时,就调用finish ()方法关闭当前的活动,从而返回上一个活动。
处理Recycler View的点击事件,让其可以进入到FruitActivity的布局中
@Overridepublic ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if (mContext==null){ mContext = parent.getContext(); } View view = LayoutInflater.from(mContext).inflate(R.layout.fruit_item,parent,false); //处理点击事件 final ViewHolder holder = new ViewHolder(view); holder.cardView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int position = holder.getAdapterPosition(); Fruit fruit = mFruitList.get(position); Intent intent = new Intent(mContext,FruitActivity.class); intent.putExtra(FruitActivity.FRUIT_NAME,fruit.getName()); intent.putExtra(FruitActivity.FRUIT_IMAGE_ID,fruit.getImageId()); mContext.startActivity(intent); } }); return new ViewHolder(view);}
充分利用系统状态栏空间
想要让背景图能够和系统状态栏融合,需要借助android:fitsSystemWindows 这个属性来实现。在CoordinatorLayout 、AppBarLayout 、CollapsingToolbarLayout 这种嵌套结构的布局中,将控件的android:fitsSystemWindows 属性指定成true, 就表示该控件会出现在系统状态栏里。对应到我们的程序,那就是水果标题栏中的ImageView 应该设置这个属性了。不过只给Image View 设置这个属性是没有用的,我们必须将ImageView 布局结构中的所有父布局都设置上这个属性才可以。
将android:fitsSystemWindows 属性都设置好了还是没有用的,因为还必须在程序的主题中将状态栏颜色指定成透明色才行。指定成透明色的方法很简单,在主题中将
android:statusBarColor 属性的值指定成@android:color/transparent 就可以了。
- Android开发--折叠式标题
- Android开发笔记(一百)折叠式列表
- android界面设计语言Material Design---可折叠式标题栏
- 【Android 开发教程】隐藏Activity的标题
- 【Android开发】Toolbar与标题居中
- 文章标题:Android应用开发特色
- sql server 2012 报表开发(2) reporting service 中制作分组折叠式报表
- Android 标题
- Android 标题
- android 在开发WebView时,去掉网页的标题并设置成自定义的标题
- android 在开发WebView时,去掉网页的标题并设置成自定义的标题
- 【Android开发】范例1-显示在标题上的进度条
- 开发android中,去掉标题,禁止Activity旋转
- Android开发中标题下平滑的下划线
- Android开发: 去除当前项目所有activity页面标题
- 创建折叠式导航菜单
- JS 实现折叠式菜单
- 折叠式侧滑菜单
- mybatis遇到的mapper.xml的链表是容易出的错
- centos7 编译 nginx
- APP UI设计的全局思维
- 当你的unity项目一直报错的时候
- i2c驱动--代码
- Android开发--折叠式标题
- SES输入文件中的数字正则匹配
- 面试准备
- QT 下调用python自定义模块
- INSERT 报 不是Group by 表达式
- vue全家桶
- CSS——浮动的清除
- 有关二叉树的一些问题集合(一)
- dispatch