一 修改状态栏颜色


状态栏说的是黄框内部部分

    //设置Activity的状态栏颜色 注意是状态栏public static void setStatusBarColor(Activity activity, int color) {// 5.0 以上 直接调用系统提供的方法 setStatusBarColorif (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {activity.getWindow().setStatusBarColor(color);}// 4.4 - 5.0 之间 大致思路 采用一个技巧,首先把他弄成全屏,在状态栏的部分加一个布局else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {// 首先把他弄成全屏(),在状态栏的部分加一个布局// activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);//这个标志位完全全屏了 都没有状态栏了// FLAG_TRANSLUCENT_STATUS标志位 电量 时间 网络状态 都还在// 1 将Window设置为全屏activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);// 在状态栏的部分加一个布局 setContentView 源码分析,自己加一个布局 (高度是状态栏的高度)// 2 先准备一个高度与statusBar相等的view 并设置好颜色View view = new View(activity);ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight(activity));view.setLayoutParams(params);view.setBackgroundColor(color);// DecorView是一个 FrameLayout 布局 , 会加载一个系统的布局(LinearLayout) ,// 在系统布局中会有一个 id 为 android.R.id.content 这布局是(RelativeLayout)//  http://www.jianshu.com/p/531d1168b3ee// 3 将第二步准备好的view添加到decor viewViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView();decorView.addView(view);// 4 获取activity中setContentView布局的根布局 contentView 并给他一个padding// 出现布局被view遮挡的情况 解决方案一ViewGroup contentView = (ViewGroup) activity.findViewById(android.R.id.content);contentView.setPadding(0, getStatusBarHeight(activity), 0, 0);// 创建的view最好不要加在mainActivity的布局 而是加在DecorView// 出现布局被view遮挡的情况 解决方案二可以在xml中添加 android:fitsSystemWindows="true" 但是每个布局都要写// 出现布局被view遮挡的情况 解决方案三// View activityView = contentView.getChildAt(0);// activityView.setFitsSystemWindows(true);// 这样只要设置一次即可// 出现布局被view遮挡的情况 解决方案四// activityView.setPadding(0,getStatusBarHeight(activity),0,0);// 方案一和方案四类似 只不过一个padding加在content的上面 一个padding加在了content的第一个子view上// 不过方案一更优 因为方案四会导致我们在自己的布局文件最外层容器设置padding无效// 整体逻辑:由外到内的布局分别是 1 PhoneWindow 2 DecorView(FrameLayout) 3 系统布局(LinearLayout有个叫android.R.id.content的占位符的FrameLayout) 4 我们创建的布局加载在android.R.id.content的位置// 比如R.layout.screen_simple.xml是一个系统布局 是一个LinearLayout// 1 将PhoneWindow 设置为全屏// 2 将准备好的view放到DecorView(FrameLayout)的尾部 对于FrameLayout来说就是最上层// 3 由于FrameLayout不会自动将其他view挤到正确的位置 因此我们需要给处于FrameLayout中的系统布局设置一个padding或者fitsSystemWindows 将之前添加的view露出来}}//获取状态栏的高度private static int getStatusBarHeight(Activity activity) {// 插件式换肤有讲到:怎么获取资源的-->类似反射 先获取资源id,根据id获取资源高度Resources resources = activity.getResources();int statusBarHeightId = resources.getIdentifier("status_bar_height", "dimen", "android");Log.e("TAG", statusBarHeightId + " -> " + resources.getDimensionPixelOffset(statusBarHeightId));return resources.getDimensionPixelOffset(statusBarHeightId);}

二 设置全屏

    //设置activity全屏(5.0以上调用该方法还需要将主题设置为NoActionBar)public static void setStatusBarTranslucent(Activity activity) {// 5.0 以上if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {View decorView = activity.getWindow().getDecorView();decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);activity.getWindow().setStatusBarColor(Color.TRANSPARENT);}// 用上面的方法中的第一步即可else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);}}

三 title渐隐效果思路思路

根据ImageView的高度修改title alpha值
效果

xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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=".MainActivity"><ScrollViewandroid:id="@+id/scrollView"android:layout_width="match_parent"android:layout_height="match_parent"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"><ImageViewandroid:id="@+id/imageView"android:layout_width="match_parent"android:layout_height="400dp"android:background="@color/colorPrimary" /><TextViewandroid:layout_width="match_parent"android:layout_height="200dp"android:background="#cfc"android:gravity="center"android:text="@string/app_name" /><TextViewandroid:layout_width="match_parent"android:layout_height="200dp"android:background="#cfc"android:gravity="center"android:text="@string/app_name" /><TextViewandroid:layout_width="match_parent"android:layout_height="200dp"android:background="#cfc"android:gravity="center"android:text="@string/app_name" /><TextViewandroid:layout_width="match_parent"android:layout_height="200dp"android:background="#cfc"android:gravity="center"android:text="@string/app_name" /><TextViewandroid:layout_width="match_parent"android:layout_height="200dp"android:background="#cfc"android:gravity="center"android:text="@string/app_name" /><TextViewandroid:layout_width="match_parent"android:layout_height="200dp"android:background="#cfc"android:gravity="center"android:text="@string/app_name" /><TextViewandroid:layout_width="match_parent"android:layout_height="200dp"android:background="#cfc"android:gravity="center"android:text="@string/app_name" /><TextViewandroid:layout_width="match_parent"android:layout_height="200dp"android:background="#cfc"android:gravity="center"android:text="@string/app_name" /><TextViewandroid:layout_width="match_parent"android:layout_height="200dp"android:background="#cfc"android:gravity="center"android:text="@string/app_name" /><TextViewandroid:layout_width="match_parent"android:layout_height="200dp"android:background="#cfc"android:gravity="center"android:text="@string/app_name" /><TextViewandroid:layout_width="match_parent"android:layout_height="200dp"android:background="#cfc"android:gravity="center"android:text="@string/app_name" /><TextViewandroid:layout_width="match_parent"android:layout_height="200dp"android:background="#cfc"android:gravity="center"android:text="@string/app_name" /></LinearLayout></ScrollView><LinearLayoutandroid:id="@+id/header"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="#FF0000"><TextViewandroid:layout_width="match_parent"android:layout_height="100dp"android:gravity="center"android:text="头部" /></LinearLayout></RelativeLayout>

activity

