Material-Design-组件之NavigationView

原文首发于微信公众号:jzman-blog,欢迎关注交流!Material Design 系列文章: Material Design组件之FloatingActionButtonMaterial Design组件之AppBarLayoutMaterial Design组件之CollapsingToolbarLayout今天来看一下 NavigationView 的使用,NavigationView 是一个标准的导航菜单,其菜单内容由菜单资源文件来填充,NavigationView 一般和 DrawerLayout 一起搭配使用构成抽屉菜单,分别由内容页和菜单页组成。主要内容如下: 基本布局常用属性文字选中效果图标与文字间距案例显示效果基本布局可以直接使用 DrawerLayout 作为根布局,里面依次是内容布局和菜单布局,切记内容布局一定是在菜单布局的前面,可以这样理解菜单划出的时候肯定应该在内容布局之上,如果两者顺序相反,则影响菜单 Item 的点击事件以及菜单的滑动隐藏,当然如果有 ToolBar 等,可以按需添加到内容布局中,也可以 DrawerLayout 外,唯一区别是侧换菜单是否遮挡 ToolBar,基本使用参考如下: <android.support.v4.widget.DrawerLayout 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:fitsSystemWindows="true"> <!--内容 --> <!--菜单--> <android.support.design.widget.NavigationView android:id="@+id/navigation" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start" app:menu="@menu/my_navigation_items" /> </android.support.v4.widget.DrawerLayout>常用属性下面是 NavigationView 的常用属性,具体如下: <!--菜单弹出方向-->android:layout_gravity="start"<!--菜单图标渲染的颜色-->app:itemIconTint="@color/colorPrimary"<!--菜单文字的颜色-->app:itemTextColor="@color/colorNormal"<!--菜单项背景颜色(组之间有间隔)-->app:itemBackground="@color/colorBackground"<!--菜单项-->app:menu="@menu/menu_navigation_view" <!--NavigationView的头部布局-->app:headerLayout="@layout/head_navigation_layout"文字选中效果如果美工比较用心会告诉点击时是那种颜色、按下是那种颜色或者是某种效果,此时就需要设置菜单项文字选中效果了,这里选择创建在 color 资源文件的形式来实现文字选中效果了,定义 color 资源文件如下: <?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android"> <!--按下--> <item android:color="@color/colorPress" android:state_pressed="true"/> <!--选中--> <item android:color="@color/colorCheck" android:state_checked="true"/> <!--默认--> <item android:color="@color/colorNormal"/></selector>然后,设置 NavigationView 的 itemTextColor 属性即可,具体如下: ...

May 15, 2019 · 2 min · jiezi

Material-Design-组件之-CollapsingToolbarLayout

CollapsingToolbarLayout 主要用于实现一个可折叠的标题栏,一般作为 AppBarLayout 的子 View 来使用,下面总结一下 CollapsingToolbarLayout 的使用。 Material Design 系列文章: Material Design组件之FloatingActionButtonMaterial Design组件之AppBarLayout常用属性//是否显示标题app:titleEnabled="true"//标题内容app:title="CollapsingToolbarLayout"//扩展后Title的位置app:expandedTitleGravity="left|bottom"//收缩后Title的位置app:collapsedTitleGravity="left"//CollapsingToolbarLayout收缩后Toolbar的背景颜色app:contentScrim ="@color/colorPrimary"//CollapsingToolbarLayout收缩时颜色变化的持续时间app:scrimAnimationDuration="1200"//颜色从可见高度的什么位置开始变化app:scrimVisibleHeightTrigger="150dp"//状态颜色变化(Android 5.0)app:statusBarScrim="@color/colorAccent"//设置滑动组件与手势之间的关系app:layout_scrollFlags="scroll|exitUntilCollapsed"对于 Title 当折叠布局完全可见时 Title 变大,可折叠布局随着向上滑动可见范围变小 Title 也变小,可以通过如下方式设置 Title 的颜色,具体如下: //设置标题ctlCollapsingLayout.setTitle("CollapsingToolbarLayout");//设置CollapsingToolbarLayout扩展时的颜色ctlCollapsingLayout.setExpandedTitleColor(Color.parseColor("#ffffff"));//设置CollapsingToolbarLayout收缩时的颜色ctlCollapsingLayout.setCollapsedTitleTextColor(Color.parseColor("#46eada"));这个 Title 的颜色渐变过程由 CollapsingToolbarLayout 完成,当然其他部分属性也可以在代码中设置。 两个标志位单独在说一下两个重要属性,可以作为一个标志位来记: layout_scrollFlagslayout_collapseModelayout_scrollFlags:一般使用 CoordinatorLayout、AppBarLayout等这些组件构成的界面,一般都有一个滚动视图,如 NestedScrollView,滚动视图一般设置了系统默认的 Behavior,具体如下: //设置layout_behavior属性<android.support.v4.widget.NestedScrollView android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior"> ...</android.support.v4.widget.NestedScrollView>要随着滚动视图移动的组件,如 ToolBar、CollapsingToolbarLayout 等需要设置 layout_scrollFlags 属性来指定不同的动作,关于 layout_scrollFlags 值的具体含义请参考之前的一篇文章: Material Design 组件之 AppBarLayout 。 layout_collapseMode:layout_collapseMode 有两个值可以选择,如果设置了 pin 的 View 会随着页面向上滚动固定到顶部,如果设置了 parallax 的 View 会随着页面的滚动而滚动,此时可以结合另一个属性 layout_collapseParallaxMultiplier 形成视差滚动的效果。 CollapsingToolbarLayout 的介绍就到此为止,没有案例当然是不可以,下面是一个简单的使用案列,布局如下: <?xml version="1.0" encoding="utf-8"?><android.support.design.widget.CoordinatorLayout 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="com.manu.materialdesignsamples.samples.SampleCollapsingToolbarLayoutActivity"> <android.support.design.widget.AppBarLayout android:layout_width="match_parent" android:layout_height="200dp"> <android.support.design.widget.CollapsingToolbarLayout android:id="@+id/ctlCollapsingLayout" android:layout_width="match_parent" android:layout_height="match_parent" app:titleEnabled="true" app:title="CollapsingToolbarLayout" app:expandedTitleGravity="left|bottom" app:collapsedTitleGravity="left" app:contentScrim ="@color/colorPrimary" app:scrimAnimationDuration="1200" app:scrimVisibleHeightTrigger="150dp" app:statusBarScrim="@color/colorAccent" app:layout_scrollFlags="scroll|exitUntilCollapsed"> <ImageView android:layout_width="match_parent" android:layout_height="wrap_content" app:layout_collapseMode="parallax" app:layout_collapseParallaxMultiplier="0.6" android:background="@drawable/ic_collapsing_title"/> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="70dp" android:minHeight="?attr/actionBarSize" app:layout_collapseMode="pin"> </android.support.v7.widget.Toolbar> </android.support.design.widget.CollapsingToolbarLayout> </android.support.design.widget.AppBarLayout> <android.support.v4.widget.NestedScrollView android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior"> <android.support.v7.widget.RecyclerView android:id="@+id/rvCollapsing" android:layout_width="match_parent" android:layout_height="match_parent"/> </android.support.v4.widget.NestedScrollView></android.support.design.widget.CoordinatorLayout>显示效果下面是显示效果,具体如下: ...

