欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android 高仿QQ 沉浸式状态栏

程序员文章站 2024-02-26 14:35:58
前言: 在进入今天正题前,还是老样子先谈谈感想吧,最近感觉整个都失去了方向感,好迷茫!找工作又失败了,难道android真的饱和了?这两天我一直没出门,除了下楼哪外卖就是...

前言:

在进入今天正题前,还是老样子先谈谈感想吧,最近感觉整个都失去了方向感,好迷茫!找工作又失败了,难道android真的饱和了?这两天我一直没出门,除了下楼哪外卖就是宅宿舍了,静想了许久,我还是不能忘了初心,我相信我找不到工作的原因有很多,最关键的还是要技术够硬才行啊,奔跑吧孩子!接下来我就给大家介绍怎样快速打造沉浸式状态栏吧,虽然感觉有点相见恨晚,但其实不完!

一:何为沉浸式状态栏?

沉浸式状态栏是google从android 4.4开始,给我们开发者提供的一套能透明的系统ui样式,这样样式是给状态栏和导航栏的,这样的话就不用向以前那样每天面对着黑乎乎的上下两条黑栏了,还可以调成跟activity一样的样式,形成一个完整的主题,和ios7.0以上系统一样了。

先给你们来对比一下加了沉浸式和没加沉浸式的样式效果图吧,如下图所示:

 (非沉浸式)

Android 高仿QQ 沉浸式状态栏

 (沉浸式)

Android 高仿QQ 沉浸式状态栏

在此相信大家都了解什么是沉浸式状态栏了;目前打开很多app都会有这种效果,可想而知,沉浸式状态栏还是挺实用的!

二、使用沉浸式状态栏高仿qq:

实现沉浸式状态栏的步骤灰常简单:因为沉浸式状态栏是android4.4后才推出的,所以首先在程序中加上判断,即:当系统版本为4.4或者4.4以上时可以使用沉浸式状态栏,接着在语句中设置状态栏和导航栏为透明即可:

//当系统版本为4.4或者4.4以上时可以使用沉浸式状态栏
if (build.version.sdk_int >= build.version_codes.kitkat) {
 //透明状态栏
 getwindow().addflags(windowmanager.layoutparams.flag_translucent_status);
 //透明导航栏
 getwindow().addflags(windowmanager.layoutparams.flag_translucent_navigation);
}

最后在布局文件中加上、、、

android:fitssystemwindows="true"
android:cliptopadding="true"

这样就实现沉浸式状态栏了!

就是这么简单,就是这么耐使!源码是最好的导师,快看看整体代码吧:

xml布局文件:

<?xml version="1.0" encoding="utf-8"?>
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#ffffff"
    android:orientation="vertical"
    tools:context=".mainactivity">
 <relativelayout
  android:fitssystemwindows="true"
  android:cliptopadding="true"
  android:layout_width="match_parent"
  android:layout_height="80dp"
  android:background="#0099cc">
  <de.hdodenhof.circleimageview.circleimageview
   android:id="@+id/img_head"
   android:layout_width="40dp"
   android:layout_height="40dp"
   android:layout_gravity="center_horizontal"
   android:layout_margintop="13dp"
   android:layout_marginleft="15dp"
   app:civ_border_width="2dp"
   app:civ_border_color="#ffffff"
   android:src="@mipmap/meinv">
  </de.hdodenhof.circleimageview.circleimageview>
  <textview
   android:id="@+id/tv_title"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:layout_margintop="26dp"
   android:layout_centerhorizontal="true"
   android:text="联系人"
   android:textcolor="@android:color/white"
   android:textsize="18sp" />
  <textview
   android:id="@+id/tv_right_add"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:layout_margintop="26dp"
   android:layout_marginright="15dp"
   android:layout_alignparentright="true"
   android:text="添加"
   android:textcolor="@android:color/white"
   android:textsize="18sp" />
 </relativelayout>
 <textview
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:gravity="center"
  android:text="沉浸式状态栏"
  android:textsize="22sp"
  android:background="#e0ffff"/>
</linearlayout>

mainactivity中:

package com.zsml.chaotranstintbar;
import android.app.activity;
import android.os.build;
import android.os.bundle;
import android.view.window;
import android.view.windowmanager;
public class mainactivity extends activity{
 @override
 protected void oncreate(bundle savedinstancestate) {
  super.oncreate(savedinstancestate);
  this.requestwindowfeature(window.feature_no_title);
  setcontentview(r.layout.activity_main);
  //当系统版本为4.4或者4.4以上时可以使用沉浸式状态栏
  if (build.version.sdk_int >= build.version_codes.kitkat) {
   //透明状态栏
   getwindow().addflags(windowmanager.layoutparams.flag_translucent_status);
   //透明导航栏
   getwindow().addflags(windowmanager.layoutparams.flag_translucent_navigation);
  }
 }
}

