沉浸式状态栏(二)
来源:互联网 发布:十大淘宝服装模特 编辑:程序博客网 时间:2024/05/22 18:55
上一篇:沉浸式状态栏(一)
话说上一篇沉浸式状态栏的实现方法基本可以适用于绝大部分设备,普通项目用足够了,但是看到QQ的的界面,效果却略显不同:
如图,这种沉浸式效果如果按第一篇的方法来做,就达不到这种效果了,我实际实现了下,也确实没达到,用SystemBarTintManager的效果如下:
我同样用了一个侧滑菜单(slidemenu)来模仿qq的侧滑菜单,实际效果如上图所示,这是为什么呢?我们只要知道SystemBarTintManager实现的原理就明白了,SystemBarTintManager实际上是修改了状态栏的颜色,那么这种方法带来的一个问题就是遇到带有侧滑菜单这种界面,状态栏颜色被固定了,也就成了上图的效果,而无法达到qq的那种效果!
那么,如果实现呢?其实也很简单,我们先仔细观察qq的状态栏,分明就是一透明色的吗,哈哈!如果状态栏纯透明,那么无论界面怎么变化,状态栏都会显示为界面头部的颜色,当然,前提是所有界面一定要设置为充满全屏,并且状态栏不隐藏:方法如下:
if (VERSION.SDK_INT >= VERSION_CODES.KITKAT) { // // 全屏不隐藏状态栏 getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN); getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS); // 设置状态栏透明 getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); }
只做这些处理,当然不够,目前的实际效果如图所示:
遇到这种情况,我们就要来想个法子了,如果还用之前的方法肯定是不行的了,因为实现原理不同,那么如何才能达到效果呢?我们可以用一下我们平时做布局时的思维,只要在标题栏上部放一个控件,背景跟标题栏颜色相同,而高度为状态栏高度不就行了嘛?当然,所有操作都要在sdk>=4.4时进行,总的实现方法如下:
首先,依然要创建一个BaseActivity:
@TargetApi(19) @Override protected void onCreate(Bundle savedInstanceState) { if (VERSION.SDK_INT >= VERSION_CODES.KITKAT) { // // 全屏不隐藏状态栏 getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN); getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS); // 设置状态栏透明 getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); } super.onCreate(savedInstanceState); }
其次,子Activity继承:
例:
public class MainActivity extends BaseActivity
布局xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:id="@+id/tv_status" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#00ccee" /> <RelativeLayout android:layout_width="match_parent" android:layout_height="50dp" android:background="#00ccee" > <TextView android:id="@+id/tv_menu" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_marginLeft="10dp" android:text="菜单" android:textColor="#FFFFFF" android:textSize="14sp" /> <TextView android:id="@+id/tv_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:text="消息" android:textColor="#FFFFFF" android:textSize="18sp" /> </RelativeLayout></LinearLayout>
注意tv_status控件就是用来设置为状态栏高度的。
onCreate:
@TargetApi(19) @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv_status = (TextView) findViewById(R.id.tv_status); if (VERSION.SDK_INT >= VERSION_CODES.KITKAT) { tv_status.setHeight(getStatusHeight(this)); tv_status.setVisibility(View.VISIBLE); } else { tv_status.setHeight(0); tv_status.setVisibility(View.GONE); } }
getStatusHeight方法为计算状态栏高度的方法:
public int getStatusHeight(Activity activity) { int statusHeight = 0; Rect localRect = new Rect(); activity.getWindow().getDecorView() .getWindowVisibleDisplayFrame(localRect); statusHeight = localRect.top; if (0 == statusHeight) { Class<?> localClass; try { localClass = Class.forName("com.android.internal.R$dimen"); Object localObject = localClass.newInstance(); int i5 = Integer.parseInt(localClass .getField("status_bar_height").get(localObject) .toString()); statusHeight = activity.getResources() .getDimensionPixelSize(i5); } catch (Exception e) { e.printStackTrace(); } } return statusHeight; }
最终实现效果:
当然,这只是个人的一种实现方式,如果大家有更好的实现方法,欢迎分享出来!!
- 沉浸式状态栏(二)
- 沉浸式状态栏(二)
- Android沉浸式状态栏(二)
- Android沉浸式(侵入式)标题栏(状态栏)Status(二)
- Android沉浸式(侵入式)标题栏(状态栏)Status(二)
- android沉浸式状态栏——解决方案(二)
- 透明状态栏(沉浸式状态栏)
- Android沉浸式状态栏(透明状态栏)
- 状态栏、沉浸式状态栏
- 沉浸式状态栏(一)
- 沉浸式状态栏(一)
- 沉浸式状态栏(变色状态栏、透明状态栏)的实现
- Android 透明状态栏 、着色状态栏 (沉浸式状态栏)
- 沉浸式状态栏/透明状态栏
- 透明状态栏(沉浸式状态栏)
- Android状态栏透明(沉浸式效果)
- Android沉浸式状态栏(一)
- 沉浸式状态栏实现(适合新手)
- 毕业后去大城市OR回小城市
- 函数
- xcode7 github
- 1019-N皇后问题
- CodeForces 659E New Reform (图的遍历判环)
- 沉浸式状态栏(二)
- 二 :springMVC:方法返回类型
- HDU 2063:过山车【二分匹配】
- ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock'
- 四 :spring mvc处理方法支持如下的返回方式:ModelAndView, Model, ModelMap, Map,View, String, void 使用方法
- 深入 Docker:容器和镜像
- Docker私有仓库搭建
- (Java实现) HDOJ 2023 求平均成绩 面向对象设计思想
- Python で Curses プログラミング