May 14, 2019 · 1 min · jiezi

Material-Design组件之AppBarLayout

原文首发于微信公众号:jzman-blog,欢迎关注交流!AppBarLayout 是一个垂直方向的 LinearLayout,它实现了许多符合 Material Design 设计规范的状态栏应该具有的功能,比如滚动手势。 AppBarLayout 一般直接用作 CoordinatorLayout 的直接子对象,如果 AppBarLayout 在别的布局中使用,其大部分功能会失效,AppBarLayout 需要一个标示才能够知道滚动视图什么时候滚动,这个标示过程是通过绑定 AppBarLayout.ScrollingViewBehavior 类完成的,这意味着应该将滚动视图的行为设置为 AppBarLayout.ScrollingViewBehavior的一个实例,这里设置包含完整类名的字符串资源,具体如下: //设置layout_behavior属性<android.support.v4.widget.NestedScrollView android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior"> <!-- Your scrolling content --></android.support.v4.widget.NestedScrollView>AppBarLayout 的子 View 应该设置一个可供滚动的 behavior,可以通过代码和 xml 属性设置,具体如下: //代码setScrollFlags(int)//xml attributeapp:layout_scrollFlagslayout_scrollFlags 属性主要是指定 AppBarLayout 子 View 当滑动手势变化时,AppBarLayout 的子 View 执行什么动作,layout_scrollFlags 属性有 5 个值,分别是: scrollenterAlwaysenterAlwaysCollapsedexitUntilCollapsedsnap在介绍这几个属性值之前,这些属性值的效果将以下面布局效果为例,布局如下: <?xml version="1.0" encoding="utf-8"?><android.support.design.widget.CoordinatorLayout 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" tools:context="com.manu.materialdesignsamples.samples.SampleCoordinatorAppBarActivity"> <!--AppBarLayout——>子View设置layout_scrollFlags属性--> <android.support.design.widget.AppBarLayout android:id="@+id/ablBar" android:layout_width="match_parent" android:layout_height="wrap_content"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="70dp" android:minHeight="?attr/actionBarSize" app:layout_scrollFlags="scroll"> </android.support.v7.widget.Toolbar> </android.support.design.widget.AppBarLayout> <!--NestedScrollView——>设置layout_behavior属性--> <android.support.v4.widget.NestedScrollView android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior"> <android.support.v7.widget.RecyclerView android:id="@+id/rvAppBarData" android:clipToPadding="true" android:layout_width="match_parent" android:layout_height="wrap_content"/> </android.support.v4.widget.NestedScrollView></android.support.design.widget.CoordinatorLayout>scroll: 当设置 layout_scrollFlags 的属性为如下时: ...

May 13, 2019 · 1 min · jiezi

Android-复盘你真的了解-setContentView-吗

