△ Duo 应用在优化前后的对比 在这篇文章中,您会了解到一个简单而又高效的方式来使您的应用在可折叠设备上运行时适配布局。...套件,您可以通过它们来为 PlayerView (显示媒体的界面) 和 PlayerControlView (播放控件的容器) 指定不同的布局。...cancel() releasePlayer() } 如果您想要了解如何初始化和释放一个 Exoplayer 实例,请查阅——Exoplayer codelab。...如果您要实现横屏功能,那么大多数时候,边界会以一个在屏幕中垂直居中的矩形来表示,它和屏幕一样宽,并且高度与铰链相同 (对于可折叠设备而言值为 0,对于双屏幕设备而言会是两个屏幕之间的距离)。...在其他的所有情况下 (非全屏) 您需要考虑导航栏或屏幕上其他 UI 组件占据的空间。 为了移动参考线,您必须指定它距离父布局底部的距离。
(1)将ExoPlayer添加为依赖项 入门的第一步是确保您的项目根目录中的build.gradle文件中包含JCenter和Google存储库。...可以将PlayerView包含在应用程序的布局xml中。...可以使用setTextOutput和setId3Output在播放过程中接收字幕和ID3元数据输出。 (4)准备播放器 在ExoPlayer中,每个media都由MediaSource表示。...已注册的监听器会收到播放状态更改以及何时发生导致播放失败的错误的通知。 实现自定义播放控制的开发人员应该注册一个监听器,并在播放器的状态发生变化时使用它来更新控件。...九、数字版权管理 在Android 4.4 (API级别19)和更高版本中,ExoPlayer支持数字版权管理(DRM)保护回放。
有时,导航栏的右侧包含一个控件,如编辑或完成按钮,用于管理活动视图中的内容。在拆分视图中,导航栏可能会出现在拆分视图的单个窗格中。...提示不需要导航时使用工具栏,或者想要多个控件来管理内容。请参阅工具栏。 导航栏标题 考虑在导航栏中显示当前视图的标题。在大多数情况下,标题可帮助人们了解他们正在查看的内容。...在一些应用程序中,大标题的大胆大胆的文字可以帮助人们浏览和搜索。例如,在标签布局中,大标题可以帮助澄清活动选项卡,并在用户滚动到顶部时通知用户。...虽然Clock应用程序具有标签式布局,但是大型标题是不必要的,因为每个标签都有一个不同的,可识别的布局。有关开发人员的指导,请参阅prefersLargeTitles。...导航栏控件 避免拥挤导管栏的控制太多。通常,导航栏不应包含视图的当前标题,后退按钮和管理视图内容的一个控件。如果您在导航栏中使用分段控件,则该栏不应包含标题或除分段控件之外的任何控件。
前言 本人之前写过一篇名为基于ExoPlayer的ExoPlayerVideoView的文章,近日发现竟然被盗用了。...请确认在工程的build.gradle中添加了JCenter和google()。...中定义 在xml中使用 ExoVideoView: <com.jarvanmo.exoplayerview.ui.ExoVideoView android:id="@+id/videoView..." android:layout_width="match_parent" android:layout_height="300dp"/> 3.在java代码中 ExoVideoView...中: videoView.setControllerDisplayMode(mode); 3.为controller添加控件 ExoVideoPlaybackController 允许在java代码中添加控件
###前言 本人之前写过一篇名为基于ExoPlayer的ExoPlayerVideoView的文章,近日发现竟然被盗用了。...请确认在工程的build.gradle中添加了JCenter和google()。...中定义 在xml中使用 ExoVideoView: <com.jarvanmo.exoplayerview.ui.ExoVideoView android:id="@+id/videoView..." android:layout_width="match_parent" android:layout_height="300dp"/> 3.在java代码中 ExoVideoView...中: videoView.setControllerDisplayMode(mode); 3.为controller添加控件 ExoVideoPlaybackController 允许在java代码中添加控件
BottomNavigationBar即底部导航栏控件。显示在应用底部的质感设计控件,用于在少量视图中切换。...TickerProviderStateMixin { // 类成员,存储底部导航栏的当前选择 int _currentIndex = 2; // 类成员,存储底部导航栏的布局和行为:在点击时会变大 BottomNavigationBarType...:存储底部导航栏的布局和行为 type: _type, // 当点击项目时调用的回调 onTap: (int index) { // 通知框架此对象的内部状态已更改 setState((){ // 当前选择的底部导航栏项目...((){ // 存储底部导航栏的布局和行为:选择值 _type = value; }); }, // 点击弹出菜单中显示的项目时调用 itemBuilder: (BuildContext context...) = <PopupMenuItem<BottomNavigationBarType [ /* * 弹出菜单中的显示项目 * 返回值:底部导航栏的布局和行为 * 子控件:文本控件 */ new PopupMenuItem
在android项目的开发中,有时为了实现和用户更好的交互,在通知栏这一小小的旮旯里,我们通常须要将内容丰富起来,这个时候我们就须要去实现自己定义的通知栏,比如以下360或者网易的样式: 首先我们要了解的是...自己定义布局文件支持的控件类型:Notification的自己定义布局是RemoteViews,因此,它仅支持FrameLayout、LinearLayout、RelativeLayout三种布局控件...这些UI控件。...对于其它不支持的控件,使用时将会抛出ClassNotFoundException异常。...以下就是详细的实现了:在这个通知栏里 我们放一个进度条 //Get the notification manager String ns = Context.NOTIFICATION_SERVICE
为了简便,直接给 JiaoZiVideoPlayer 使用 ijk 播放引擎,省去了写布局和播放逻辑的麻烦。...自定义播放器布局 JiaoZi的播放器控件是 JZVideoPlayerStandard。所有关于播放器布局控件的操作都需要通过该控件,能满足一般的视频播放需求。...a、重写 XML 如果需要给播放器添加新的控件,或者更换图片,修改按钮位置等必须要把原来的 XML 完整拷贝至新建 XML 中,控件名称建议不能修改,只添加你需要的控件就行了。...init 方法中初始化控件。...实际需求中,如果是在全屏状态才需要展示控件,那么就需要这一步操作。
“行为组件可帮助您的应用与标准 Android 服务(如通知、权限、分享和 Google 助理)相集成。...想必大家都了解过Camera API和Camera2 API,总结就是两个字,不好用。哈哈,自我感觉,在我印象中,我要照相拍一张照片,不是应该直接调用一句代码可以完成吗。...媒体和播放 “Android 多媒体框架支持播放各种常见媒体类型,以便您轻松地将音频、视频和图片集成到应用中。...通知 “通知是指 Android 在应用的界面之外显示的消息,旨在向用户提供提醒、来自他人的通信信息或应用中的其他实时信息。用户可以点按通知来打开应用,也可以直接在通知中执行某项操作。...但是也正是由于风格固定,在实际多样的APP中应用比较少。 来个?
所以,我们另外一种接入方式可以做到单引擎吗?...(exoPlayer); .......那么还有其他方式吗?...,然后,OpenGL ES 的世界是3D的,但是手机屏幕能够给我展示的终究是一个平面,只不过是在绘制的过程中利用色彩和线条让画面呈现出3D的效果。...iOS版本在开发中,相信很快就能出来。 在这个方案的实现过程中,请教过踩过这些坑的同事,特别鸣谢raymondguo,azraellong 。
1、系统层实现全屏播放 伟人曾经说过,每一个Activity都有一个自己的默认布局,这里面又包含有了一个com.android.internal.R.id.content,而且是一个FrameLayout...保存当前的状态栏、标题栏信息和列表中在屏幕位置的信息,用于恢复到原本的状态。 创建一个黑色背景的FrameLayout,充满屏幕用来承载全屏播放器F,这样全屏播放器F可以在其中执行动画效果。...(男人长一点有什么错┑( ̄Д  ̄)┍) 是否横屏,是的话先转为竖屏 恢复状态栏和标题栏 5.0以下直接清除当前列全屏播放器F,恢复视频状态 5.0以上显示让全屏播放器F过渡到原本的位置,再清除恢复视频状态...,只是这种实现在列表中是不包含逻辑播放器,逻辑播放器和全屏逻辑播放器都是一个单例,需要你手动在list列表的最外层加多一个布局做全屏播放,在每个item那里预留一个位置用于包容列表的播放器,还有一个播放按钮用于播放...逻辑和实现全屏一样,用系统的content层来承载,不同的是利用margin让视频出现在右下角,这样我们拖动的时候只要改变视频的margin,就可以让视频小窗体在它的父布局内移动啦。 ?
除此之外,在设计 Toolbar 的时候,Google也留给了开发者很多可定制修改的余地,这些可定制修改的属性在API文档中都有详细介绍,如: 设置导航栏图标; 设置App的logo; 支持设置标题和子标题...接着,我们来看下布局文件和代码实现。 首先,在布局文件 activity_tool_bar.xml 中添加进我们需要的 Toolbar 控件 ?...; Toolbar和其他控件一样,很多属性设置方法既支持代码设置,也支持在xml中设置(这里也是最最最最最坑爹的地方,如何坑爹法,请接着往下看); Toolbar 踩坑填坑 坑一:xml布局文件中,Toolbar...我猜测是因为这个控件是兼容版的控件,用 android:xxx 设置无效是的这些属性是在兼容包中,不在默认的Android SDK中,所以我们需要额外的引入。...不设置Theme的效果 最后,再给知乎的主页面做个小小的优化,它在 Android 4.4 上运行还是能够看到一条黑乎乎的通知栏,为此我把 Toolbar 和 Translucent System Bar
0x00 介绍 今天我们来看一下 SystemUI中系统通知的实现流程,希望能解决一个问题:系统通知是如何完成监听然后显示在通知栏的?...应用和系统服务的通信通道。...到这里小结一下:在构建 StatusBar过程中,通过 NotificationListener完成了系统通知的监听的注册。...现在我们回来看看通知的控件是如何创建的 0x02 通知控件的创建 当收到系统通知时,在 NotificationListener的 onNotificationPosted()方法会执行,这时候就会在主线程中执行添加或更新的操作...inflateViews()方法中会根据当前的通知是否存在进行更新或者添加,首次添加通知时会使用一个异步构建控件的接口来创建 ExpandableNotificationRow实例,这个就是在通知栏中显示的具体控件
简单ActionBar.png 值得注意的是 TitleBar 和 ActionBar 在本质上是一样的,他们都不是我们常用的控件的形式,而是绑定在 DecorView 中的,可以通过 getWindow...随后在 Android 5.0 推出了 ToolBar 控件,这是一个完全独立的控件,你可以尽情的运用了。 ?...,状态栏就会下来,我们的 UI 布局就会跑到状态栏下面,和没有设置的时候效果是一样的。...,只有我们自己的根布局(在 mContentParentParent 中,titleBar 的位置是固定的),调用才起作用。...表示是否保留系统栏的空间。可以在布局属性中设置。作用和给控件添加 "fitsSystemWindows" 属性相同。
在android的应用层中,涉及到很多应用框架,例如:Service框架,Activity管理机制,Broadcast机制,对话框框架,标题栏框架,状态栏框架,通知机制,ActionBar框架等等。...注意: Notification的自定义布局是RemoteViews,和其他RemoteViews一样,在自定义视图布局文件中,仅支持FrameLayout、LinearLayout、RelativeLayout...三种布局控件和AnalogClock、Chronometer、Button、ImageButton、ImageView、ProgressBar、TextView、ViewFlipper、ListView...、GridView、StackView和AdapterViewFlipper这些显示控件,不支持这些类的子类或Android提供的其他控件。...之后的版本中(即API >=9的版本中),在资源文件下的src/values-v9目录中的style.xml文件中设置它标题和内容的样式为: <?
那么Android5.0也同时给出了相应的解决方案,即推出MaterialDesign库,通过该库中的AppBarLayout控件,对Toolbar加以包装,从而实现顶部工具栏的动态变化效果。...(通常是Toolbar),告诉头部控件你要怎么滚,是爱咋咋滚,还是满大街滚; 具体到实现上,要在工程中做以下修改: 1、添加几个库的支持,包括appcompat-v7库(Toolbar需要)、design...RecyclerView是其中一个特工,它可用来替代ListView和GridView;替代ScrollView的则另有其人,它便是嵌套滚动视图NestedScrollView,在Android5.0之后的...所以,搜遍Android的SDK源码,总共也只有三个控件符合这个条件,它们是RecyclerView、NestedScrollView,以及SwipeRefreshLayout,在布局文件中使用的名称如下所示...2、AppBarLayout内部的高度也可能变化,比如它嵌套了可折叠工具栏布局CollapsingToolbarLayout,有关可折叠工具栏布局的详细介绍参见《Android开发笔记(一百三十六)可折叠工具栏布局
如何友好处理播放器UI 08.交互交给外部开发者 09.关于优先级视图展示 10.代码项目lib代码介绍 00.视频播放器通用框架 基础封装视频播放器player,可以在ExoPlayer、MediaPlayer...(手势滑动的快进快退提示框) 顶部控制区视图(包含返回健,title等),底部控制区视图(包含进度条,播放暂停,时间,切换全屏等) 锁屏布局视图(全屏时展示,其他隐藏),底部播放进度条视图(很多播放器都有这个...基础封装视频播放器player,可以在ExoPlayer、MediaPlayer,声网RTC视频播放器内核,原生MediaPlayer可以自由切换 对于视图状态切换和后期维护拓展,避免功能和业务出现耦合...符合开闭原则 适配器模式 这个也是事后补救模式,但是在该库中,没有尝试这种方式。...有播放完成,播放异常,播放加载,顶部标题栏,底部控制条栏,锁屏,以及手势滑动栏。如何控制它们的显示隐藏切换呢? 在addView这些视图时,大多数的view都是默认GONE隐藏的。
3、用于远程视图RemoteViews,处理远程控件上的点击动作 4、用于发送短信SmsManager,处理短信发送完的后续动作 Notification Android的消息通知栏放的是...NotificationManager便是系统通知服务的管理类,它的常用方法如下: notify : 推送指定通知到状态栏和下拉列表 cancel : 取消指定通知。...调用该方法后,状态栏和下拉列表中的指定通知将消失 cancelAll : 取消所有通知 下面是NotificationManager的调用代码例子: NotificationManager...RemoteViews 远程视图RemoteViews与页面视图一样也是从layout下的布局文件中得到,二者之间的区别主要有: 1、远程视图主要用于桌面部件与通知栏部件,而页面视图用于APP页面...第一个参数是包名,第二个参数是布局文件id setViewVisibility : 设置控件是否可见 setViewPadding : 设置控件的间距 setTextViewText : 设置TextView
写在前面 在Android设备中,播放视频和音乐是非常普遍的。Android框架提供了一个对于媒体的操作的最省代码的解决方案:MediaPlayer。...所以我们可以用诸如ijkplayer,VLC以及ExoPlayer。本文并不是讲述ExoPlayer如何使用的,而是一款基于ExoPlayer的VideoView。...ExoPlayerView是在实际工作中的产物,可能并无法完全满足各位的实际工作中的要求,但可以借鉴下。...在布局文件中引入 ExoVideoView: <com.jarvanmo.exoplayerview.ui.ExoVideoView android:id="@+id/videoView...Others 你也可以<em>在</em>横屏的时候加入一个自定义<em>布局</em>: videoView.addViewToControllerWhenLandscape(view); 你添加的<em>布局</em>将被加入FrameLayout
Android手机顶部用于显示各种通知和状态信息的这个栏叫做状态栏。 通常情况下,我们应用程序的内容都是显示在状态栏下方的。...话说为什么android:fitsSystemWindows属性,设置在CoordinatorLayout布局上就能生效,设置在FrameLayout布局上就没有效果呢?...让布局的内容延伸到状态栏的背后,如果一些可交互的控件被状态栏遮挡了怎么办?这样这些控件可能就无法点击和交互了。...但有的朋友会说,如果有些子控件我就是想要让它也延伸到状态栏区域内呢?比如我在CoordinatorLayout内放了一张图片,按照这个规则,图片也是不会显示在状态栏背后的,这样就达不到想要的效果了。...现在重新运行一下程序,效果如下图所示: 可以看到,现在我们仍然实现了沉浸式状态栏的效果,但问题是FrameLayout中的按钮也延伸到状态栏区域了,这就是前面所说的可交互控件被状态栏遮挡的问题。
领取专属 10元无门槛券
手把手带您无忧上云