android仿抽屉动画效果,Android之仿哔哩哔哩客户端首页+抽屉式导航
本文使用Toobar+DrawerLayout+NavigationView仿哔哩哔哩客户端首页+抽屉式导航,同时实现了沉浸式状态栏的效果。
一、效果图
图片及图标色彩等没有刻意模仿,结构相同。
上图可以看出实现了沉浸式状态栏。
二、页面布局
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white"
android:fitsSystemWindows="true">
android:layout_width="match_parent"
android:layout_height="match_parent">
android:id="@+id/navigation"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
android:background="@color/white"
app:headerLayout="@layout/view_nav"
app:menu="@menu/menu_nav"/>
在这里可以看到,最外层布局是DrawerLayout,里面嵌套了两个布局,一层是FrameLayout,其中通过include进来的主界面内容,第二层是侧滑的内容,即NavigationView。
主界面布局
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:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".home.MainActivity">
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/Theme.AppCompat.Light"
app:elevation="0dp">
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@color/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay"/>
android:id="@+id/tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:tabBackground="@color/colorPrimary"
app:tabIndicatorColor="@color/white">
android:id="@+id/vp_moudle"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
主界面布局先是CoordinatorLayout嵌套了AppBarLayout以及ViewPager。AppBarLayout中嵌套了ToolBar以及TabLayout。在Activity中让ViewPager和TabLayout关联,实现ViewPager页面滑动时对应标签的联动。
抽屉界面布局
抽屉界面由NavigationView来实现,主要由两部分来实现,包含导航栏头部,以及菜单栏。
导航栏头部
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="150dp"
android:background="@drawable/nav_header">
android:layout_marginBottom="10dp"
android:layout_marginLeft="20dp"
android:src="@drawable/nav_header_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/iv_user_photo"
android:layout_above="@+id/tv_login"/>
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:textSize="12sp"
android:text="点击头像登录"
android:textColor="@color/white"
android:padding="8dp"
android:layout_marginLeft="20dp"
android:layout_marginBottom="20dp"
android:gravity="center"
android:id="@+id/tv_login"
android:layout_alignParentBottom="true"/>
菜单栏
>
>
这两部分都在NavigationView布局中引用了,直接生效。
注意:菜单栏的彩色图标的颜色不会生效,默认展示为灰色。需要在Activity中设置如下代码才会恢复彩色:
navigationView.setItemIconTintList(null);
三、MainActivity中代码
设置ToolBar
/**
* 设置ToolBar
*/
private void setToolBar() {
setSupportActionBar(mToolbar);
ActionBar actionBar = getSupportActionBar();
//菜单按钮可用
actionBar.setHomeButtonEnabled(true);
//回退按钮可用
actionBar.setDisplayHomeAsUpEnabled(true);
//将drawlayout与toolbar绑定在一起
ActionBarDrawerToggle abdt = new ActionBarDrawerToggle(this, mAmDl, mToolbar, R.string.app_name, R.string.app_name);
abdt.syncState();//初始化状态
//设置drawlayout的监听事件 打开/关闭
mAmDl.setDrawerListener(abdt);
//actionbar中的内容进行初始化
mToolbar.setTitle("Live圈");//设置标题
mToolbar.setTitleTextColor(getResources().getColor(R.color.white));
}
若想在ToolBar中添加菜单栏,可以设置布局,然后在MainActivity中调用onCreateOptionsMenu进行初始化。详情可以下载源码(下面有链接)。
沉浸式状态栏
4.4及其以上都是可以实现沉浸式状态栏效果的,5.0及其以上可以直接在主题中设置颜色,或者调用 Window 类中的 setStatusBarColor(int color) 来实现,这两种方式在5.0上都比较简单,但是如何兼容到4.4,这是一个需要解决的问题。
解决思路:
给状态栏设置颜色
先设置状态栏透明属性;
给根布局加上一个和状态栏一样大小的矩形View(色块),添加到顶上;
然后设置根布局的 FitsSystemWindows 属性为 true,此时根布局会延伸到状态栏,处在状态栏位置的就是之前添加的色块,这样就给状态栏设置上颜色了。
/**
* 为DrawerLayout 布局设置状态栏变色
*
* @param activity 需要设置的activity
* @param drawerLayout DrawerLayout
* @param color 状态栏颜色值
* @param statusBarAlpha 状态栏透明度
*/
public static void setColorForDrawerLayout(Activity activity, DrawerLayout drawerLayout, @ColorInt int color,
int statusBarAlpha) {
//系统小于4.4
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
return;
}
//5.0以上 直接设置状态栏为透明色
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
activity.getWindow().setStatusBarColor(Color.TRANSPARENT);
} else {
//4.4-5.0之间先设置透明状态栏
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
// 生成一个状态栏大小的矩形
// 添加 statusBarView 到布局中
ViewGroup contentLayout = (ViewGroup) drawerLayout.getChildAt(0);
View fakeStatusBarView = contentLayout.findViewById(FAKE_STATUS_BAR_VIEW_ID);
if (fakeStatusBarView != null) {
if (fakeStatusBarView.getVisibility() == View.GONE) {
fakeStatusBarView.setVisibility(View.VISIBLE);
}
fakeStatusBarView.setBackgroundColor(color);
} else {
contentLayout.addView(createStatusBarView(activity, color), 0);
}
// 内容布局不是 LinearLayout 时,设置padding top
if (!(contentLayout instanceof LinearLayout) && contentLayout.getChildAt(1) != null) {
contentLayout.getChildAt(1)
.setPadding(contentLayout.getPaddingLeft(), getStatusBarHeight(activity) + contentLayout.getPaddingTop(),
contentLayout.getPaddingRight(), contentLayout.getPaddingBottom());
}
// 设置属性
setDrawerLayoutProperty(drawerLayout, contentLayout);
//将状态栏设置一定的透明度
addTranslucentView(activity, statusBarAlpha);
}
关于更多沉浸式状态栏知识,可以参考这篇文章。
通过以上内容就达到了模仿哔哩哔哩客户端首页+抽屉式导航的效果,具体图标及颜色没有刻意地模仿。
源码下载 里面包含一些乱七八糟地东西,没有好好整理。只需要了解MainActivity相关内容即可。
android仿抽屉动画效果,Android之仿哔哩哔哩客户端首页+抽屉式导航相关推荐
- android图片gif动画效果,android中类似于gif 实现图片的动画效果
案例:实现gif动画效果,连续播放图片 由于是转载的,也就没必要多说,直接上代码 案例:在android中实现gif动态图片的效果: EarthAnimationActivity.java packa ...
- android 颜色过渡动画效果,Android buttom textview 颜色平滑过渡的动画效果
1.TransitionDrawable.例如,在文件夹中绘制一个xml文件,你可以这样写: 然后,在你的xml的实际检视你都引用这个TransitionDrawable在android:backgr ...
- android 自定义view 动画效果,Android自定义view实现阻尼效果的加载动画
效果: 需要知识: 1. 二次贝塞尔曲线 2. 动画知识 3. 基础自定义view知识 先来解释下什么叫阻尼运动 阻尼振动是指,由于振动系统受到摩擦和介质阻力或其他能耗而使振幅随时间逐渐衰减的振动,又 ...
- android+酷炫动画效果,Android简单酷炫点击动画(附源码)
在Android5.0之前, Android的点击效果一直很low, 即使5.0的波纹效果也不尽如人意. 而我之前写过一种比较酷炫的点击效果, 最近抽了点时间完善一下, 把阴影效果加入了进去, 大家先 ...
- android 播放gif动画效果,android 通过帧动画方式播放Gif动画
注意:经过本人测试,这个方法很耗内存, 图片一多就崩了.慎用 <1>用工具(photoshop或者FireWorks)将GIF动画图片分解成多个GIF静态图片,然后保存在res\drawa ...
- android 播放gif动画效果,Android实现可播放GIF动画的ImageView
Android的原生控件并不支持播放GIF格式的图片.我们都知道,在Android中如果想要显示一张图片,可以借助ImageView来完成,但是如果将一张GIF图片设置到ImageView里,它只会显 ...
- android 播放gif动画效果,Android开发:教您如何让Gif动画动起来
我们已经连续推出<如何实现TCP和UDP传输>.< Android 提供了另外一种解决的办法,就是使用AnimationDrawable 这一函数使其支持逐帧播放,但是如何把gif ...
- android+酷炫动画效果,Android酷炫动画效果之3D星体旋转效果
在Android中,如果想要实现3D动画效果一般有两种选择:一是使用Open GL ES,二是使用Camera.Open GL ES使用起来太过复杂,一般是用于比较高级的3D特效或游戏,并且这个也不是 ...
- android点赞的动画效果,android实现点赞动画
想让APP给人一个好的映像,无非使自己实现的功能更加炫丽!! 接下来给大家介绍下点赞的一个动画效果: 接下来看看是如何实现的: 简单布局如下: xmlns:tools="http://sch ...
最新文章
- Revit初学者完整指南 The Complete Revit Guide for Beginners
- oracle cluster n,10g Rac的cluster_interconnect信息
- python排序的两个方法
- 数组去重(JavaScript)先从网上整理一波,待验证
- php如何将mysql数据库中的admin字段赋值给session_转php中使用session_set_save_handler()函数把session保存到MySQL数据库实例...
- PostgreSQL数据库远程连接功能的开启
- c++ 标准异常类层次结构_Java入门教程十一(异常处理)
- 计算机基础应用000018,计算机应用基础第01章计算机基础知识
- 如何在SQL Server中创建视图
- java银联接口代码_银联接口测试——详细(JAVA)(示例代码)
- linux bind 源码,rpcbind 源码 分析
- GitHub的简介翻译(草稿)
- C语言 - 输入x的值,输出y相应的值 x (x<1) y= 2x-1 (1≤x<10) 3x-11 (x≥10)
- unity学习之路——什么是unity(附学习路线)
- iphone开发笔记一 mac os 10.7.2安装与配置
- CookGAN Causality based Text-to-Image Synthesis
- Pycharm 快捷键盘
- 微贷七年之痒:重线下、追科技、争存量,能否赢未来?
- 【百度大脑新品体验】人脸面部动作识别
- 计算机无法安装蓝牙驱动,电脑没有蓝牙驱动怎么安装具体方法
热门文章
- oracle认证考试资格,Oracle认证考试报考条件(Oracle认证报名条件)
- KNOPPIX 8.5.0 发布,光盘启动的 GNU/Linux
- 网络安全1-基础知识
- 机械类复试面试问答题3
- 六轴机器人matlab写运动学正解函数(改进DH模型)
- 系统分析与设计作业(五):业务建模与活动图图绘制
- 中学生怎样才能合理使用计算机,运用计算机技术提高中学生学习效率的精编.doc...
- Uuntu16 学习记录(持续更新中......)
- css文字环绕后怎么定位,如何使用css实现文字环绕
- 【Spark分布式内存计算框架——Spark Streaming】11. 应用案例:百度搜索风云榜(下)实时窗口统计