/*** 本节内容* 状态栏渐隐效果* 原理: 根据ImageView的高度修改状态栏alpha值*/
public class MainActivity extends AppCompatActivity {ScrollView mScrollView;ImageView mImageView;int mImageViewHeight;int mHeaderViewHeight;View mHeader;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mScrollView = findViewById(R.id.scrollView);mImageView = findViewById(R.id.imageView);mHeader = findViewById(R.id.header);mHeader.post(new Runnable() {@Overridepublic void run() {mHeaderViewHeight = mHeader.getMeasuredHeight();}});mHeader.getBackground().setAlpha(0);mImageView.post(new Runnable() {@Overridepublic void run() {mImageViewHeight = mImageView.getMeasuredHeight();}});mScrollView.setOnScrollChangeListener(new View.OnScrollChangeListener() {@Overridepublic void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {if (mImageViewHeight == 0) {return;}float alpha = (float) scrollY / (mImageViewHeight - mHeaderViewHeight);alpha = alpha * 255;if (alpha > 255) {alpha = 255;}if (alpha < 0) {alpha = 0;}Log.d("TAG", "onScrollChange: alpha " + alpha);//background setAlpha和view setAlpha的取值范围不同 这里要*255mHeader.getBackground().setAlpha((int) alpha);}});}
}

代码
https://github.com/caihuijian/learn_darren_android.git

红橙Darren视频笔记 状态栏设置颜色 获取高度 设置全屏相关推荐

  1. 红橙Darren视频笔记 类加载机制(API28) 自己写个热修复 查看源码网站

    第一部分 类加载机制 一个Activity是如何被Android虚拟机找到的? 在之前的文章 红橙Darren视频笔记 自定义View总集篇(https://blog.csdn.net/u011109 ...

  2. 红橙Darren视频笔记 Behavior的工作原理源码分析

    主要coordinatorlayout的代码来自coordinatorlayout-1.0.0-sources.jar 本文从源码介绍 CoordinatorLayout 的 behavior 怎么工 ...

  3. 红橙Darren视频笔记 代理模式 动态代理和静态代理

    红橙Darren视频笔记 代理模式 动态代理和静态代理(Android API 25) 关于代理模式我之前有过相关的介绍: https://blog.csdn.net/u011109881/artic ...

  4. 红橙Darren视频笔记 利用阿里巴巴AndFix进行热修复

    注意 由于AndFix在2017年左右就停止更新了,在最新版本的apk上遇到很多问题,我最终也没有成功进行热修复.本节主要是学习热修复的原理 在上一篇 红橙Darren视频笔记 自己捕获异常并保存到本 ...

  5. 红橙Darren视频笔记 仿QQ侧滑效果

    这一篇没有什么新的内容 就是改写 红橙Darren视频笔记 仿酷狗侧滑效果 的侧滑的效果 1.去掉淡入淡出效果 2.加上黑色模板效果 效果: 去掉淡入淡出效果很简单 就是注释掉onScrollChan ...

  6. 红橙Darren视频笔记 UML图简介

    整体架构复制自红橙原视频的课堂笔记 因为他这一课没有博客,所以没有转载链接,CSDN没有转载地址是无法作为转载类型的文章发表的,暂时标记为原创 参考链接 https://blog.csdn.net/r ...

  7. 红橙Darren视频笔记 ViewGroup事件分发分析 基于API27

    本节目标,通过案例,先看程序运行结果,然后跟踪源码,理解为什么会有这样的输出,继而理解view group的分发机制,感觉和证明题很像呢. 考虑以下程序的运行结果: case1: public cla ...

  8. 红橙Darren视频笔记 view的绘制流程(上) onMeasure测量代码分析 基于API27

    一.准备工作Activity的onCreate和onResume调用过程 从ActivityThread的handleLaunchActivity开始进行代码跟踪 private void handl ...

  9. 红橙Darren视频笔记 自定义TextView 基线的理解 问题引申(viewgroup 不触发onDraw方法)

    1.自定义属性以备使用 新建attrs.xml <?xml version="1.0" encoding="utf-8"?> <resourc ...

最新文章

  1. 中国移动用户能不能用WCDMA网?(世界杯与通信2)
  2. Response 输出文件流过程中的等待效果
  3. R语言应用实战-基于R的因子分析(以上市公司数据为例)
  4. Eclipse菜单栏 source Refactor详解
  5. 【UVA - 11292】Dragon of Loowater (贪心,水题,模拟,twopointer双指针)
  6. UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0xbd in position 198: illegal multibyte sequence
  7. meta你到底了解多少
  8. 怎样写一个具有异步交互的React组件的单元测试
  9. Linux中,根目录下文件夹的含义
  10. Java基准测试工具JMH使用
  11. Java实现IP代理
  12. 40个超有趣的Linux命令行彩蛋和游戏
  13. 机器人兴趣班奖状_美术兴趣班奖状称号
  14. mac os 10.8.5下 微信开发者工具安装问题
  15. 有源晶振引脚接法是什么样的?
  16. nrm 切换不同的源工具
  17. 大数据:数据合集,你想要的或许这里都有
  18. Programming tools
  19. python标记_python关于信息标记的三种形式
  20. GitHub下载神器,GitHub开元神器

热门文章

  1. z变换解差分方程例题_某些常见微分方程的一般解法(工具向)
  2. vue页面锚文本_Vue如何实现锚点定位功能?
  3. json java 数据类型_程序员都应该了解的一种数据格式之 JSON
  4. RQNOJ PID379 / 约会计划 -并查集
  5. 性能测试流程与性能测试分析和问题定位分享
  6. Atitit xml框架类库选型 attilax总结
  7. Exposure Mask of Digital Cameras
  8. Android 支付宝 移动支付接口 快速配置
  9. String.Format数字格式化输出 {0:N2} {0:D2} {0:C2}
  10. UVALive 4794 Sharing Chocolate DP