1. AppCompatDelegate 的 setContentView()分析 Android 中的 View,我们先从进入应用的看到的的一个 View 入手,第一个 View 就是 通过 setContentView() 这个方法进行加载的。我们来看 setContentView() 的源码: public void setContentView(@LayoutRes int layoutResID) { this.getDelegate().setContentView(layoutResID);}AppCompatActivity 中的 setContentView() 又调用了 AppCompatDelegate 中的 setContentView() 方法,那 AppCompatDelegate 是做什么的呢? AppCompat 出现在 v7 包,它的作用是让 API 等级在 7 之上的设备也能使用 ActionBar,在 v7:21 之后,AppCompat 可以让 API 在 7 之上的设备使用 MD、ToolBar 等效果。之前的 ActionBarActivity 也被取代为 AppCompatActivity。但 AppCompatActivity 的内部回调是由 AppCompatDelegate 来实现的。AppCompatDelegate 是一个抽象类,它的实现类是 AppCompatDelegateImpl,现在看 AppCompatDelegateImpl 中的 setContentView() 方法: public void setContentView(int resId) { // 创建 DecorView,DecorView 是视图中的顶级 View this.ensureSubDecor(); // 获取 DecorView 中的 content 部分 ViewGroup contentParent = (ViewGroup)this.mSubDecor.findViewById(16908290); contentParent.removeAllViews(); // 将我们编写的界面填充到 content 中 LayoutInflater.from(this.mContext).inflate(resId, contentParent); this.mOriginalWindowCallback.onContentChanged();}2. DecorView在 AppCompatDelegateImpl 的 setContentView() 中,通过 ensureSubDecor() 方法为视图创建 DecorView, ...

May 3, 2019 · 9 min · jiezi

消息语音播报,微信语音自动播放,有点儿意思,可以看看这个应用

我们谈谈技术,当然,主要也是给自己做的应用打打广告,谢谢大家支持,下载用用,提提意见。先上个二维码,感兴趣的现在就可以去看看:点击下载方便聊,下方二维码扫描直接下载说说初衷一个月之前,朋友给我说了一个很有意思的需求:在骑单车的时候(开车同理,反正就是手没空的场景),希望能够来了微信消息能够语音朗读出来(如果是语音就自动播放),然后啊,这时候如果带了耳机,能够用耳机的按键来发送微信语音消息。这个听起来好像还有点意思,从技术的角度来说应该很好实现,哈哈,马上搜一搜有没有这方面的应用,结果当然是没有,不然也没有这篇文章了能听会说这个应用做出来,主要就两个功能,一个词形容:能听会说。首先来看看听,微信用耳机来发送语音,其实啊,这个功能微信团队也想到了,然后在iOS的微信是可以开启这个功能的:首先要在微信通讯录里找到“微信团队”这个帐号,向该账号发送kqej,即“开启耳机”的四字的首字母,就能开启微信的耳机录音功能。发送“gbej”即能关闭微信耳机录音功能微信耳机录音功能开启后,按一下耳机线上的播放/暂停键(增减音量中间的空白部分)后就可以说话。这时,屏幕上也会显示开始录音的标识。说话结束后,再按一次播放/暂停键,刚才记录的语音就会发送出去。当然,用iPhone耳机发送语音并不会自动播放他人发过来的消息。它的方便之处在于解放了你的双手,在你不方便的时候再不用举着手机说话。然后我试了一下,iOS 11.2.5 微信6.6.3开启失败,得到的回复是你的微信版本不支持微信耳机功能。当然,iOS不是我们现在讨论的主要内容,我们来看看Android,很遗憾,微信官方并没有这个功能,其实这个实现的难度主要还是在硬件,苹果的耳机是可以按下按键的同时接收麦克风语音的,但是大部分Android的耳机并不可以,一按下按键就没办法使用麦克风。况且要从外部控制微信的语音按钮也是个问题,所以听 这个功能暂时就搁置了,还是先从简单的来,后面再慢慢研究这个。正在看文章的你有没有什么好办法呢?说出消息通知栏读取说消息这个主要就是消息的解析,最简单的一种方案是读取通知栏,这个方案不仅是微信,所有具有通知权限的应用消息都可以读出来,怎么来实现呢,Android从4.4API19之后提供了一个类NotificationListenerService,在用户手动开启了通知栏读取权限之后,可以在这个服务类中获取所有的通知栏消息,并且还可以控制,夸张一点说,只要用户同意了之后,手机上的所有通知消息你想怎么处理就怎么处理。当然,这里面有好多坑,也有一些致命的问题。你可以下载应用试试,可能会遇到,我再告诉你。辅助功能(无障碍)通知栏读取很方便,但是你会说,我开了免打扰怎么办,或者说我隐藏了消息具体内容怎么办,这就是个问题了,而且微信还有语音消息,最好能够自动播放……这个怎么来解决呢,想要实现这个,在手机不root的情况只有一个办法,那就是使用辅助功能(有的手机叫无障碍),这个功能主要是用来获取当前界面的所有控件和内容,还可以模拟点击,现在市面上大部分抢红包插件也是用的这种方法。这个类叫AccessibilityService,在用户同意了权限之后,就可以获取当前打开界面的所有信息(注意是所有界面,不限于微信)。微信消息读取上面说到可以读取当前界面的所有消息是应用不做特殊处理的情况下,那微信的消息可以直接读取么?很遗憾,答案是不能,不得不说,微信安全这方面确实做了很多考虑,怎么实现的我还是很好奇,有没人知道呢?我还试了QQ,QQ是可以直接读聊天内容的,也不知道QQ的需求大不大?如果需求大的话后面加进去。那要读到微信消息怎么办呢,在苦思冥想,挠破头皮之后只想到一个笨办法,那就是长按消息之后复制,再读取剪贴板的内容。既然叫笨办法,那肯定是有很多缺陷的,最大的缺陷就是这个不太稳定,容易复制失败,这时候往往需要手动去长按复制一下或者点击一下消息再开启才会生效。隐私问题上面说的这些有没有吓到不是开发者的读者呢?如果是我我也会觉得这有点可怕,可以读到你当前打开的所有内容,想想都吓人……但是你放心,上面提到的两个功能,一个是通知栏权限,一个是辅助功能权限,这两个功能必须手动允许,而且在应用被杀死之后大部分系统会自动关闭,你只需要谨慎的开启就好,比如方便聊这个应用,完全没必要担心这个问题,理论上它关闭网络也能用的,联网只是语音sdk需要联网,应用本身是不会存储任何内容的,您完全放心下载使用。方便聊,聊天更方便,觉得有意思的下载来试试呗?现在应用还不太稳定,功能也比较单一,有什么意见随便提!点击下载方便聊,下方二维码扫描直接下载

April 2, 2019 · 1 min · jiezi

一篇文章让你了解Android各个版本的历程

2008年–至今Android 1.5(Cupcake纸杯蛋糕):智能虚拟键盘;使用widgets实现桌面个性化;在线文件夹(Live Folder)快速浏览在线数据;视频录制和分享;图片上传;更快的标准兼容浏览器;Voice search 语音搜索;立体声蓝牙和免提电话 Android 1.6(Donut甜甜圈):完全重新设计的Android Market,可以显示更多的屏幕截图;手势支持,可以让开发者生成针对某个应用程序的手势库;支持CDMA网络:中国电信的用户可以期待EVDO的Android手机了;TXT-2-Speech,支持了更多语言的发音,包括英语、法语、德语、意大利语等快速搜索框,可直接搜索括联系人,音乐,浏览历史,书签等手机内容;全新的拍照界面:新版相机程序启动速度快了39%,拍照间的延迟减少了28%;应用程序耗电查看:这下好了,哪个软件耗多少电,现在一见了然了;新增面向视觉或听觉困难人群的易用性插件;Linux内核升级到2.6.29;其他:支持更多的屏幕分辨率,如WVGA,QVGA等Android 2.0 (2.0~2.1 Eclair松饼(闪电泡芙)):由于文件结构的改动优化,使得整个操作流畅性得到了很大的提升;自带的Chrome Lite浏览器现在加入了对双击屏幕进行缩放的支持;加强了网络社交功能,比如Facebook好友整合至联系人功能;强化了语音识别的搜索控制。整个系统多处都支持语音控制,并拥有独立的控制面板;谷歌地图服务更新,加入了全新的导航系统,甚至比转业的导航软件更为先进;加入了原生微软Exchange邮件服务支持;提供了多个不同帐户,统一的邮件收件箱;只需双击就能上传图片至YouTube;优化了驾车时的体验,新的“Car Home”应用程序为各功能提供了易于操作的快捷链接,还能方便地使用语音控制功能,便于用户驾车时使用 Android 2.1可以同时绑定多个Google账号;无线控件里有了VPN设置;增加了连接到PC设置;增强了语言和声音的转换功能,并加入了文字到语音转换;全新的拨号界面,按键更大,更易于操作;更多桌面Widget;新的Google地图可以使用谷歌地图导航功能;新的浏览器版本,加强了稳定性和网页渲染能力;全局搜索功能加强;全新的Market程序,搜索更快布局更合理 Android 2.2(Froyo冻酸奶):全面支持Flash 10.1;应用程序自动升级,让升级更加人性化;支持应用程序安装在外置内存上;Linux内核将升级为最新的2.6.32版本,系统更加稳定;对系统性能进一步优化,让手机有更多的运行内存;增加了轨迹球LED指示灯变色这个新功能;增加了对3D性能的优化,3D性能更加强大;FM功能也将在新系统中得到全面支持 Android 2.3(2.3 Gingerbread姜饼)用户界面更美观;提升游戏体验;提升多媒体能力;增加官方进程管理;改善电源管理;NFC近场通信;全局下载管理;全新虚拟键盘;原生支持前置前置摄像头;SIP网络电话 Android3.0到3.1(3.0 Honeycomb 蜂巢):安卓3.0系统主要用于安卓的平板产品,画面动感,可操控性更强,代表有摩托罗拉的平板产品XOOM,3.1也已经发布,也主要用于平板产品。Android4.0(4.0 Ice CreamSandwich)1、单一系统Android 4.0将只提供一个版本,同时支持智能手机、平板电脑、电视等设备。2、一流的新UI3、开源此前Android 3.0曾一度宣布不采取开源措施,然而谷歌深知Android系统一大成功特性就是开源。平板上吃到的苦头势必在全新的Android 4.0上避免,用户为中心的刷机资源一定会让Android 4.0锦上添花。 Android5.01、android 5.0 Hello 5.05.0的版本号就能告诉我们,这是一个大的升级版本。2、基于Linux内核3.0Linux刚刚发布Linux 3.0内核没多久,后来又更新到了3.0.1 。3、通过Android Market购买音乐谷歌已经试水性质的推出了Google Music Beta ,允许上传2万首音乐到Google的云端服务器,自动创建播放列表在任何支持flash的设备上回放,我们有理由相信这种在Appstore影响下的数字视频、音频服务内容的提供也将会出现在Android上。4、多核处理器优化现在各厂商都在推双核的智能手机,实际的效果如何我们不予评说,但Android 4.0将特别为使用双核乃至多核处理器的手机进行专门的优化。5、运行速度比3.1提高1.8倍Google的人员只是这么一说,并没有提及这个性能具体体现在什么方面,因此我们不知道这是关于浏览器、GPU还是整体性能,只有等待。6、集成Google电视和Chrome OS的智能停放7、为OEM提供了官方的主题引擎有了这个引擎,便可通过Google的升级程序更新到这些第三方的主题。8、苹果游戏中心的一个真正的竞争者9、支持现有的智能手机据称现行所有运行Android 2.3的手机都有可能升级到4.0版本,这条消息是我喜闻乐见的,而Google官方的Nexus One和Nexus S将是第一批升级到4.0的手机。10、新的摄影技巧以及虚拟摄像机这将为开发者提供更丰富的摄像头控制API。android 6.0 锁屏下语音搜索用户可以直接在锁屏状态下进行语音搜索,虽然现在的一些安卓手机支持语音唤醒功能,但这些语音唤醒都是第三方厂商开发的,而此次的Android 6.0在系统层面加入锁屏下语音搜索,这无疑会在体验上有一个明显的提升。指纹识别说到指纹识别,很多用户都会觉得现在的中高端安卓手机都支持,但事实上这些安卓手机的指纹识别都是各个厂商自行开发的并没有系统底层的支持。Android 6.0则在系统层面加入指纹识别,能提供原生指纹识别API,这不但降低了厂商开发指纹识别模块的成本,最重要的是原生指纹识别将会大大提升安卓手机的指纹识别支付安全性。更完整的应用权限管理在此前的原生安卓系统中有应用通知管理功能,但更为深入的应用权限管理只能靠第三方应用实现。Android 6.0进一步强化应用权限管理,应用权限管理也成为系统级的功能,不过这对于那些权限管理软件来说并不是什么好消息。Doze电量管理Android 6.0自带Doze电量管理功能,在“Doze”模式下,手机会在一段时间未检测到移动时,让应用休眠清杀后台进程减少功耗,谷歌表示,当屏幕处于关闭状态,平均续航时间提高30%。Now on Tap功能Now on Tap功能是和Google搜索紧密结合的功能,它可以让谷歌从任何应用中进行搜索。例如,在微信中聊天的时候提到餐馆,那么就可以在不跳转的情况下进行谷歌搜索。App Links通过App Links功能,Android平台能够向网络服务器提出申请,自主识别链接内容。直接跳转到App客户端中,改善用户体验,有利于让用户在体验更完善的App客户端完成更多操作。此外,在Android 6.0谷歌还加入了Android Pay进一步强化移动支付,同时也是为了对抗Apple Pay。在发布会上谷歌表示Android 6.0将在下周开始推送,Nexus5/6/7/9以及Nexus Player将能够在第一时间得到升级。Android7.0分屏多任务进入后台多任务管理页面,然后按住其中一个卡片,然后向上拖动至顶部即可开启分屏多任务,支持上下分栏和左右分栏,允许拖动中间的分割线调整两个APP所占的比例。目前,安卓7.0开发者预览版支持全部第三方应用尝试分屏操作,但个别应用适配可能存在问题,分屏后可能导致界面显示不全等问题.全新下拉快捷开关页在安卓7.0中,下拉打开通知栏顶部即可显示5个用户常用的快捷开关,支持单击开关以及长按进入对应设置。如果继续下拉通知栏即可显示全部快捷开关,此外在快捷开关页右下角也会显示一个“编辑”按钮,点击之后即可自定义添加/删除快捷开关,或拖动进行排序。通知消息快捷回复安卓7.0加入了全新的API,支持第三方应用通知的快捷操作和回复,例如来电会以横幅方式在屏幕顶部出现,提供接听/挂断两个按钮;信息/社交类应用通知,还可以直接打开键盘,在输入栏里进行快捷回复。通知消息归拢安卓7.0会将同一应用的多条通知提示消息归拢为一项,点击该项即可展开此前的全部通知,允许用户对每个通知执行单独操作。夜间模式安卓7.0中重新加入了夜间深色主题模式,该功能依然需要在系统调谐器中开启,从顶部下划打开快捷设置页,然后长按其中的设置图标,齿轮旋转10秒钟左右即可提示已开启系统调谐器,之后用户在设置中即可找到“系统调谐器”设置项。点开其中的“色彩和外观”,即可找到夜间模式,开启后即可使用全局的深色主题模式,同时亮度和色彩也会进行一定的调整,该功能可以基于时间或地理位置自动开启。另外,系统调谐器中也提供了RGB红绿蓝三色调节滑动条,允许用户手动精细调节,例如减少蓝色或增加红色以提供类似护眼模式的效果。流量保护模式安卓7.0新增的流量保护模式不仅可以禁止应用在后台使用流量,还会进一步减少该应用在前台时的流量使用。其具体实现原理目前尚不清楚,推测其有可能使用了类似Chrome浏览器的数据压缩技术。此外,谷歌还扩展了ConnectivityManager API的能力,使得应用可以检测系统是否开启了流量保护模式,或者检测自己是否在白名单中。安卓7.0允许用户单独针对每个应用,选择是否开启数据保护模式。全新设置样式安卓7.0启用了全新的设置样式,首先每个分类下各个子项之间的分割线消失了,只保留分类之间的分割线。全新的设置菜单还提供了一个绿色的顶栏,允许用户通过后方的下拉箭头,快速设定勿扰模式等。除了勿扰模式外,顶栏菜单还可以显示诸多其他的设置状态,例如数据流量的使用情况,自动亮度是否开启等。谷歌也在安卓7.0的设置中加入了汉堡菜单,在二级设置界面中的左上角,你就会看到这个汉堡菜单,点击后即可看到所有设置项,方便用户快速跳转。改进的Doze休眠机制谷歌在安卓7.0中对Doze休眠机制做了进一步的优化,在此前的安卓6.0中,Doze深度休眠机制对于改善安卓的续航提供了巨大的作用。而在安卓7.0中,谷歌对Doze进行了更多的优化,休眠机制的使用规则和场景有所扩展,例如只要手动在后台删掉应用卡片,关屏后该应用就会被很快深度休眠。系统级电话黑名单功能安卓7.0将电话拦截功能变成了一个系统级功能。其它应用可以调用这个拦截名单,但只有个别应用可以写入,包括拨号应用、默认的短信应用等。被拦截号码将不会出现在来电记录中,也不会出现通知。另外用户也可以通过账户体系备份和恢复这个拦截名单,以便快速导入其它设备或账号。菜单键快速应用切换双击菜单键,就能自动切换到上一个应用。此外,如果你不停地点击菜单键的话,就会在所有应用中不间断地轮换,应用窗口会自动放大,顶部还会出现倒计时条,停止点击且倒计时结束后,当前应用会自动放大并返回到前台。Android8.0的正式版 Android Oreo(奥利奥)1.通知中心用户在通知界面可以发现顶部的快捷键有了更充裕的空间,并且根据网络大数据的用户使用频繁度调整了这几个快捷键的顺序;并且长按推送消息可以看到一个开关,操作它可以开启和关闭这个该应用的未来所有通知。2.设置菜单在新的AndroidO系统中,设置的界面有了大幅变化,主菜单的覆盖性变得更广,更多的功能将在子菜单中体现,并且在菜单界面中重新设计了很多图标。3.PinnedShortcuts安卓创造出了PinnedShortcuts功能,类似苹果的3DTouch,长按一个软件后可以弹出子菜单,然后就可以通过这个方式快捷的使用该应用的部分功能。4.图标形状新的系统中开发者可以使用不同的应用图标,比如圆角矩形或者圆形图标,不过所有的图标需要保证是同一个形状,不能有一个方一个圆这样“个性”的样式出现。5.后台限制AndroidO将进一步优化后台程序,减少应用在没完全退出后占用系统的资源,并且减少电量的消耗。6.安装限制新系统中用户可以在权限设置中添加安装限制功能,这样可以有效的避免带有中国特色的“全家桶”行为。7.TensorFlowLite这个新功能并不会直接体现在手机和系统中,它是谷歌的一项新技术,用来把人工智能在更多的软件上继续拓展,并提高工作处理的效率,让你的手机更“聪明”。8.分屏在AndroidO中,分屏画中画功能得到了强化,变得更加流畅,而且悬浮窗可以随意拖动位置,然后在主屏幕中继续工作9.NotificationDots在谷歌的Pixel手机上,安卓8还新加了通知功能Notification Dots,会标出用户的行程、信息等,有些通知还可以被设定为稍后提醒。此外长按某个应用图标现在可以显示一些信息,与iOS上的3D Touch类似,这项功能在安卓7.0上已经有所体现10.SmartTextSelection系统将会预测用户将使用某些电话或者其他选项出现在将会用到的应用中,举个例子就是如果邀请朋友来吃饭,系统会根据发送的地址来开启地图并且导航 。11.自动保存密码这个功能将会保存用户的部分帐号和密码,用于在网站或者应用中的快速登录,效率提升了不少 。12.GooglePlayProtect这个功能主要用于GooglePlay中,下载的应用和游戏将会经过它的排查,来看看是否是有害甚至携带病毒的应用,不过国内用户可能不能访问GooglePlay 。13.应用加速在AndroidO中,大部分应用的启动速度将会快上一倍,这个要归功于新系统的优化,使后台占用资源减少,并且对并发进程等问题的处理更加出色,也是个相当有用的功能 。14.字体优化AndroidO中谷歌还增加了对系统字体的更多支持,开发者可以自行更改字体样式,让用户有了更多字体的选择 。15.表情符号安卓8还带来了符合Unicode 10标准的表情符号,比原来新加超过60个表情符,这也是比较明显的改变之一AndroidP 9.0新功能包括:谷歌统一推送升级、深度集成Project Treble模式、更加封闭、原生支持通话录音等。1.全面屏的全面支持2.通知栏的多种通知3.多摄像头的更多画面4.GPS定位之外的WiFi定位5.网络还有神经网络6.Material Design迎来2.0时代新设计Android 9.0将会新增支持类似于iPhone X的刘海屏设计,具体体现为优化屏幕内容显示,能够让系统或者应用充分利用整块屏幕,尤其是两只“猫耳朵”位置。在Android 9.0系统当中,谷歌还会进一步将谷歌助手集成到应用中、进一步优化电池续航、支持多屏和可折叠屏等。新特性全局黑夜模式为具备Always-on display(屏幕常显)功能手机加入原生的天气支持。参考阅读https://blog.csdn.net/u012758…阅读更多面试官:请你介绍一下你的项目经验Android面试整理(附答案)亡羊补牢,面试时如果发现回答不好,该怎么办?Android快速启动——黑白屏最优解决方案 ...

December 20, 2018 · 1 min · jiezi

android沉浸式状态栏封装—教你玩出新花样

项目中我们有时候都要用的透明状态栏(这里也成沉浸式状态栏),今天介绍一个gyf-dev写的一个封装状态栏开源框架效果图如下:正文从Android4.4开始,才可以实现状态栏着色,并且从5.0开始系统更加完善了这一功能。之前写过关于一篇 关于activity状态栏的一些总结有关Activity样式 、状态栏透明、屏幕亮度问题应用场景及其总结说明这是状态栏 这是导航栏(有些手机没有导航栏) [](https://github.com/gyf-dev/Im…第一种方案: 可直接在主题中设置 getWindow().setBackgroundDrawable(null); //设置透明状态栏 ViewGroup contentFrameLayout = (ViewGroup) findViewById(Window.ID_ANDROID_CONTENT); View parentView = contentFrameLayout.getChildAt(0); if (parentView != null && Build.VERSION.SDK_INT >= 14) { parentView.setFitsSystemWindows(true); }或者也可以这样 :第二种方案:将布局延伸到状态栏来处理,这次我们使用android:fitsSystemWindows=”true”属性,不让布局延伸到状态栏,这时状态栏就是透明的,然后添加一个和状态栏高、宽相同的指定颜色View来覆盖被透明化的状态栏。我们一步步来实现。1、第一步还是先将状态栏透明化,方法同上。2、在布局文件中添加android:fitsSystemWindows=”true”属性:封装: ImmersionBar.with(this) .transparentStatusBar() //透明状态栏,不写默认透明色 .transparentNavigationBar() //透明导航栏,不写默认黑色(设置此方法,fullScreen()方法自动为true) .transparentBar() //透明状态栏和导航栏,不写默认状态栏为透明色,导航栏为黑色(设置此方法,fullScreen()方法自动为true) .statusBarColor(R.color.colorPrimary) //状态栏颜色,不写默认透明色 .navigationBarColor(R.color.colorPrimary) //导航栏颜色,不写默认黑色 .barColor(R.color.colorPrimary) //同时自定义状态栏和导航栏颜色,不写默认状态栏为透明色,导航栏为黑色 .statusBarAlpha(0.3f) //状态栏透明度,不写默认0.0f .navigationBarAlpha(0.4f) //导航栏透明度,不写默认0.0F .barAlpha(0.3f) //状态栏和导航栏透明度,不写默认0.0f .statusBarDarkFont(true) //状态栏字体是深色,不写默认为亮色 .flymeOSStatusBarFontColor(R.color.btn3) //修改flyme OS状态栏字体颜色 .fullScreen(true) //有导航栏的情况下,activity全屏显示,也就是activity最下面被导航栏覆盖,不写默认非全屏 .hideBar(BarHide.FLAG_HIDE_BAR) //隐藏状态栏或导航栏或两者,不写默认不隐藏 .addViewSupportTransformColor(toolbar) //设置支持view变色,可以添加多个view,不指定颜色,默认和状态栏同色,还有两个重载方法 .titleBar(view) //解决状态栏和布局重叠问题,任选其一 .statusBarView(view) //解决状态栏和布局重叠问题,任选其一 .fitsSystemWindows(true) //解决状态栏和布局重叠问题,任选其一,默认为false,当为true时一定要指定statusBarColor(),不然状态栏为透明色 .supportActionBar(true) //支持ActionBar使用 .statusBarColorTransform(R.color.orange) //状态栏变色后的颜色 .navigationBarColorTransform(R.color.orange) //导航栏变色后的颜色 .barColorTransform(R.color.orange) //状态栏和导航栏变色后的颜色 .removeSupportView(toolbar) //移除指定view支持 .removeSupportAllView() //移除全部view支持 .navigationBarEnable(true) //是否可以修改导航栏颜色,默认为true .navigationBarWithKitkatEnable(true) //是否可以修改安卓4.4和emui3.1手机导航栏颜色,默认为true .fixMarginAtBottom(true) //当xml里使用android:fitsSystemWindows=“true"属性时,解决4.4和emui3.1手机底部有时会出现多余空白的问题,默认为false,非必须 .addTag(“tag”) //给以上设置的参数打标记 .getTag(“tag”) //根据tag获得沉浸式参数 .reset() //重置所以沉浸式参数 .keyboardEnable(true) //解决软键盘与底部输入框冲突问题,默认为false,还有一个重载方法,可以指定软键盘mode .init(); //必须调用方可沉浸式使用方式第一步:基础用法(已经可以满足日常沉浸式)ImmersionBar.with(this).init();第二步在activity的onDestroy方法中执行ImmersionBar.with(this).destroy(); //不调用该方法,如果界面bar发生改变,在不关闭app的情况下,退出此界面再进入将记忆最后一次bar改变的状态建议建议在BaseActivity中初始化和销毁,可以参看demo中BaseActivitypublic class BaseActivity extends AppCompatActivity { private ImmersionBar mImmersionBar; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); mImmersionBar = ImmersionBar.with(this); mImmersionBar.init(); //所有子类都将继承这些相同的属性 } @Override protected void onDestroy() { super.onDestroy(); mImmersionBar.destroy(); //不调用该方法,如果界面bar发生改变,在不关闭app的情况下,退出此界面再进入将记忆最后一次bar改变的状态 } }如何 隐藏导航栏或状态栏 /** * 隐藏导航栏或状态栏 * * @param barHide the bar hide * @return the immersion bar */ public ImmersionBar hideBar(BarHide barHide) { mBarParams.barHide = barHide; if (Build.VERSION.SDK_INT == Build.VERSION_CODES.KITKAT || OSUtils.isEMUI3_1()) { if ((mBarParams.barHide == BarHide.FLAG_HIDE_NAVIGATION_BAR) || (mBarParams.barHide == BarHide.FLAG_HIDE_BAR)) { mBarParams.navigationBarColor = Color.TRANSPARENT; mBarParams.fullScreenTemp = true; } else { mBarParams.navigationBarColor = mBarParams.navigationBarColorTemp; mBarParams.fullScreenTemp = false; } } return this; }部分问题解决华为emui3.0或者3.1手机手动隐藏导航栏按钮时,导航栏背景未被隐藏的问题什么叫做手动隐藏,就是下图中标红的向下隐藏按钮 第一种解决方案,监听华为虚拟按钮,建议在baseActivity里使用 @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); immersionBar = ImmersionBar.with(this); immersionBar.init(); if (OSUtils.isEMUI3_1()) //解决华为emui3.0与3.1手机手动隐藏底部导航栏时,导航栏背景色未被隐藏的问题 getContentResolver().registerContentObserver(Settings.System.getUriFor (“navigationbar_is_min”), true, mNavigationStatusObserver); } private ContentObserver mNavigationStatusObserver = new ContentObserver(new Handler()) { @Override public void onChange(boolean selfChange) { int navigationBarIsMin = Settings.System.getInt(getContentResolver(), “navigationbar_is_min”, 0); if (navigationBarIsMin == 1) { //导航键隐藏了 immersionBar .transparentNavigationBar() .init(); } else { //导航键显示了 immersionBar .navigationBarColor(android.R.color.black) .fullScreen(false) .init(); } } };第二种解决方案,禁止对导航栏相关设置 ImmersionBar.with(this) .navigationBarEnable(false) //禁止对导航栏相关设置 //或者 // .navigationBarWithKitkatEnable(false) //禁止对4.4设备导航栏相关设置 .init();android 6.0 有导航栏效果项目地址:https://github.com/androidsta…gyf-dev的博客地址:https://github.com/gyf-dev/Im…博客地址:http://blog.csdn.net/androids…如果你觉得此文对您有所帮助,欢迎入群 QQ交流群 :232203809 微信公众号:终端研发部 ...

December 19, 2018 · 2 min · jiezi

快速开发android,离不开这10个优秀的开源项目

作为一名菜鸡Android,时常瞻仰大佬们的开源项目是非常必要的。这里我为大家收集整理了10个优秀的开源项目,方便我们日常开发中学习!作者:ListenToCode博客:https://www.jianshu.com/p/974…KnowWeatherGitHub地址https://github.com/SilenceDut…)一款 Android 开源天气 App ,包含天气信息、详情、生活指数等,通知栏,桌面小部件,定时更新天气等等,应用没有任何广告,支持县级、区级城市的天气,原文:https://www.diycode.cc/projec…整体框架根据实际项目浅谈Android项目中的框架搭建(https://silencedut.github.io/…)关于知天气——天气尽在掌握之中(https://silencedut.github.io/…——天气尽在掌握之中/)特点支持县级、区级天气JobScheduler与JobService的使用轮询系统定时更新天气实现很多定制化很大的,对后台任务严苛的系统中(如魅族系统)通知栏常驻,并且轮询系统正常运行,很多下载量千万级的天气应用无法达到此效果无广告和强制保活拉活的行为FolioReader-AndroidGitHub地址https://github.com/FolioReade…一个 Android 开源电子书(ePub)阅读 App ,原文:https://www.diycode.cc/projec…效果图GradleAdd following dependency to your app build.gradlecompile ‘com.folioreader:folioreader:0.2.3’NBAPlusGitHub地址https://github.com/SilenceDut…一个 Android 开源 NBA 资讯和赛事信息的平台 App效果图特点遵循Android开发最佳实践的一种具体实践Retrofit2.0+RxJava+EventBus+GreenDao的使用代码结构清晰,扩展性强,易复用到其他项目结合NBAPlus Server 学习后台开发知识和接口的设计动态Blur效果。关于NBA资讯和赛事信息的平台。 全面、方便、快捷的获取新闻动态、比赛数据。 无广告、推送信息,不后台常驻,空间占用小。web后台部分在这:NBAPlus Server(https://github.com/SilenceDut…)MyDiaryGitHub地址https://github.com/DaxiaK/MyD…动漫《你的名字》同款 Android 开源 App,原文:https://www.diycode.cc/projec…效果图简诗GitHub地址https://github.com/wingjay/ji…一款优雅的中国风记录 app,包括 Android 端和 Server 端,原文:https://www.diycode.cc/projec…相关博客如何在一天之内完成一款具备cool属性的Android产品_简书(https://www.jianshu.com/p/cf4…)banyaGitHub地址(https://github.com/forezp/banya)一个基于豆瓣 API 仿网易云音乐的开源项目。原文:https://www.diycode.cc/projec…项目介绍:整体采用material design 风格,本人是网易云音乐的粉丝,所以界面模仿了网页云音乐,另外,项目中尽量使用了5.0之后的新控件。项目整体采用mvp+rxjava+retrofit 框架,使用glide进行图片展示,用butterknif注解,另外使用了java 8 新特性,拉姆达表达式,安卓原生并不支持,需要导插件,具体见项目。并对retrofit的okhttpClient进行了缓存配置,很遗憾,豆瓣API在服务端并没有对返回数据进行Cache-Control 设置。后续会采用本地数据库对数据进行缓存,初步定为使用realm。项目地址:https://github.com/forezp/banya主界面采用material design 设计风格,使用了NavigationView和DrawerLayout的抽屉效果,CoordinatorLayout和viewpager 配合,使用behavior属性,对toolbar的显示和隐藏进行了控制。使用了tablayout和viewpager配合,切换fragment,整体风格类似于网易云音乐。用到的豆瓣API有热映榜、top250、搜索图书、搜索音乐,等。yaseaGitHub地址https://github.com/begeekmyfr…带美颜滤镜的 Android 直播推流开源客户端项目,通过手机摄像头和麦克风采样,编码为H.264和AAC,再封装FLV格式,推送至RTMP服务器。延迟达到毫秒级别。Coding-AndroidGitHub地址https://github.com/Coding/Cod…编译环境 Android Studio 2.2.3,用gradle引用的许多第三方库,第一次加载会有点慢,加载完毕后要build一下,这些待下划线的类(比如 MainActivity_)会在build之后自动生成。包说明common 基类和工具类comment 评论区enter 输入框network 对网络做了一点封装photopick 图片多选控件umeng 封装了umenghide 进入staging界面maopao 冒泡界面message 消息界面model 一些数据结构project 我的项目界面setting 设置界面task 我的任务界面third 一些第三方代码user 好友界面SprayscapeGitHub地址https://github.com/googlecrea…原文https://www.diycode.cc/projec…Sprayscape内置于Unity,支持原生Android。使用适用于Unity的Google VR SDK处理陀螺仪数据和使用NatCam Unity插件进行精确的相机控制,Sprayscape将相机输入映射到360度球体上。GPU使一切成为可能。在用户点击或触摸时,相机进给以每秒60帧的纹理渲染。然后,通过GPU上的片段着色器将该纹理与任何现有纹理合成。同样的着色器还处理从2D相机到360球体的投影,创建您在app中看到的景观。当用户保存景观时,平面全景图像存储在应用数据中并写入包含所有景观的单个图集文件。地图集被加载到景观中,带有陀螺仪导航的景观画廊。共享由原生Android代码处理。当用户通过链接共享景观时,用户将使用Google OAuth登录并提示您在云端硬盘上进行读写访问。所有用户生成的内容都存储在用户的云端硬盘帐户中,因此用户可以随时删除其内容。有了适当的权限,Drive API v3会检查Sprayscape文件夹,如果缺少,则创建一个,然后上传文件。共享URL在“本机共享”对话框中呈现给用户,并且还附加到应用程序上的scape对象,以便日后轻松共享。Facebook的份额也是本地处理的。全景图被准备为具有适当EXIF数据的图像对象,以确保在Facebook上正确呈现,然后通过原生共享呈现给用户。用户选择Facebook分享到他们的网络。ListenerrMusicPlayerGitHub地址https://github.com/hefuyicode… 一款优雅的遵循 Material Design 的开源音乐播放器,UI参考 腾讯轻听 音乐播放器,使用 Lastfm Api 与 酷狗歌词Api。项目架构采用 mvp-clean,基于 Retrofit2 + Dagger2 + Rxjava + RxBus + Glide。项目特点遵循 Material Design 规范,界面清新,交互优雅。基于 MVP-CLEAN + Retrofit2 + Dagger2 + Rxjava + Glide功能模块: 我的歌曲、我的歌单、文件夹、我喜欢、最近播放、最近添加、播放排行、本地搜索等。支持显示歌词及缓存支持耳机线控播放,耳机拔出自动暂停动态刷新媒体库,及时获知媒体文件变更日夜间模式切换,支持动态换肤阅读更多面试官:请你介绍一下你的项目经验Google费尽心力推出了一个新的项目架构Android 应用防止被二次打包指南NDK项目实战—高仿360手机助手之卸载监听(Android)面试题级答案(精选版)相信自己,没有做不到的,只有想不到的在这里获得的不仅仅是技术! ...

December 17, 2018 · 1 min · jiezi