【移动应用开发技术】Android UI设计体验之全屏沉浸式透明状态栏效果_第1页
【移动应用开发技术】Android UI设计体验之全屏沉浸式透明状态栏效果_第2页
【移动应用开发技术】Android UI设计体验之全屏沉浸式透明状态栏效果_第3页
【移动应用开发技术】Android UI设计体验之全屏沉浸式透明状态栏效果_第4页
【移动应用开发技术】Android UI设计体验之全屏沉浸式透明状态栏效果_第5页
免费预览已结束,剩余1页可下载查看

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

【移动应用开发技术】AndroidUI设计体验之全屏沉浸式透明状态栏效果。

前言:

Android4.4之后谷歌提供了沉浸式全屏体验,在沉浸式全屏模式下,状态栏、虚拟按键动态隐藏,应用可以使用完整的屏幕空间,按照Google的说法,给用户一种身临其境的体验。而Android5.0之后谷歌又提出了ColorPalette的概念,让开发者可以自己设定系统区域的颜色,使整个App的颜色风格和系统的颜色风格保持统一。今天学习总结一下如何实现Android4.4以上全屏沉浸式透明状态栏效果。先看下预期效果:

首先现分清楚哪部分是状态栏,哪部分是导航栏状态栏StatusBar如下导航栏NavigationBar如下如何实现?

第一种:继承主题特定主题

在AndroidAPI19以上可以使用****.TranslucentDecor***有关的主题,自带相应半透明效果,Theme.Holo.NoActionBar.TranslucentDecor和Theme.Holo.Light.NoActionBar.TranslucentDecor两种主题为新增加的,所以要新建values-v19文件夹并创建styles文件添加如下代码

<style

name="AppBaseTheme"

parent="android:Theme.Holo.Light.NoActionBar.TranslucentDecor">

<!--

Customize

your

theme

here.

-->

</style>第二种:在activity中采用代码的方式Android4.4以上可以添加如下代码if

(Build.VERSION.SDK_INT

>=

Build.VERSION_CODES.KITKAT)

{//透明状态栏window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);//透明导航栏window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);

}Android5.0以上也可以使用下面的代码实现全屏if

(Build.VERSION.SDK_INT

>=

Build.VERSION_CODES.LOLLIPOP)

{

window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS

|

WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);

window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN

|

View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION

|

View.SYSTEM_UI_FLAG_LAYOUT_STABLE);

window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);

}全屏效果不难发现此时状态栏占有的位置消失,和app的布局叠在一起了,接下来解决这个问题第一种:主题添加如下设置<item

name="android:fitsSystemWindows">true</item>第二种:activitylayout根目录添加下面代码android:fitsSystemWindows="true"第三种:通过Java代码设置rootview.setFitsSystemWindows(true);fitsSystemWindows只作用在sdk>=19的系统上就是高于4.4的系统,这个属性可以给任何view设置,只要设置了这个属性此view的所有padding属性失效.只有在设置了透明状态栏(StatusBar)或者导航栏(NavigationBar)此属性才会生效,如果上述设置了状态栏和导航栏为透明的话,相当于对该View自动添加一个值等于状态栏高度的paddingTop,和等于导航栏高度的paddingBottom,效果如下4.4以上的可以采用修改contentView的背景色,或者动态添加一个view到contentView上

if

(Build.VERSION.SDK_INT

>=

Build.VERSION_CODES.KITKAT)

{

//透明状态栏

window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);

//透明导航栏

window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);

//设置contentview为fitsSystemWindows

ViewGroup

contentView

=

(ViewGroup)

findViewById(android.R.id.content);

View

childAt

=

contentView.getChildAt(0);

if

(childAt

!=

null)

{

childAt.setFitsSystemWindows(true);

}

//给statusbar着色

View

view

=

new

View(this);

view.setLayoutParams(new

ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,

getStatusBarHeight(this)));

view.setBackgroundColor(color);

contentView.addView(view);

}动态获取StatusBarHeight函数如下

/**

*

获取状态栏高度

*

*

@param

context

context

*

@return

状态栏高度

*/

private

static

int

getStatusBarHeight(Context

context)

{

//

获得状态栏高度

int

resourceId

=

context.getResources().getIdentifier("status_bar_height",

"dimen",

"android");

return

context.getResources().getDimensionPixelSize(resourceId);

}动态获取NavigationBarHeight函数如下

/**

*

获取导航栏高度

*

*

@param

context

context

*

@return

导航栏高度

*/

public

static

int

getNavigationBarHeight(Context

context)

{

int

resourceId

=

context.getResources().getIdentifier("navigation_bar_height",

"dimen",

"android");

return

context.getResources().getDimensionPixelSize(resourceId);

}然后Android5.0以上谷歌提供了新的api可以更新状态栏和导航栏的背景色

if

(Build.VERSION.SDK_INT

>=

Build.VERSION_CODES.LOLLIPOP)

{

window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS

|

WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);

window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN

|

View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION

|

View.SYSTEM_UI_FLAG_LAYOUT_STABLE);

window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);

//设置状态栏颜色

window.setStatusBarColor(color);

//设置导航栏颜色

window.setNavigationBarColor(color);

ViewGroup

contentView

=

((ViewGroup)

findViewById(android.R.id.content));

View

childAt

=

contentView.getChildAt(0);

if

(childAt

!=

null)

{

childAt.setFitsSystemWindows(true);

}//

contentView.setPadding(0,

getStatusBarHeight(this),

0,

0);

}这样总体效果就实现了

private

void

initWindows()

{

Window

window

=

getWindow();

int

color

=

getResources().getColor(android.R.color.holo_blue_light);

if

(Build.VERSION.SDK_INT

>=

Build.VERSION_CODES.LOLLIPOP)

{

window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS

|

WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);

window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN

|

View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION

|

View.SYSTEM_UI_FLAG_LAYOUT_STABLE);

window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);

//设置状态栏颜色

window.setStatusBarColor(color);

//设置导航栏颜色

window.setNavigationBarColor(color);

ViewGroup

contentView

=

((ViewGroup)

findViewById(android.R.id.content));

View

childAt

=

contentView.getChildAt(0);

if

(childAt

!=

null)

{

childAt.setFitsSystemWindows(true);

}

}

else

if

(Build.VERSION.SDK_INT

>=

Build.VERSION_CODES.KITKAT)

{

//透明状态栏

window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);

//透明导航栏

windo

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论