实现沉浸式状态栏的其他方法:动态加入、第三方库。

1、动态实现:

动态实现也是比较简单的,首先是隐藏布局,最后动态计算状态栏高度并设置,都是在mainactivity中操作的,布局文件也就不用加上 android:fitssystemwindows="true"、  android:cliptopadding="true" 这两句了!

所以直接给源码吧:

mainactivity中:

import android.app.activity;
import android.os.build;
import android.os.bundle;
import android.view.view;
import android.view.window;
import android.view.windowmanager;
import android.widget.linearlayout;
import java.lang.reflect.field;
public class twoactivity extends activity {
 @override
 protected void oncreate(bundle savedinstancestate) {
  super.oncreate(savedinstancestate);
  //去掉标题
  this.requestwindowfeature(window.feature_no_title);
  setcontentview(r.layout.activity_two);
  //当系统版本为4.4或者4.4以上时可以使用沉浸式状态栏
  if (build.version.sdk_int >= build.version_codes.kitkat) {
   //透明状态栏
   getwindow().addflags(windowmanager.layoutparams.flag_translucent_status);
   //透明导航栏
   getwindow().addflags(windowmanager.layoutparams.flag_translucent_navigation);
   linearlayout linear_bar=(linearlayout)findviewbyid(r.id.linear_bar);
   linear_bar.setvisibility(view.visible);
   int statusheight=getstatusbarheight();
   linearlayout.layoutparams params=(linearlayout.layoutparams )linear_bar.getlayoutparams();
   params.height=statusheight;
   linear_bar.setlayoutparams(params);
  }
 }
 /**
  * 获取状态栏的高度
  * @return
  */
 private int getstatusbarheight(){
  try
  {
   class<?> c=class.forname("com.android.internal.r$dimen");
   object obj=c.newinstance();
   field field=c.getfield("status_bar_height");
   int x=integer.parseint(field.get(obj).tostring());
   return getresources().getdimensionpixelsize(x);
  }catch(exception e){
   e.printstacktrace();
  }
  return 0;
 }
}

这样就完事了,是不是一样那么简单、、、

2、第三方库实现(systembartint):

systembartint是开源到github上的一个开源库来的;

地址:https://github.com/jgilfelt/systembartint

使用步骤:

关联库:compile'com.readystatesoftware.systembartint:systembartint:1.0.3'

xml布局中添加:

android:fitssystemwindows="true"
android:cliptopadding="true"
mainactivity中实现:
import android.app.activity;
import android.os.build;
import android.os.bundle;
import android.view.window;
import android.view.windowmanager;
import com.readystatesoftware.systembartint.systembartintmanager;
public class threeactivity extends activity {
 @override
 protected void oncreate(bundle savedinstancestate) {
  super.oncreate(savedinstancestate);
  this.requestwindowfeature(window.feature_no_title);
  setcontentview(r.layout.activity_three);
  //当系统版本为4.4或者4.4以上时可以使用沉浸式状态栏
  if (build.version.sdk_int >= build.version_codes.kitkat) {
   //透明状态栏
   getwindow().addflags(windowmanager.layoutparams.flag_translucent_status);
   //透明导航栏
   getwindow().addflags(windowmanager.layoutparams.flag_translucent_navigation);
   systembartintmanager tintmanager = new systembartintmanager(this);
   // 激活状态栏
   tintmanager.setstatusbartintenabled(true);
   // enable navigation bar tint 激活导航栏
   tintmanager.setnavigationbartintenabled(true);
   //设置系统栏设置颜色
   //tintmanager.settintcolor(r.color.red);
   //给状态栏设置颜色
   tintmanager.setstatusbartintresource(r.color.middle_color);
   // 设置导航栏设置资源
   tintmanager.setnavigationbartintresource(r.color.androidcolore);
  }
 }
}

都是大同小异来的,我个人觉得第一种方法是最好实现和理解的,大家都可以尝试一下,希望对你们有所帮助!最后贴出沉浸式状态栏-高仿qq的效果图如下:

Android 高仿QQ 沉浸式状态栏

以上所述是小编给大家介绍的android 高仿qq 沉浸式状态栏,希望对大家有所帮助