├── Android 5.0 APIs.md ├── Android 5.0 Changes.md ├── Implementing Material Design in Your Android app.md ├── LICENSE ├── Material Design for Pre-Lollipop Devices.md ├── Material Design on Android Checklist.md ├── README.md └── images ├── activity_transitions.gif ├── color_attribs.png ├── contacts_toolbars.png ├── interpolators.gif ├── layering.gif ├── palette2.gif ├── ripple.gif └── title1.png /Android 5.0 APIs.md: -------------------------------------------------------------------------------- 1 | Android 5.0 APIs 2 | ============ 3 | 4 | *译自 http://developer.android.com/intl/zh-cn/about/versions/android-5.0.html —— By [NashLegend](https://github.com/NashLegend)* 5 | 6 | Sample示例在这里找:https://github.com/googlesamples/ 7 | 8 | ### API Level: 21 ### 9 | 10 | Android 5.0 ([LOLLIPOP](http://developer.android.com/intl/zh-cn/reference/android/os/Build.VERSION_CODES.html#LOLLIPOP)) 为用户和开发人员提供了一些新特性,这篇文章将重点介绍一些值得注意的新增API。 11 | 12 | 如果你已经发布了一款app,请查看这里 [Android 5.0 系统行为变化](https://github.com/NashLegend/ProjectBabel/blob/master/Android%205.0%20Changes.md) 以适配你的app. 在Android5.0上,即使你没有使用最新API或者新功能,这些新的系统行为仍可能会影响你的app。 13 | 14 | 如果想看一些新平台的更高级的特性,请看[这里](http://developer.android.com/intl/zh-cn/about/versions/lollipop.html) 15 | 16 | ### 开始开发 ### 17 | 18 | 要为Android 5.0开发app,请先使用SDK Mnager下载最新的SDK和系统镜像。 19 | 20 | ### 升级你的target API ### 21 | 22 | 为使得你的app在Android获得更好的表现,请将你的targetSdkVersion设置成21。调用最新的Android 5.0 API的时候要注意在调用前判断系统版本号以兼容之前的系统版本。不能使用低于minSdkVersion的API。详见[Android后向兼容性](http://developer.android.com/training/basics/supporting-devices/platforms.html) 23 | 24 | 欲知更多有关API级别的事儿,看这里:[啥是API级别](http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels) 25 | 26 | ## 用户界面 ## 27 | 28 | ### Material design 支持 ### 29 | 30 | Android 5.0 新增了material design样式的支持. 你可以通过material design创建具有自然的动态效果和过渡风格的app. 系统支持包括以下方面: 31 | 32 | - 系统自带Material design主题 33 | - 组件阴影 34 | - RecyclerView组件以取代ListView 35 | - *Drawable动画和样式效果*。(这里应该是指Ripple Drawable之类)(Drawable animation and styling effects) 36 | - Material design风格的动画和activity过渡效果 37 | - *基于组件状态的Animator*。(Animators for view properties based on the state of the view) 38 | - 可定制的UI组件和工具栏(这里指的应该是ToolBar) 39 | - 基于XML的矢量动画和图形(Animated and non-animated drawables) 40 | 41 | 欲知更多有关Material Design的事儿,看[这里](http://developer.android.com/training/material/index.html)。 42 | 43 | ### “最近运行”界面上的多开的文档和activity(相当于MFC等的多文档) ### 44 | 45 | 以前的版本中,“[最近运行](http://developer.android.com/intl/zh-cn/guide/components/recents.html)”界面对于一个app来说只能显示用户最近交互过的一个task。现在你的应用可以打开更多task以同时打开不同的文档。这种新的多任务特性可以让用户在最近运行界面中快速在activity们和打开的文档们之间任意切换。有可能使用这种并发任务的情景示例:浏览器标签多开、看比赛多开、生产力工具(比如Word、PPT等)文档多开、多窗口与多个妹子聊天等等。你的app可以通过[ActivityManager.AppTask](http://developer.android.com/reference/android/app/ActivityManager.AppTask.html)来管理这些task。 46 | 47 | 要让系统把你的activity当成一个新的task,在startActivity()的时候使用[FLAG_ACTIVITY_NEW_DOCUMENT](http://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_NEW_DOCUMENT),你也可以在manifest文件中把activity的```documentLaunchMode```属性设置成```"intoExisting"``` 或者 ```"always"```来实现这一点。 48 | 49 | 为了避免“最近运行”界面太多太乱,你可以设置你的app可以显示在此界面上的最大任务数量——设置manifest文件中 的属性```android:maxRecents```,目前的最大数量是每个用户50个,RAM较小的手机则为25个。 50 | 51 | 最近运行界面上的task可以设置为*重启时常驻*(persist across reboots),可以设置[android:persistableMode](http://developer.android.com/reference/android/R.attr.html#persistableMode)属性以控制常驻行为。你也可以通过[setTaskDescription()](http://developer.android.com/reference/android/app/Activity.html#setTaskDescription(android.app.ActivityManager.TaskDescription))方法修改activity在最近运行界面上的颜色、标签和图标等可见元素。 52 | 53 | ### WebView 更新 ### 54 | 55 | Android 5.0的WebView升级到了Chromium M37,修复了诸多bug以及带来了安全和稳定性的加强,默认的user-agent也已经升级到了37.0.0.0。 56 | 57 | 新的WebView引入了[PermissionRequest](http://developer.android.com/reference/android/webkit/PermissionRequest.html)类,可以允许你的app通过类似[getUserMedia()](https://developer.mozilla.org/en-US/docs/NavigatorUserMedia.getUserMedia)赋予WebView摄像头和麦克风的权限——当然前提是你的app也有相应的权限。 58 | 59 | 使用最新的[onShowFileChooser()](http://developer.android.com/reference/android/webkit/WebChromeClient.html#onShowFileChooser(android.webkit.WebView, android.webkit.ValueCallback, android.webkit.WebChromeClient.FileChooserParams))方法,你可以通过一个input选择设备里的图片和文件了。 60 | 61 | 此外,新的WebView还带来了对WebAudio,WebGL,WebRTC的支持。欲知更多WebView的新特性,请看[这里](https://developer.chrome.com/multidevice/webview/overview)。 62 | 63 | ### 屏幕捕获和分享 ### 64 | 65 | Android 5.0新增[android.media.projection](http://developer.android.com/reference/android/media/projection/package-summary.html) API以让你拥有捕获和屏幕分享功能。举个例子,如果你要在视频会议app中添加屏幕分享功能的话,就可以使用这个功能。 66 | 67 | 新的 [createVirtualDisplay()](http://developer.android.com/reference/android/media/projection/MediaProjection.html#createVirtualDisplay(java.lang.String, int, int, int, int, android.view.Surface, android.hardware.display.VirtualDisplay.Callback, android.os.Handler)) 方法 允许你的app将主屏幕内容(the default display)捕获到一个Surface对象上,这样你的app就可以通过网络对此进行分享。这个API只允许捕获非敏感屏幕内容,不能捕获声音。要进行屏幕捕获,你的app必须要先发起一个对话框请求用户同意,此请求通过发送[createScreenCaptureIntent()](http://developer.android.com/reference/android/media/projection/MediaProjectionManager.html#createScreenCaptureIntent()) 方法产生的Intent实现。 68 | 69 | 你可以查看示例项目的```MediaProjectionDemo```来学习如何使用新的API。 70 | 71 | 72 | ## 通知 ## 73 | 74 | ### 锁屏通知 ### 75 | 76 | 从Android 5.0开始可以在锁屏界面上显示通知。用户可以通过设置选择是否允许敏感通知内容显示在安全锁屏界面(secure lock screen)上。 77 | 78 | 你的应用可以控制通知内容的具体显示级别,通过调用[setVisibility()](http://developer.android.com/reference/android/app/Notification.Builder.html#setVisibility(int))方法传入下面值中的一个: 79 | 80 | - VISIBILITY_PRIVATE: 显示基本信息,比如说icon,但是隐藏具体内容。 81 | - VISIBILITY_PUBLIC: 显示通知的所有内容. 82 | - VISIBILITY_SECRET: 不显示任何东西,icon也不显示. 83 | 84 | 如果你设置的是VISIBILITY_PRIVATE,你可以设置显示敏感内容的替代信息,比如“收到了3条QQ消息”,但是不显示具体消息的联系人。要提供这种显示,首先用Notification.Builder创建一个替代通知。当创建private通知的时候,通过 [setPublicVersion()](http://developer.android.com/reference/android/app/Notification.Builder.html#setPublicVersion(android.app.Notification)) 方法将这个替代通知关联到这个隐私通知上。 85 | 86 | ### Notifications 元数据 ### 87 | 88 | Android 5.0通过关联在你的通知上的元数据对通知进行智能排序。你可以通过Notification.Builder的下面这些方法设置这些元数据: 89 | 90 | - [setCategory()](http://developer.android.com/reference/android/app/Notification.Builder.html#setCategory(java.lang.String)): 告诉系统当设备处于*优先模式*(比如这个通知表明来电、即时消息或者闹钟)时如何处理通知。 91 | - [setPriority()](http://developer.android.com/reference/android/app/Notification.Builder.html#setPriority(int)): 标记此通知的重要程度——是否比普通通知要高或者低。拥有[PRIORITY_MAX](http://developer.android.com/reference/android/app/Notification.html#PRIORITY_MAX) 或者 [PRIORITY_HIGH](http://developer.android.com/reference/android/app/Notification.html#PRIORITY_HIGH) 级别的通知在**有声音或者振动**的情况下,会弹出一个浮动窗口。 92 | - [addPerson()](http://developer.android.com/reference/android/app/Notification.Builder.html#addPerson(java.lang.String)): 允许你添加一个或者多个与此通知相关联的人。这样系统可以根据不同的人把通知分开,并按人物重要性排序。 93 | 94 | ## 图形 ## 95 | 96 | ### 对OpenGL ES 3.1的支持 ### 97 | 98 | Android 5.0为OpenGL ES 3.1增加java接口和native支持。3.1重要的新增功能包括: 99 | 100 | - 计算着色器(Compute Shaders) 101 | - 独立的着色器对象 102 | - 间接呼叫指令 103 | - 多重采样和模版纹理 104 | - 着色语言改进 105 | - 高级混合模式和调试扩展。 106 | - 对OpenGL ES 2.0 和 3.0和后向兼容性 107 | 108 | OpenGL ES 3.1 的java接口是[GLES31](http://developer.android.com/reference/android/opengl/GLES31.html)。使用OpenGL ES 3.1的时候,请在manifest里面使用标签及```android:glEsVersion```属性声明之,例如: 109 | 110 | ``` 111 | 112 | 113 | ... 114 | 115 | ``` 116 | 117 | 欲知更多OpenGL ES的信息,包括设备对OpenGL支持的版本,请看[OpenGL ES指南](http://developer.android.com/guide/topics/graphics/opengl.html)。 118 | 119 | ### Android 扩展包 ### 120 | 121 | 除了OpenGL ES 3.1,这个版本还提供了拥有java接口和native支持的扩展包以提供高级图形功能。这个扩展包作为一个独立的包发布 122 | 123 | 扩展包支持: 124 | 125 | *这块儿不懂* 126 | 127 | Guaranteed fragment shader support for shader storage buffers, images, and atomics (Fragment shader support is optional in OpenGL ES 3.1.) 128 | Tessellation and geometry shaders 129 | ASTC (LDR) texture compression format 130 | Per-sample interpolation and shading 131 | Different blend modes for each color attachment in a frame buffer 132 | 133 | The Java interface for the extension pack is provided with GLES31Ext. In your app manifest, you can declare that your app must be installed only on devices that support the extension pack. For example: 134 | 135 | ``` 136 | 137 | 139 | ... 140 | 141 | ``` 142 | 143 | ## 媒体 ## 144 | 145 | ### 高级相机功能的相机API ### 146 | 147 | Android 5.0引入了新的[android.hardware.camera2](http://developer.android.com/reference/android/hardware/camera2/package-summary.html) API以帮助fine-grain照片捕捉和图像处理,你可以编程的方式通过调用[getCameraIdList()](http://developer.android.com/reference/android/hardware/camera2/CameraManager.html#getCameraIdList()) 获取系统的可用相机设备列表并通过。你可以通过 [openCamera()](http://developer.android.com/reference/android/hardware/camera2/CameraManager.html#openCamera(java.lang.String, android.hardware.camera2.CameraDevice.StateCallback, android.os.Handler)) 方法指定其中一个相机设备。要捕捉图像,创建一个[CameraCaptureSession](http://developer.android.com/reference/android/hardware/camera2/CameraCaptureSession.html)并将捕获到的图像绘制到一个Surface对象上。 CameraCaptureSession可设置为单拍或者一次性连拍多张(take single shots or multiple images in a burst)。 148 | 149 | 需要继承[CameraCaptureSession.CaptureCallback](http://developer.android.com/reference/android/hardware/camera2/CameraCaptureSession.CaptureCallback.html)类并设置到图像捕获请求里以获得图像捕获完成事件。当系统完成图像捕获的时候,CameraCaptureSession.CaptureCallback将接到一个[onCaptureCompleted()](http://developer.android.com/reference/android/hardware/camera2/CameraCaptureSession.CaptureCallback.html#onCaptureCompleted(android.hardware.camera2.CameraCaptureSession, android.hardware.camera2.CaptureRequest, android.hardware.camera2.TotalCaptureResult))回调,返回给你一个包含图像元数据的 [CaptureResult](http://developer.android.com/reference/android/hardware/camera2/CaptureResult.html)。 150 | 151 | [CameraCharacteristics](http://developer.android.com/reference/android/hardware/camera2/CameraCharacteristics.html)类可以让你的app检查此设备的相机支持哪些特性。此对象的[INFO_SUPPORTED_HARDWARE_LEVEL](http://developer.android.com/reference/android/hardware/camera2/CameraCharacteristics.html#INFO_SUPPORTED_HARDWARE_LEVEL)属性表示相机功能级别。 152 | 153 | - 所有的设备至少可达到[INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY](http://developer.android.com/reference/android/hardware/camera2/CameraMetadata.html#INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY)级别的硬件支持,此级别功能大致相当于已弃用的[Camera](http://developer.android.com/reference/android/hardware/Camera.html) API(*注:此API在API21开始弃用*)。 154 | - 达到[INFO_SUPPORTED_HARDWARE_LEVEL_FULL](http://developer.android.com/reference/android/hardware/camera2/CameraMetadata.html#INFO_SUPPORTED_HARDWARE_LEVEL_FULL)级别硬件支持的设备可以手动控制图像的捕捉和后期处理以及以高帧频捕获高分辨率的图像。 155 | 156 | 要查看如何使用最新的camera2 API,请查看SDK示例中的```Camera2Basic``` 和 ```Camera2Video``` 157 | 158 | ### 音频回放 ### 159 | 160 | 此版本包含[AudioTrack](http://developer.android.com/reference/android/media/AudioTrack.html)的以下变化: 161 | 162 | - 你的app现在可以用浮点格式([ENCODING_PCM_FLOAT](http://developer.android.com/reference/android/media/AudioFormat.html#ENCODING_PCM_FLOAT))提供音频数据。可以获得更大的动态范围,more consistent precision和greater headroom。浮点运算在*中间值计算*(intermediate calculation)的时候尤其有用。Playback endpoints use integer format for audio data, and with lower bit depth. (In Android 5.0, portions of the internal pipeline are not yet floating point.) 163 | - 你现在可以ByteBuffer方式提供音频数据,就像提供给[MediaCodec](http://developer.android.com/reference/android/media/MediaCodec.html)的数据一样。 164 | - [WRITE_NON_BLOCKING](http://developer.android.com/reference/android/media/AudioTrack.html#WRITE_NON_BLOCKING)模式可以帮助某些app简化缓冲和多线程工作(simplify buffering and multithreading)。 165 | 166 | ### 媒体播放控制 ### 167 | 168 | 使用新的通知和媒体API以确保系统UI知道你的媒体播放情况并提取和显示专辑信息。使用新的[MediaSession](http://developer.android.com/reference/android/media/session/MediaSession.html) 和 [MediaController](http://developer.android.com/reference/android/media/session/MediaController.html)类可使得通过UI和service控制播放变得更加简单。 169 | 170 | 新的MediaSession类取代了已弃用的[RemoteControlClient](http://developer.android.com/reference/android/media/RemoteControlClient.html),它提供一套回调方法以处理*各种播放行为(差不多这么翻译吧,无非是快进快退暂停以及其他控制等等)* (transport controls and media buttons)。如果你的app提供媒体播放功能并且运行在Android TV或者Wear平台上,也可以通过MediaSession类使用相同的回调方法处理*播放行为*(transport controls)。 171 | 172 | 现在你可以使用[MediaController](http://developer.android.com/reference/android/media/session/MediaController.html)类创建自己的媒体控制器app。这个类提供了一个线程安全的方式以在你的UI线程上监控和控制媒体的播放行为。创建控制器的时候,指定一个[MediaSession.Token](http://developer.android.com/reference/android/media/session/MediaSession.Token.html)对象以便与给定的MediaSession交互。 173 | 174 | 通过使用[MediaController.TransportControls](http://developer.android.com/reference/android/media/session/MediaController.TransportControls.html)方法,你可以传达诸如 [play()](http://developer.android.com/reference/android/media/session/MediaController.TransportControls.html#play()), [stop()](http://developer.android.com/reference/android/media/session/MediaController.TransportControls.html#stop()), [skipToNext()](http://developer.android.com/reference/android/media/session/MediaController.TransportControls.html#skipToNext()), 和 [setRating()](http://developer.android.com/reference/android/media/session/MediaController.TransportControls.html#setRating(android.media.Rating))命令以控制MediaSession上的媒体播放。你也可以注册一个[MediaController.Callback](http://developer.android.com/reference/android/media/session/MediaController.Callback.html)回调对象以监听session上的*元数据和状态变化*(metadata and state changes)。 175 | 176 | 此外,你还可以通过最新的[Notification.MediaStyle](http://developer.android.com/reference/android/app/Notification.MediaStyle.html)类创建rich notification以控制mediasession播放。 177 | 178 | ### 媒体浏览 ### 179 | 180 | Android 5.0引入了新的[android.media.browse](http://developer.android.com/reference/android/media/browse/package-summary.html) API,你的app可以使用此api浏览其他app的媒体库。继承[MediaBrowserService](http://developer.android.com/reference/android/service/media/MediaBrowserService.html)类以对外暴露你的app的媒体内容。你继承的MediaBrowserService应该提供MediaSession.Token的接入口以便其他应用可以通过它播放你提供的媒体内容。 181 | 182 | 若要与媒体浏览服务交互,请使用[MediaBrowser](http://developer.android.com/reference/android/media/browse/MediaBrowser.html)类。创建MediaBrowser实例时,请为MediaSession指定一个组件名。通过这个MediaBrowser实例,你的app可以连接到关联的service并获得一个暴露出来的MediaSession.Token对象。 183 | 184 | ## 存储 ## 185 | 186 | ### 目录选择 ### 187 | 188 | Android 5.0扩展了*存储框架*(Storage Access Framework),用户可以借此将一个文件夹(包括其子文件和文件夹)的读写权限赋予一个app。 189 | 190 | 要选择一个文件夹,请发出一条[OPEN_DOCUMENT_TREE](http://developer.android.com/reference/android/content/Intent.html#ACTION_OPEN_DOCUMENT_TREE) intent 即可。系统会列出所有支持文件夹选择的[DocumentsProvider](http://developer.android.com/reference/android/provider/DocumentsProvider.html)来让用户浏览并选择一个文件夹,返回值是选中的文件夹的URI。然后你就可以使用 [buildChildDocumentsUriUsingTree()](http://developer.android.com/reference/android/provider/DocumentsContract.html#buildChildDocumentsUriUsingTree(android.net.Uri, java.lang.String)) 、 [buildDocumentUriUsingTree()](http://developer.android.com/reference/android/provider/DocumentsContract.html#buildDocumentUriUsingTree(android.net.Uri, java.lang.String)) 和 [query()](http://developer.android.com/reference/android/content/ContentResolver.html#query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String)) 浏览此文件夹的子目录了。 191 | 192 | 新的 [createDocument()](http://developer.android.com/reference/android/provider/DocumentsContract.html#createDocument(android.content.ContentResolver, android.net.Uri, java.lang.String, java.lang.String)) 方法使得你可以在上面选择的文件夹及其子文件夹下面创建新文档或者文件夹。要操作已经存在的文件,请使用 [renameDocument()](http://developer.android.com/reference/android/provider/DocumentsContract.html#renameDocument(android.content.ContentResolver, android.net.Uri, java.lang.String)) 和 [deleteDocument()](http://developer.android.com/reference/android/provider/DocumentsProvider.html#deleteDocument(java.lang.String)). 调用这此方法之前先检查 [COLUMN_FLAGS](http://developer.android.com/reference/android/provider/DocumentsContract.Document.html#COLUMN_FLAGS) 以确定provider对这些方法是否。分别是:[FLAG_SUPPORTS_WRITE](http://developer.android.com/reference/android/provider/DocumentsContract.Document.html#FLAG_SUPPORTS_WRITE),[FLAG_SUPPORTS_DELETE](http://developer.android.com/reference/android/provider/DocumentsContract.Document.html#FLAG_SUPPORTS_DELETE),[FLAG_SUPPORTS_THUMBNAIL](http://developer.android.com/reference/android/provider/DocumentsContract.Document.html#FLAG_SUPPORTS_THUMBNAIL),[FLAG_DIR_PREFERS_GRID](http://developer.android.com/reference/android/provider/DocumentsContract.Document.html#FLAG_DIR_PREFERS_GRID),[FLAG_DIR_PREFERS_LAST_MODIFIED](http://developer.android.com/reference/android/provider/DocumentsContract.Document.html#FLAG_DIR_PREFERS_LAST_MODIFIED))。 193 | 194 | 如果你实现了一个[DocumentsProvider](http://developer.android.com/reference/android/provider/DocumentsProvider.html)并且想要支持子目录选择,请实现[isChildDocument()](http://developer.android.com/reference/android/provider/DocumentsProvider.html#isChildDocument(java.lang.String, java.lang.String))方法并将[FLAG_SUPPORTS_IS_CHILD](http://developer.android.com/reference/android/provider/DocumentsContract.Root.html#FLAG_SUPPORTS_IS_CHILD)放到[COLUMN_FLAGS](http://developer.android.com/reference/android/provider/DocumentsContract.Root.html#COLUMN_FLAGS)里。 195 | 196 | Android 5.0同时也引入了新的共享存储区上的package-specific目录,你可以在为里存储媒体文件,这些媒体文件可以被包含进[MediaStore](http://developer.android.com/reference/android/provider/MediaStore.html)里,新的 [getExternalMediaDirs()](http://developer.android.com/reference/android/content/Context.html#getExternalMediaDirs())方法返回你的app在所有共享存储设备上的媒体存储目录。像[getExternalFilesDir()](http://developer.android.com/reference/android/content/Context.html#getExternalFilesDir(java.lang.String))一样不需要特殊权限。系统会定时扫描这些文件夹中的媒体内容,当然你也可以使用[MediaScannerConnection](http://developer.android.com/reference/android/media/MediaScannerConnection.html)自行扫描新内容。*(大哥们不要把缓存的图片放这儿啊,~~好想把那些将缓存图片直接放到sd卡某个目录下的人拉出来打一顿~~)* 197 | 198 | ## 无线连接 ## 199 | 200 | ### 多网络连接(Multiple network connections) ### 201 | 202 | Android 5.0支持新的多网络连接API以使你的app可以*根据特定功能*(with specific capabilities)动态扫描可用的网络并建立连接。当你的app需要指定网络——SUPL(无线位置服务), 彩信或者运营商计费网络——才能用或者要通过一个特定的协议才能传输你的数据的时候,这个功能就派上用场了。 203 | 204 | 你的app动态选择并连接一个网络连接的步骤如下: 205 | 206 | 1. 新建一个[ConnectivityManager](http://developer.android.com/reference/android/net/ConnectivityManager.html). 207 | 2. 使用[NetworkRequest.Builder](http://developer.android.com/reference/android/net/NetworkRequest.Builder.html) 类创建一个[NetworkRequest](http://developer.android.com/reference/android/net/NetworkRequest.html)对象并指定你的app需要的网络特性和传输类型。 208 | 3. 要扫描合适的网络,请调用[requestNetwork()](http://developer.android.com/reference/android/net/ConnectivityManager.html#requestNetwork(android.net.NetworkRequest, android.net.ConnectivityManager.NetworkCallback)) 或者 [registerNetworkCallback()](http://developer.android.com/reference/android/net/ConnectivityManager.html#registerNetworkCallback(android.net.NetworkRequest, android.net.ConnectivityManager.NetworkCallback)), 并将NetworkRequest对象和一个 [ConnectivityManager.NetworkCallback](http://developer.android.com/reference/android/net/ConnectivityManager.NetworkCallback.html)作为参数传过去。如果你要在合适的网络被扫描到之后就切换到这个网络,请调用用 [requestNetwork()](http://developer.android.com/reference/android/net/ConnectivityManager.html#requestNetwork(android.net.NetworkRequest, android.net.ConnectivityManager.NetworkCallback)) 方法 如果仅仅接收扫描结果而不切换网络的话,请使用[registerNetworkCallback()](http://developer.android.com/reference/android/net/ConnectivityManager.html#registerNetworkCallback(android.net.NetworkRequest, android.net.ConnectivityManager.NetworkCallback)) 方法. 209 | 当系统探测到一个合适的网络时连接到这个网络并调用[onAvailable()](http://developer.android.com/reference/android/net/ConnectivityManager.NetworkCallback.html#onAvailable(android.net.Network))方法。你可以使用这个方法传进来的[Network](http://developer.android.com/reference/android/net/Network.html)对象得到这个网络更多的信息或者使用此网络。 210 | 211 | ### 低功耗蓝牙 ### 212 | 213 | (*表示不懂……*) 214 | 215 | Android 4.3引入了对Bluetooth Low Energy (Bluetooth LE)的平台支持in the central role(咋理解)。从Android 5.0开始,Android设备可以像低功耗蓝牙外设一样了。应用可以使用些功能使得附近的设备探测到你的存在。比如说,你可以创建一个计步器应用或者健康状况监视应用并与另外一个低功耗蓝牙外设建立数据连接。 216 | 217 | 使用新的[android.bluetooth.le](http://developer.android.com/reference/android/bluetooth/le/package-summary.html) API,你的app可以*广播广告*(broadcast advertisements)、*扫描响应*(scan for responses)并与附近的低功耗蓝牙设备连接。要使用新的广播和扫描特性,请在manifest文件中添加[BLUETOOTH_ADMIN](http://developer.android.com/reference/android/Manifest.permission.html#BLUETOOTH_ADMIN)权限。当用户下载或者更新你的app时,会被请求允许这些权限。 218 | 219 | 要开始Bluetooth LE advertising以便别的设备可以发现你的app,请调用[startAdvertising()](http://developer.android.com/reference/android/bluetooth/le/BluetoothLeAdvertiser.html#startAdvertising(android.bluetooth.le.AdvertiseSettings, android.bluetooth.le.AdvertiseData, android.bluetooth.le.AdvertiseCallback))将一个[AdvertiseCallback](http://developer.android.com/reference/android/bluetooth/le/AdvertiseCallback.html)作为参数传进去。这个callback对象会接收advertising功能或者失败的消息。 220 | 221 | Android 5.0 引入了[ScanFilter](http://developer.android.com/reference/android/bluetooth/le/ScanFilter.html),这样你的app就可以只搜索你需要的特定类型的设备。调用[startScan()](http://developer.android.com/reference/android/bluetooth/le/BluetoothLeScanner.html#startScan(android.bluetooth.le.ScanCallback))方法并传递进一个filter列表以扫描低功耗蓝牙设备——你必须提供一个[ScanCallback](http://developer.android.com/reference/android/bluetooth/le/ScanCallback.html)以在Bluetooth LE advertisement被发现后可以报告。(............) 222 | 223 | ### NFC增强 ### 224 | 225 | Android 5.0对NFC进行了以下增强以使其得以更广泛和灵活的应用: 226 | 227 | - Android Beam 可以在分享按钮中使用了。 228 | - 你的应用可以通过[invokeBeam()](http://developer.android.com/reference/android/nfc/NfcAdapter.html#invokeBeam(android.app.Activity))调用Android Beam以分享数据。避免了用户必须自己手动操作设备以来分享数据的麻烦。 229 | - 你现在可以使用[createTextRecord()](http://developer.android.com/reference/android/nfc/NdefRecord.html#createTextRecord(java.lang.String, java.lang.String))方法创建包含UTF-8文本格式数据的NDEF记录。 230 | - 如果你在开发一款支付类应用,你现在可以对过调用[registerAidsForService()](http://developer.android.com/reference/android/nfc/cardemulation/CardEmulation.html#registerAidsForService(android.content.ComponentName, java.lang.String, java.util.List))以动态地注册一个NFC应用ID(AID)。你也可以使用[setPreferredService()](http://developer.android.com/reference/android/nfc/cardemulation/CardEmulation.html#setPreferredService(android.app.Activity, android.content.ComponentName))方法用于在某个特定的acitivy处于前台时指定一个偏好的Card Emulation服务。 231 | 232 | ## Project Volta ## 233 | 234 | 除了新特性之外(?),Android 5.0还*重点突出了对电池寿命的提升*(emphasizes improvements in battery life)。使用新的API和工具可以查看并优化你的app的电量使用。 235 | 236 | ### Scheduling jobs ### 237 | 238 | Android 5.0提供一个新的[JobScheduler](http://developer.android.com/reference/android/app/job/JobScheduler.html) API以让你通过使系统推迟一些时间或者在特定条件下(比如充电中)异步执行某些任务以优化电池寿命。在下面情况下这很有用。 239 | 240 | - 应用有可延后执行的后台任务。 241 | - 应用有你想在充电时才执行的任务。 242 | - 应用有需要网络或者WIFI才能执行的任务。 243 | - 应用有一些要*定期统一执行*(run as a batch on a regular schedule)的任务。 244 | 245 | *一批任务*(A unit of work)同一个[JobInfo](http://developer.android.com/reference/android/app/job/JobInfo.html)对象封装,这个对象指定了任务如何安排。 246 | 247 | 使用[JobInfo.Builder](http://developer.android.com/reference/android/app/job/JobInfo.Builder.html)类来设置如何安排这些任务的运行时刻表,你可以安排任务在正面情况下运行,比如: 248 | 249 | - 设备充电时开始执行。 250 | - 设备连接到非计费网络时开始执行。 251 | - 设置空闲时开始执行。 252 | - 在某个deadline前或者某个delay后结束执行。 253 | 254 | 举例,如果你想在设备连接到非计费网络时执行,可以这样做: 255 | 256 | ``` 257 | JobInfo uploadTask = new JobInfo.Builder(mJobId, 258 | mServiceComponent /* JobService component */) 259 | .setRequiredNetworkCapabilities(JobInfo.NetworkType.UNMETERED) 260 | .build(); 261 | JobScheduler jobScheduler = 262 | (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE); 263 | jobScheduler.schedule(uploadTask); 264 | ``` 265 | 266 | 如果设备有一个稳定的电源(进入充电状态超过两分钟并且电量处于[健康水平](http://developer.android.com/reference/android/content/Intent.html#ACTION_BATTERY_OKAY)),系统就会执行被安排好的任务,*即使该任务的deadline还没有过期*(???even if the job’s deadline has not expired)。 267 | 268 | 要查看如何使用JobScheduler API,请查看Sample中的JobSchedulerSample。 269 | 270 | ### 电量使用开发工具 ### 271 | 272 | 新的```dumpsys batterystats```命令可以返回你感兴趣的按唯一的UID组织的电量使用数据。数据包括以下几方面: 273 | 274 | - 电池相关事件历史。 275 | - 设备的全局数据。 276 | - 每个UID和系统组件的粗略的电量使用。 277 | - Per-app mobile ms per packet 278 | - 系统UID总数据。 279 | - 应用UID总数据。 280 | 281 | 使用```--help```可以学习更多的参数选项以输出你想要的数据。比如,要输出上次充电后某个指定app的电量使用数据,执行如下命令: 282 | 283 | ``` 284 | $ adb shell dumpsys batterystats --charged 285 | ``` 286 | 287 | 你可以对上面的命令的输出数据使用[Battery Historian](https://github.com/google/battery-historian)工具来生成HTML页面以方便查看。 288 | 289 | ## Android在办公和教育中的应用 ## 290 | 291 | (*不知所云,一片胡扯,译者处于昏迷状态*) 292 | 293 | ### Managed provisioning ### 294 | 295 | Android 5.0 为在办公环境中运行的app提供了新的功能。如果用户已经在设备上有了一个个人账户,设备管理员可以启动一个*管理配置进程*(managed provisioning process)以再添加一个共存但是相互独立的profile。受管理的profiles关联的app与非受管理的app并列出现在Launcher、最近任务和通知里面。 296 | 297 | 要启动*管理配置进程*,发起一个[ACTION_PROVISION_MANAGED_PROFILE](http://developer.android.com/reference/android/app/admin/DevicePolicyManager.html#ACTION_PROVISION_MANAGED_PROFILE) Intent。如果调用成功的话,系统回调[onProfileProvisioningComplete()](http://developer.android.com/reference/android/app/admin/DeviceAdminReceiver.html#onProfileProvisioningComplete(android.content.Context, android.content.Intent))。然后你可以调用[setProfileEnabled() ](http://developer.android.com/reference/android/app/admin/DevicePolicyManager.html#setProfileEnabled(android.content.ComponentName))来启动这个受管理的profile。 298 | 299 | 默认情况下,在受管理的profile里面只有很少的app可用。你可以在受管理profile里面调用[enableSystemApp()](http://developer.android.com/reference/android/app/admin/DevicePolicyManager.html#enableSystemApp(android.content.ComponentName, android.content.Intent))来使其他app在包含进profile中。 300 | 301 | 如果你在开发一款Launcher程序,可以使用新的[LauncherApps](http://developer.android.com/reference/android/content/pm/LauncherApps.html)类来获取可展示到Launcher上的的activity列表——当然只能是属于当前用户和相关的受管理的profiles的。你的Launcher可以通过加入一个工作标志来使得使受管理的app突出显示出来,通过[getUserBadgedIcon()](http://developer.android.com/reference/android/content/pm/PackageManager.html#getUserBadgedIcon(android.graphics.drawable.Drawable, android.os.UserHandle))方法可以取得这种带标志的图标。 302 | 303 | 查看Sample中的```BasicManagedProfile```来学习如何使用这些新功能。 304 | 305 | ### *设备所有者*(Device owner) ### 306 | 307 | Android 5.0 引入了可以部署```设备所有者```app的能力,```设备所有者```是一个拥有创建和删除子用户以及配置全局设置的*特殊类型的*(specialized type)设备管理员。你的所有者应用可以使用[DevicePolicyManager](http://developer.android.com/reference/android/app/admin/DevicePolicyManager.html)里面的方法的对设备配置、安全策略的应用*进行细粒度的控制*(take fine-grain control)。一个设备在同一时间只能有一个活动的设备所有者。 308 | 309 | 要部署并激活设备所有者,在设备的unprovisioned状态下,进行从一个*编程应用*(programming app)到设备NFC数据传输。传输的数据和上面刚刚提到的provisioning intent中的数据相同。 310 | 311 | ### 屏幕固定 ### 312 | 313 | Android 5.0 引入了新的屏幕固定API,可以让用户暂时限制在一个任务中无法离开,此时也不会被通知所干扰。如果你正在开发*一款教育应用以在Android支持高风险的评估要求或者目的单一的或者Kiosk应用程序*(an education app to support high stakes assessment requirements on Android, or a single-purpose or kiosk application——*这啥意思,口吐白沫中*)的时候,你就可以考虑使用这个API。一旦你的app启动了屏幕固定,用户就将看不到通知、打开其他app或者返回桌面,直到退出这种模式。 314 | 315 | 有两种方式启动屏幕固定: 316 | 317 | - **手动固定**:用户可以拖动开启屏幕固定。设置>安全>屏幕固定,然后选择在最近任务界面选择在固定的任务。 318 | - **编程固定**:要通过编码实现屏幕固定,在你的app中调用[startLockTask()](http://developer.android.com/reference/android/app/Activity.html#startLockTask())方法。如果请求的app不是*设备所有者*(device owner),用户会被弹出一个询问提示。设备所有者可以调用[setLockTaskPackages()](http://developer.android.com/reference/android/app/admin/DevicePolicyManager.html#setLockTaskPackages(android.content.ComponentName, java.lang.String[]))方法以使得某个app可以不经过用户确认就进步屏幕固定状态。 319 | 320 | 任务锁定后,会: 321 | 322 | - 状态栏变空,用户通知和状态信息被隐藏。 323 | - 主屏幕和最近任务按钮被隐藏。 324 | - 其他app打不开新的activity。 325 | - 只要不开启新的task,当前app可以打开新的activity。 326 | - 如果屏幕固定是由设备所有者启动,用户仍旧会锁定在你的app下直到调用了[stopLockTask()](http://developer.android.com/reference/android/app/admin/DevicePolicyManager.html#setLockTaskPackages(android.content.ComponentName, java.lang.String[]))。 327 | - 如果屏幕固定由非设备所有者启动或者由用户手动启动,*用户可以通过同时按住返回的最近任务按钮退出*(the user can exit by holding both the Back and Recent buttons) 328 | 329 | ## 打印框架 ## 330 | 331 | ### 以bitmap渲染PDF ### 332 | 333 | 现在可以用新的[PdfRenderer](http://developer.android.com/reference/android/graphics/pdf/PdfRenderer.html)类将PDF页面渲染成bitmap来渲染。必须指定一个可搜索(内容可以随机访问)的[ParcelFileDescriptor](http://developer.android.com/reference/android/os/ParcelFileDescriptor.html),系统会在它上面写入可打印数据。通过调用[openPage()](http://developer.android.com/reference/android/graphics/pdf/PdfRenderer.html#openPage(int))方法,你的app可以得到一个待渲染页面,然后调用[render()](http://developer.android.com/reference/android/graphics/pdf/PdfRenderer.Page.html#render(android.graphics.Bitmap, android.graphics.Rect, android.graphics.Matrix, int))以将打开的[PdfRenderer.Page](http://developer.android.com/reference/android/graphics/pdf/PdfRenderer.Page.html)渲染到一个bitmap上。如果你想只转换此文档的一部分的话,要传入额外的一些参数。 334 | 335 | 要查看如何使用新的API,请查看Sample里面的```PdfRendererBasic ```。 336 | 337 | ## 系统 ## 338 | 339 | ### 应用使用数据 ### 340 | 341 | 现在你可以使用[android.app.usage](http://developer.android.com/reference/android/app/usage/package-summary.html) API获取Android设备的app使用历史。这个API提供了比已经弃用的[getRecentTasks()](http://developer.android.com/reference/android/app/ActivityManager.html#getRecentTasks(int, int))方法更详细的使用数据。要使用这个API,首先要在manifest中添加```android.permission.PACKAGE_USAGE_STATS```权限,用户可以通过Settings > Security > Apps赋予此app的读取app使用数据的权限. 342 | 343 | 系统按应用分别收集使用数据,并且按天、周、月、年整合数据。系统保存数据的最长时间如下: 344 | 345 | - Daily data: 7天 346 | - Weekly data: 4周 347 | - Monthly data: 6个月 348 | - Yearly data: 2年 349 | 350 | 对于每个应用,系统记录如下数据: 351 | 352 | - 应用上次使用时间。 353 | - 对应时间段内应用前台运行总时间(by day, week, month, or year)。 354 | - 一个组件(按包名和activity名区分)在一天内被移动到前台或者后台的Timestamp capturing。 355 | - 设备设置改变(比如屏幕方向改变)的Timestamp capturing。 356 | 357 | ## 测试 & 辅助功能 ## 358 | 359 | ### 测试和可访问性改进 ### 360 | 361 | Android 5.0为测试和可访问性增加如下支持: 362 | 363 | - 新的[getWindowAnimationFrameStats()](http://developer.android.com/reference/android/app/UiAutomation.html#getWindowAnimationFrameStats())和[getWindowContentFrameStats()](http://developer.android.com/reference/android/app/UiAutomation.html#getWindowContentFrameStats(int))方法可以捕获窗口动画和内容的帧数据。这些方法使你可以编写instrumentation tests以评估app是否流畅。 364 | - 新的[executeShellCommand()](http://developer.android.com/reference/android/app/UiAutomation.html#executeShellCommand(java.lang.String))方法让你可以在instrumentation test中执行shell命令。类似于执行 adb shell,这样你可以使用一些shell工具比如```dumpsys, am, content``` 和``` pm```. 365 | - 使用accessibility APIs(比如[UiAutomator](http://developer.android.com/tools/help/uiautomator/index.html))的Accessibility Service和测试工具现在可以取得屏幕上能够进行可见交互的窗口的详细信息。要获得[AccessibilityWindowInfo](http://developer.android.com/reference/android/view/accessibility/AccessibilityWindowInfo.html)对象列表,请调用 [getWindows()](http://developer.android.com/reference/android/accessibilityservice/AccessibilityService.html#getWindows())方法。 366 | - 新的[AccessibilityNodeInfo.AccessibilityAction](http://developer.android.com/reference/android/view/accessibility/AccessibilityNodeInfo.AccessibilityAction.html)类让你可以在[AccessibilityNodeInfo](http://developer.android.com/reference/android/view/accessibility/AccessibilityNodeInfo.html)上执行标准的或者自定义的动作。新的 [AccessibilityNodeInfo.AccessibilityAction](http://developer.android.com/reference/android/view/accessibility/AccessibilityNodeInfo.AccessibilityAction.html)类取代了AccessibilityNodeInfo中的早期action API。 367 | - Android 5.0使你的app可以对文字转语音(text-to-speech synthesis)进行更细粒度的控制。有了新的Voice类,你的App可以通过指定地区, 质量和延迟率来设置声音,也可以使用*文字转语音引擎相关的特定特性*(text-to-speech engine-specific parameters)。 368 | 369 | ## IME ## 370 | 371 | ### 更容易地切换输入语言 ### 372 | 373 | 这块不翻译了,标题说的很明确了,但是输入法右下角那个切换按钮总是误触好蛋疼啊~摔~ 374 | 375 | ## Manifest 声明 ## 376 | 377 | ### Declarable required features ### 378 | 379 | 下面的一些特性已经开始在``````中支持,所以你可以确认你的app是否安装在支持你所需特性的设备上。 380 | 381 | - FEATURE_AUDIO_OUTPUT 382 | - FEATURE_CAMERA_CAPABILITY_MANUAL_POST_PROCESSING 383 | - FEATURE_CAMERA_CAPABILITY_MANUAL_SENSOR 384 | - FEATURE_CAMERA_CAPABILITY_RAW 385 | - FEATURE_CAMERA_LEVEL_FULL 386 | - FEATURE_GAMEPAD 387 | - FEATURE_LIVE_TV 388 | - FEATURE_MANAGED_USERS 389 | - FEATURE_LEANBACK 390 | - FEATURE_OPENGLES_EXTENSION_PACK 391 | - FEATURE_SECURELY_REMOVES_USERS 392 | - FEATURE_SENSOR_AMBIENT_TEMPERATURE 393 | - FEATURE_SENSOR_HEART_RATE_ECG 394 | - FEATURE_SENSOR_RELATIVE_HUMIDITY 395 | - FEATURE_VERIFIED_BOOT 396 | - FEATURE_WEBVIEW 397 | 398 | ### User permissions ### 399 | 400 | 现在``````已经支持下面的权限,如果你需要的话就加上它吧。 401 | 402 | BIND_DREAM_SERVICE: 如果目标API是21或更高, [Daydream](http://developer.android.com/about/versions/android-4.2.html#Daydream)服务需要使用这个权限。(When targeting API level 21 and higher, this permission is required by a Daydream service, to ensure that only the system can bind to it.) 403 | -------------------------------------------------------------------------------- /Android 5.0 Changes.md: -------------------------------------------------------------------------------- 1 | Android 5.0 Changes 2 | =============== 3 | 4 | *译自 http://developer.android.com/intl/zh-cn/about/versions/android-5.0-changes.html —— By [NashLegend](https://github.com/NashLegend)* 5 | 6 | ### API Level: 21 ### 7 | 8 | 除了新增特性和功能之外,Android 5.0还包含了一系列的变化,包括API变化、行为变化,系统增强以及bug修复。这篇文档将重点阐述一些你应该知道并应用到你的app里面的关键的变化。 9 | 10 | 如果你之前已经发布过一个Android app,请注意您的app有可能会受到Android 5.0的这些新变化的影响。 11 | 12 | 13 | 如果想看一些新平台的更高级的特性,请看[这里](http://developer.android.com/intl/zh-cn/about/versions/lollipop.html) 14 | 15 | ## Android Runtime (ART) ## 16 | 在Android 5.0中,ART运行时取代Dalvik成为默认运行环境,ART于Android 4.4时代作为试验特性引入 17 | 18 | 如果想看ART的新特性概述,请看[这里](https://source.android.com/devices/tech/dalvik/art.html),几个主要的特性如下: 19 | 20 | - 提前编译(AOT) 21 | - 增强的垃圾回收 22 | - 增强的debug支持 23 | 24 | 多数Android应用地ART模式下运行是没有问题的,但是有些情况下却不能。要查看适配ART的注意事项,请看[这里](http://developer.android.com/intl/zh-cn/guide/practices/verifying-apps-art.html),尤其要注意的是下面的情况: 25 | 26 | - 你的app使用了JNI来运行C/C++代码 27 | - 你使用了产生非标准代码的(比如一些代码混淆工具) 28 | - 你使用了不兼容compacting garbage collection的技术 29 | 30 | ## 通知 ## 31 | 请确保你的通知将Android 5.0的最新变化考虑了进来,要获知更多如何为Android 5.0以及更高版本系统设计你的通知的信息,请看[这里](http://developer.android.com/design/patterns/notifications.html) 32 | 33 | ###Material design样式### 34 | 35 | 通知使用深色文字以及白色(或者很浅色)的背景以适配material design样式的桌面插件。请确保你的所有通知样式统一,如果你的通知看起来有问题,请修正它们: 36 | - 使用 [setColor()](http://developer.android.com/reference/android/app/Notification.Builder.html#setColor(int))设置通知图标的背景(基准)色。 37 | - 修改或者移除包含颜色的资源。系统在action icons和通知栏图标中了忽略所有非透明通道。你应该认为这些图标只有alpha通道。系统会把通知图标绘制到白色背景,把action icons绘制到深灰色背景。 38 | 39 | ###声音和震动### 40 | 41 | 如果你现在在通知里通过Ringtone, MediaPlayer, or Vibrator 类添加了声音和震动,请移除这些代码以便系统能够在```优先模式```下正确的播放通知声和震动。你应该使用Notification.Builder方法添加声音和震动才对。 42 | 43 | 将设备设置为静音模式将使设备进入```优先模式```。如果你将设备设置为普通模式或者震动模式,设备将退出这种```优先模式```。 44 | 45 | (注:优先模式指仅对于高优先级的通知播放通知声和振动,静音模式下自动开启——静音模式下仍然有声音听起来很烦人的样子——另外也可以手动直接开启) 46 | 47 | 以前Android使用[STREAM_MUSIC](http://http://developer.android.com/reference/android/media/AudioManager.html#STREAM_MUSIC)作为master stream以控制平板设备的音量。在Android 5.0上,平板和手机设备的master volume stream已经统一了起来,[由STREAM_RING](http://http://developer.android.com/reference/android/media/AudioManager.html#STREAM_RING) 或者 [STREAM_NOTIFICATION](http://developer.android.com/reference/android/media/AudioManager.html#STREAM_NOTIFICATION)控制。 48 | 49 | ###锁屏可见性### 50 | 51 | 现在,默认情况下,通知将显示在用户的锁屏界面上,用户出于保护隐私可以选择不展示这些信息,系统会使用其他提示来表示通知的文字内容,如果想自定义这些隐私化的文字,请使用[setPublicVersion()](http://developer.android.com/reference/android/app/Notification.Builder.html#setPublicVersion(android.app.Notification))方法 52 | 53 | 如果通知不包含私人信息或者你想要允许在通知上控制媒体,请调用 [setVisibility()](http://developer.android.com/reference/android/app/Notification.Builder.html#setVisibility(int))方法并奖通知的可见级别设置为[VISIBILITY_PUBLIC](http://developer.android.com/reference/android/app/Notification.html#VISIBILITY_PUBLIC) 54 | 55 | ###媒体播放### 56 | 57 | 如果你使用展示和控制媒体播放的通知,请考虑使用最新的[Notification.MediaStyle](http://developer.android.com/reference/android/app/Notification.MediaStyle.html)模版以取代自定义的[RemoteViews.RemoteView](http://developer.android.com/reference/android/widget/RemoteViews.RemoteView.html)对象,无论你使用哪种方法,确保通知的可见性为[VISIBILITY_PUBLIC](http://developer.android.com/reference/android/app/Notification.html#VISIBILITY_PUBLIC),这样你可以在锁屏界面进行控制。请注意,自Android 5.0以后,系统不会将RemoteControlClient对象展示在锁屏界面上,要获知更多信息,请查看[如果你的app使用了RemoteControlClient](http://developer.android.com/intl/zh-cn/about/versions/android-5.0-changes.html#BehaviorMediaControl)(其实就在下面) 58 | 59 | ###浮动通知### 60 | 61 | 现在通知可以以一个悬浮小窗口的形式出现了,当然设备得是未锁屏且点亮屏幕状态。这些通知看起来像是你的通知的精简版一样,除了这些通知也可以使用action buttons。用户可以在当前正在使用的app里面选择执行也可以忽略通知动作而不必离开当前app。 62 | 63 | 下面是有可能触发浮动通知的情况。 64 | - 用户的activity处于全屏状态。 65 | - 通知具有高优先级并且使用了铃声或者震动。 66 | 67 | 这种情况下就要使用浮动通知。 68 | 69 | ## 媒体控制和 RemoteControlClient ## 70 | [RemoteControlClient](http://developer.android.com/reference/android/media/RemoteControlClient.html)类现在已经废弃,请尽快改用[MediaSession](http://developer.android.com/reference/android/media/session/MediaSession.html)API. 71 | 72 | Android 5.0的锁屏界面并不会显示你的MediaSession 或者 RemoteControlClient的控制界面。你的应用应该通过通知提供一个锁屏界面的控制界面,这样,在拥有锁屏和未锁屏状态下的连贯的用户体验的同时给予你的应用更多对于媒体按钮的控制权。 73 | 74 | Android 5.0提供了一个新的[Notification.MediaStyle](http://developer.android.com/reference/android/app/Notification.MediaStyle.html)模版以实现上述目的。你可以在Notification.Builder.addAction()为Notification.MediaStyle添加动作。通过[setSettion()](http://developer.android.com/reference/android/app/Notification.MediaStyle.html#setMediaSession(android.media.session.MediaSession.Token))方法告诉系统这个通知控制一个媒体播放会话。 75 | 76 | 请确保将通知的可见性设置为VISIBILITY_PUBLIC以确保能显示在通知界面。要查看更多信息,请看[锁屏界面通知](http://developer.android.com/intl/zh-cn/about/versions/android-5.0-changes.html#LockscreenNotifications)。 77 | 78 | 如果你的app运行在Androdi TV或者可穿戴设备上,若要展示媒体控制,请使用MediaSession类,如果你的应用要接收Android设备的媒体按钮事件的话,请使用MediaSession类。 79 | 80 | ## getRecentTasks() ## 81 | 82 | 随着Android 5.0 concurrent documents and activities tasks特性的引入,ActivityManager.getRecentTasks()方法被废弃以保护用户隐私。为了后向兼容性,这个方法仍然后返回一小部分结果,比如调用此方法的应用的的task以及一些非敏感任务(比如桌面)。如果你的app使用这个方法获得自身的task的话,请使用[getAppTasks()](http://developer.android.com/reference/android/app/ActivityManager.html#getAppTasks()) 83 | 84 | ## Android NDK的64位支持 ## 85 | 86 | Android 5.0引入了64位支持,增加了寻址空间和系统表现的同时完美兼容现在的32位系统。64位支持同样增强了OpenSSL的加密性能。此外,这个版本还增加了新的多媒体NDK API以及OpenGL ES3.1支持。 87 | 88 | 要使用64位支持,到[这里](http://developer.android.com/tools/sdk/ndk/index.html)下载NDK Revision 10c,查看[这里](http://developer.android.com/tools/sdk/ndk/index.html#Revisions)以获取更多此版NDK的信息。 89 | 90 | ## Binding to a Service ## 91 | Context.bindService()方法现在需要指定explicit Intent。如果implicit intent的话将抛出一个错误。为确保app安全性,请在启动或者绑定service的时候使用explicit intent,不要为service定义intent filters。 92 | 93 | ## WebView ## 94 | Android 5.0 改变了app的默认行为。 95 | 96 | **如果你的系统target api为21以上:** 97 | 98 | - 系统默认禁止了[mixed content](https://developer.mozilla.org/en-US/docs/Security/MixedContent)和第三方cookie。可以使用[setMixedContentMode()](http://developer.android.com/reference/android/webkit/WebSettings.html#setMixedContentMode(int)) 和 [setAcceptThirdPartyCookies()](http://developer.android.com/reference/android/webkit/CookieManager.html#setAcceptThirdPartyCookies(android.webkit.WebView, boolean))以分别启用。 99 | - The system now intelligently chooses portions of the HTML document to draw. This new default behavior helps to reduce memory footprint and increase performance. If you want to render the whole document at once, disable this optimization by calling enableSlowWholeDocumentDraw(). 100 | - 系统现在可以智能选择HTML文档的portion来绘制。这种新特性可以减少内存footprint并改进性能。若要一次性渲染整个HTML文档,可以调用这个方法[enableSlowWholeDocumentDraw()](http://developer.android.com/reference/android/webkit/WebView.html#enableSlowWholeDocumentDraw()) 101 | 102 | **如果你的app的target api低于21: **系统允许mixed content和第三方cookie,并且总是一次性渲染整个HTML文档。 103 | 104 | ## 自定义Permissions的唯一性要求 ## 105 | 如[Permissions](http://developer.android.com/guide/topics/manifest/manifest-intro.html#perms)文档所述,Android应用可以自定义permissions以限定调用某个组件的方式。应用在manifest文件中定义这此自定义permissions。 106 | 107 | 只有少数情况下我们才需要自定义permissions,很多情况下使用自定义permissions是没有必要且容易引发潜在危险的,这取决于这些permossioms的保护级别。 108 | 109 | Android系统同时引入了一种新特性以确保一个特定的自定义permissions只能被一个app定义,除非其他app有相同的签名。 110 | 111 | ###对于那些使用相同的自定义permissions的APP们### 112 | 113 | 任何app都可以自定义任何permissions,所以有可能不同的app正好使用了重名的自定义permissions。比如两个有相似功能的app就有可能这么干,或者App们可能会引入拥有相同的自定义权限的公共库或者代码示例。 114 | 115 | 在Android 4.4之前这样做是没有问题的。从Android 5.0开始,系统加入了**不同签名的应用的自定义权限必有具有唯一性**的限制,如果用户想要安装一个**拥有和某个已安装app有相同自定义权限但是签名不同**的app,系统将禁止安装。 116 | 117 | ##Considerations for your app## 118 | 119 | Android 5.0以后,app仍然可以像以前一样自定义permissions和通过请求其他app的权限。但是有了现在的限制之后,你应该认真考虑一下这些变化对你的app的影响。 120 | 121 | 下面几点是你要考虑的: 122 | 123 | - 你的应用是否在manifest声明了元素。如果是的话,它们是否对于你的app或者service是必须的,或者,是否可以用系统默认permissions代替。 124 | - 如果你使用了元素,你知道它们是哪里来的吗。 125 | - 你是否真的希望别人通过请求你的自定义权限。 126 | - 你是否只是复制粘贴了别人的包含元素的代码,这些permissions是否必须。 127 | - 你的app是否使用了别人有可能使用的permissions名字。 128 | 129 | **安装和升级软件** 130 | 131 | 如上所述,Android 5.0以后的设备对于哪些有相同自定义permissions却没有相同签名的app是禁止安装的(文档真啰嗦,这里直接省了,具体看上面) 132 | 133 | **一些建议** 134 | 135 | 在运行Android 5.0或者更高版本的设备上,我们建议您立即检查、作出修改、发布新版…… 136 | 137 | - 如果你使用了你不必须的自定义permissions,删除它们。 138 | - 如果你的app必须使用自定义permissions的话,请修改它们以确保权限名的唯一性,比如可以以包名开头。 139 | - 如果你有一套的不同签名的app使用一个自定义permissions以共用一个组件,请确保这个自定义permissions只被定义了一次。 140 | - 如果你的一套app重命名相同,那么随意,同名无所谓。 141 | 142 | *下面的不懂就不翻译了* 143 | 144 | ## TLS/SSL Default Configuration Changes ## 145 | Android 5.0 introduces changes the default TLS/SSL configuration used by apps for HTTPS and other TLS/SSL traffic: 146 | 147 | - TLSv1.2 and TLSv1.1 protocols are now enabled, 148 | - AES-GCM (AEAD) cipher suites are now enabled, 149 | - MD5, 3DES, export, and static key ECDH cipher suites are now disabled, 150 | - Forward Secrecy cipher suites (ECDHE and DHE) are preferred. 151 | 152 | These changes may lead to breakages in HTTPS or TLS/SSL connectivity in a small number of cases listed below. 153 | 154 | Note that the security ProviderInstaller from Google Play services already offers these changes across Android platform versions back to Android 2.3. 155 | 156 | **Server does not support any of the enabled ciphers suites** 157 | 158 | For example, a server might support only 3DES or MD5 cipher suites. The preferred fix is to improve the server’s configuration to enable stronger and more modern cipher suites and protocols. Ideally, TLSv1.2 and AES-GCM should be enabled, and Forward Secrecy cipher suites (ECDHE, DHE) should be enabled and preferred. 159 | 160 | An alternative is to modify the app to use a custom SSLSocketFactory to communicate with the server. The factory should be designed to create SSLSocket instances which have some of the cipher suites required by the server enabled in addition to default cipher suites. 161 | 162 | **App is making wrong assumptions about cipher suites used to connect to server** 163 | 164 | For example, some apps contain a custom X509TrustManager that breaks because it expects the authType parameter to be RSA but encounters ECDHE_RSA or DHE_RSA. 165 | 166 | **Server is intolerant to TLSv1.1, TLSv1.2 or new TLS extensions** 167 | 168 | For example, the TLS/SSL handshake with a server is erroneously rejected or stalls. The preferred fix is to upgrade the server to comply with the TLS/SSL protocol. This will make the server successfully negotiate these newer protocols or negotiate TLSv1 or older protocols and ignore TLS extensions it does not understand. In some cases disabling TLSv1.1 and TLSv1.2 on the server may work as a stopgap measure until the server software is upgraded. 169 | 170 | An alternative is to modify the app to use a custom SSLSocketFactory to communicate with the server. The factory should be designed to create SSLSocket instances with only those protocols enabled which are correctly supported by the server. 171 | -------------------------------------------------------------------------------- /Implementing Material Design in Your Android app.md: -------------------------------------------------------------------------------- 1 | 在你的Android应用中使用Material Design 2 | ============== 3 | 4 | *译自 http://android-developers.blogspot.com/2014/10/implementing-material-design-in-your.html —— By [NashLegend](https://github.com/NashLegend)* 5 | 6 | ![](https://raw.githubusercontent.com/NashLegend/ProjectBabel/master/images/title1.png) 7 | 8 | [Material Design](http://www.google.com/design/spec/#utm_campaign=L-Developer-launch)对于多屏幕的视觉、交互和动作设计作了很大的改进。Android 5.0和最新的支持包可以帮助你创建Material风格的UI。这里将概述新的Material Design风格设计、新的API和组件,你可以将它们用在你的app中。 9 | 10 | ### Tangible surfaces ### 11 | 12 | 在Material Design的世界中,UI是由[电子纸和电子墨水](https://www.youtube.com/watch?v=YaG_ljfzeUw)构建起来的。这些UI的表面和阴影为应用程序的结构提供视觉线索(也就是根据样式能看出层次关系等等,比如下图),你看他的样子就知道哪里是可触摸的部分、就可以知道它将以何种方式运动(同样如下图)。这种Didital Material可以移动、扩张和变形以创建灵活的UI界面。 13 | ![](https://raw.githubusercontent.com/NashLegend/ProjectBabel/master/images/layering.gif) 14 | 15 | #### 阴影 #### 16 | 17 | 一个surface的位置和深度决定了其光影的微妙变化。你可以使用新的elevation属性设置view在Z轴的位置,系统会依此在view后自动绘制出实时的动态阴影。你可以在layout XML里面设置elevation属性,单位是dip: 18 | ``` 19 | 21 | ``` 22 | 你也可以在代码中通过getElevation()/setElevation()(with shims in [ViewCompat](https://developer.android.com/reference/android/support/v4/view/ViewCompat.html?utm_campaign=L-Developer-launch))方法操作elevation属性。View投身的阴影是由其轮廓决定的,而默认情况下这个轮廓是由background产生的。举个栗子:如果你为一个[浮动按钮](http://www.google.com/design/spec/patterns/promoted-actions.html?utm_campaign=L-Developer-launch#promoted-actions-floating-action-button)设置了一个圆形的shape drawable背景,那么它的阴影就是圆形的。如果你想能对阴影进行更详细的控制,你可以使用[ViewOutlineProvider](https://developer.android.com/reference/android/view/ViewOutlineProvider.html?utm_campaign=L-Developer-launch)来自定义其轮廓,通过getOutline()方法可以取得这个轮廓。 23 | 24 | #### 卡片 #### 25 | 要显示一些不同的信息,使用[卡片](http://www.google.com/design/spec/components/cards.html#utm_campaign=L-Developer-launch)是一个常用模式。你可以使用新的支持包中的[CardView](https://developer.android.com/reference/android/support/v7/widget/CardView.html?utm_campaign=L-Developer-launch)轻松创建卡片式布局,新的CardView在低版本Android上也支持轮廓和阴影。 26 | ``` 27 | 30 | 31 | 32 | ``` 33 | CardView继承了FrameLayout并提供了默认的elevation和圆角,这样卡片在不同版本的系统上就拥有统一的表现。如有必要,你还可以通过设置`cardElevation`和`cardCornerRadius`自定义这些属性。但是卡片并不是实现*维度效果*的不二法门,所以别滥用。 34 | 35 | ### *印刷样式的设计*(Print-like Design) ### 36 | Material Design借鉴了印刷设计以创建简明清晰的布局,将你的内容部分突出在前面和中间。大胆的配色、刻意的留白、精致的排版和*强大的基线网格*(a strong baseline grid)产生了具有层次感、有意义、突出重点的布局. 37 | 38 | #### 字体排版 #### 39 | Android 5.0升级了系统Roboto字体,现在无论字体大小,都可以漂亮整洁地显示字体。系统还新增了一个新的适用于中等字号(android:fontFamily=”sans-serif-medium”),新的文本显示样式使用了备受好评的[字体排版缩放](http://www.google.com/design/spec/style/typography.html#typography-standard-styles)以平衡内容密度的阅读舒适度。举个栗子:你可以通过设置`android:textAppearance=”@android:style/TextAppearance.Material.Title”`轻松地使用"Title"样式,可以通过AppCompat支持包在旧版本的Android系统上使用这种样式,举个栗子:`“@style/TextAppearance.AppCompat.Title”`。 40 | 41 | #### 颜色 #### 42 | ![](https://raw.githubusercontent.com/NashLegend/ProjectBabel/master/images/color_attribs.png) 43 | 44 | 应用的[*色调*(color palette)](http://www.google.com/design/spec/style/color.html#color-ui-color-application)会为你的应用带来品牌辨识度和个性化(比如一看见红色就想到可口可乐),现在你们可以通过设置下面的属性使得这些变得更加简单。 45 | 46 | - colorPrimary. 应用的主色调、品牌颜色,用于ActionBar背景、最近运行任务界面标题以及边缘效果(比如说MIUI系统中可滚动元素滚动到边缘时出现的橙黄色)。 47 | - colorAccent. *主色调的鲜亮补充色*(Vibrant complement to the primary branding color),用于框架控件比如说EditText和Switch。(前面几句真别扭,因此注:colorAccent,不知道专业术语是啥,直译应该是突出的颜色,因此,EditText的颜色并不是colorAccent,它得到焦点后的颜色才是colorAccent,还有Switch在打开时的颜色也是colorAccent,如上图)。 48 | - colorPrimaryDark. 主色调的暗色版本,用于状态栏。 49 | 50 | 除了上面这些之外,你还可以对颜色进行更深入精细的控制,参见`colorControlNormal, colorControlActivated, colorControlHighlight, colorButtonNormal, colorSwitchThumbNormal, colorEdgeEffect, statusBarColor `和` navigationBarColor`。 51 | 52 | AppCompat支持上面功能的绝大部分,因此你可以将此应用在Android 5.0之前的系统中。 53 | 54 | #### Dynamic color —— 动态颜色 #### 55 | 56 | Material Design鼓励使用动态颜色,尤其是你的应用中有很多图片时。新的Palette支持库可以提取图片中的一部分颜色来设置你的UI的样式来使界面颜色互相搭配以提供一种沉浸式体验。提取出来的*调色板*(palette)包括*突出的和柔和的色调*(vibrant and muted tones,参见下图文字后面变化的背景色),同时可取得最佳阅读体验的文本前景色(参见下图的变化的文字颜色)。举个栗子: 57 | ``` 58 | Palette.generateAsync(bitmap, 59 | new Palette.PaletteAsyncListener() { 60 | @Override 61 | public void onGenerated(Palette palette) { 62 | Palette.Swatch vibrant = 63 | palette.getVibrantSwatch(); 64 | if (swatch != null) { 65 | // If we have a vibrant color 66 | // update the title TextView 67 | titleView.setBackgroundColor( 68 | vibrant.getRgb()); 69 | titleView.setTextColor( 70 | vibrant.getTitleTextColor()); 71 | } 72 | } 73 | }); 74 | ``` 75 | 一图胜千言。 76 | ![](https://raw.githubusercontent.com/NashLegend/ProjectBabel/master/images/palette2.gif) 77 | 78 | ### Authentic Motion —— 真实的运动### 79 | 80 | Tangible surfaces不会突兀地出现,他们出现的动作要引导用户注意力,要建立空间关联并保持连贯性。Material元素会对你的触摸事件做出响应以对本次交互进行确认,然后所有的变化将以你点击的位置为中心向外扩散。所有的动作都是有意义的和密切相关的,使用户易于理解。 81 | 82 | #### Activity 和 Fragment 切换 #### 83 | 通过声明两屏之间通用的`共享元素`,你可以在两种状态间创建流畅的切换。 84 | 85 | 86 | 一图胜千言: 87 | 88 | ![](https://raw.githubusercontent.com/NashLegend/ProjectBabel/master/images/activity_transitions.gif) 89 | 90 | 示例代码: 91 | 92 | ``` 93 | album_grid.xml 94 | … 95 | 98 | album_details.xml 99 | … 100 | 103 | 104 | AlbumActivity.java 105 | Intent intent = new Intent(); 106 | String transitionName = getString(R.string.transition_album_cover); 107 | … 108 | ActivityOptionsCompat options = 109 | ActivityOptionsCompat.makeSceneTransitionAnimation(activity, 110 | albumCoverImageView, // The view which starts the transition 111 | transitionName // The transitionName of the view we’re transitioning to 112 | ); 113 | ActivityCompat.startActivity(activity, intent, options.toBundle()); 114 | ``` 115 | 116 | 我们在两屏之间定义了相同的`transitionName`。当打开新的Activity的时候,切换过程就自动开始了。除了共享元素之外,你也可以定义[进入](https://developer.android.com/reference/android/view/Window.html?utm_campaign=L-Developer-launch#setEnterTransition(android.transition.Transition))和[退出](https://developer.android.com/reference/android/view/Window.html?utm_campaign=L-Developer-launch#setExitTransition(android.transition.Transition))元素。 117 | 118 | #### Ripples ——波纹效果#### 119 | 120 | ![](https://raw.githubusercontent.com/NashLegend/ProjectBabel/master/images/ripple.gif) 121 | 122 | Material风格的元素以一种波纹(ripple)扩散的方式响应用户的触摸。如果你使用了Theme.Material或者其派生的主题,那么交互性控件比如Button默认就会拥有这种效果(as will ?android:selectableItemBackground)。你也可以在你的drawable上使用这种效果——只要把它们放到ripple元素里,如下: 123 | ``` 124 | 127 | 128 | 130 | 131 | 132 | 133 | 134 | ``` 135 | 136 | 自定义view通过[View#drawableHotspotChanged](http://developer.android.com/reference/android/view/View.html?utm_campaign=L-Developer-launch#drawableHotspotChanged(float,%20float))回调方法将点击位置传递过去,以便从点击的位置发起ripple效果。 137 | 138 | #### StateListAnimator #### 139 | 当你触摸Material元素的时候,它也可以[抬起(链接里的Lift on touch)](http://www.google.com/design/spec/animation/responsive-interaction.html#responsive-interaction-material-response)以迎合你的手指,就像磁铁异性相吸一样。你可以通过translationZ属性动画来实现这种效果,translationZ属性与elevation相似,不过它的主要作用是做这些过渡效果。 Z = elevation + translationZ. 新的stateListAnimator属性轻松创建触摸时的Z轴动画(Buttons默认就有这效果): 140 | 141 | 示例代码: 142 | 143 | ``` 144 | layout/your_layout.xml 145 | 147 | anim/raise.xml 148 | 149 | 150 | 155 | 156 | 157 | 162 | 163 | 164 | ``` 165 | 166 | #### Reveal —— 打开内容 #### 167 | 168 | Material风格的app显示新内容的一个典型过渡效果是一个向外扩散的圆形遮罩。过渡动画以用户点击位置为圆心发起并[向外扩散](http://www.google.com/design/spec/animation/responsive-interaction.html#responsive-interaction-radial-action),你可以使用下面这种Animator来实现: 169 | ``` 170 | Animator reveal = ViewAnimationUtils.createCircularReveal( 171 | viewToReveal, // The new View to reveal 172 | centerX, // x co-ordinate to start the mask from 173 | centerY, // y co-ordinate to start the mask from 174 | startRadius, // radius of the starting mask 175 | endRadius); // radius of the final mask 176 | reveal.start(); 177 | ``` 178 | 179 | #### Interpolators —— 插值器 #### 180 | 动作应该是合理的(deliberate)、迅速的、精确的。与普通的缓动效果不同的是,在Material Design里,物体倾向于快速开始然后缓动到最终位置。在动画过程中,物体在最终位置附近时的运动使用了更多的时间,因此用户不必要为了等待动画结束花费更多时间,动画的负面效果被降到最低。这种动作使用的是一个新的快进慢出的[插值器](https://developer.android.com/reference/android/R.interpolator.html?utm_campaign=L-Developer-launch#fast_out_slow_in)。 181 | 182 | 下面是一图胜千言时间: 183 | ![](https://raw.githubusercontent.com/NashLegend/ProjectBabel/master/images/interpolators.gif) 184 | 185 | 对于进入和离开屏幕的元素(which [should do so at peak velocity](http://www.google.com/design/spec/animation/authentic-motion.html#authentic-motion-mass-weight)),分别使用[linear-out-slow-in](https://developer.android.com/reference/android/R.interpolator.html?utm_campaign=L-Developer-launch#linear_out_slow_in) 分 [fast-out-linear-in](https://developer.android.com/reference/android/R.interpolator.html?utm_campaign=L-Developer-launch#fast_out_linear_in) 插值器。 186 | 187 | ### Adaptive design —— 自适应设计### 188 | 189 | Material Design最后一个核心概念是创建一个单独的自适应设计布局就可以适配小到手表大到电视的所有尺寸和形状(手表有圆有方)。自适应设计设计技术帮助我们实现用同一个系统在不同设备上展示不同的外观。每个view都会自适应不同设备的尺寸的交互方式。 颜色、iconography,、层次、空间关系保持不变。Material Design系统提供了灵活的组件和模式以帮助你做到这一点。 190 | 191 | #### Toolbar #### 192 | 193 | Toolbar是ActionBar模式的一般化形式,它提供相似的功能以及更高的灵活性。与标准的ActionBar不同,Toolbar就在你的view的结构层次中,你可以像操作其他的view完全一样的操作它。你可以使用Activity.setActionBar()方法让它变成你的ActionBar。 194 | 195 | ![](https://raw.githubusercontent.com/NashLegend/ProjectBabel/master/images/contacts_toolbars.png) 196 | 197 | 在这个例子里,蓝色的Toolbar很高,被屏幕内容覆盖并且提供了一个导航按钮。注意另外两个Toolbar分别用在List和详细内容界面(说这么多无非是为了说明Toolbar很灵活)。 198 | 199 | 欲知更多Toolbar的使用方式,看[这里](https://github.com/NashLegend/ProjectBabel/blob/master/Material%20Design%20for%20Pre-Lollipop%20Devices.md)。 200 | 201 | #### 开始让你的应用Material化吧 #### 202 | Material Design帮助你创建易于理解的、漂亮的、自适应的、动起来的活的应用。希望这篇文章能让你动心并将Material Design应用到你的app里。 203 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2014 NashLegend 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /Material Design for Pre-Lollipop Devices.md: -------------------------------------------------------------------------------- 1 | 在低版本Android系统的上使用Material Design 2 | =========================== 3 | *By Chris Banes, Android Developer Relations* 4 | 5 | *译自http://android-developers.blogspot.com/2014/10/appcompat-v21-material-design-for-pre.html—— By [NashLegend](https://github.com/NashLegend)* 6 | 7 | ![](http://i.imgur.com/4Iz0yK2.png) 8 | 9 | Android 5.0已经发布,带来了新的Material Design,这种新的设计语言提供了更好的视觉体验。为了使旧版本的Android系统也可以使用这种设计,我们扩展了支持包,对其中的[AppCompat](https://developer.android.com/tools/support-library/features.html#v7-appcompat)进行了重大更新,同时带来了新的[RecyclerVier](https://developer.android.com/tools/support-library/features.html#v7-recyclerview),[CardView](https://developer.android.com/tools/support-library/features.html#v7-recyclerview)以及[Palette](https://developer.android.com/tools/support-library/features.html#v7-palette)库。 10 | 11 | 这篇文章中我们会介绍一下AppCompat发生了哪些新变化以及如何用它设计Material Design应用. 12 | 13 | #### What's new in AppCompat? #### 14 | 15 | AppCompat(又叫ActionBarCompat)为4.0前的Android版本提供ActionBar后向兼容。而最新的AppCompat v21则可以提供Android 5.0特性支持。 16 | 17 | 在这个版本中,Android引入了新的 [ToolBar](https://developer.android.com/reference/android/support/v7/widget/Toolbar.html)控件。类似于ActionBar,但是提供了更多的控制权和灵活性。ToolBar就像其他的普通控件一样,因此你可以容易地对其布局、执行动画以及与滚动事件交互。你也可以把它设置成你的Activity的ActionBar——就和原先的ActionBar一样使用。 18 | 19 | 最新的AppCompat包含了多种Meterial Design样式更新。比如[Google I/O 2014应用](https://github.com/google/iosched)就使用了这些东东. 20 | 21 | 下面是如何使用它 22 | 23 | #### 开始使用 #### 24 | 如果你使用Gradle,把appcompat加入到依赖库。修改你的build.gradle: 25 | ``` 26 | dependencies { 27 | compile "com.android.support:appcompat-v7:21.0.+" 28 | } 29 | ``` 30 | ##### 如果你的App首次使用AppCompat ##### 31 | 32 | 如果你没用过AppCompat,那么下面教给你: 33 | 34 | - 所有的Activity必须继承[ActionBarActivity](https://developer.android.com/reference/android/support/v7/app/ActionBarActivity.html),ActionBarActivity继承自v4包的[FragmentActivity](https://developer.android.com/reference/android/support/v4/app/FragmentActivity.html),因此你仍然可以使用Fragment. 35 | - 所有theme必须继承`Theme.AppCompat`——这个主题包含一些不同的子主题,比如`Light`和`NoActionBar`。 36 | - 如果你要inflate一些元素(比如说一个列表)以展示在ActionBar上的话,请确保你使用的是ActionBar的themed context——使用getSupportActionBar().getThemedContext()方法获得这个context。 37 | - 对MenuItem进行相关操作时,必须[MenuItemCompat](https://developer.android.com/reference/android/support/v4/view/MenuItemCompat.html)的静态方法 38 | 39 | For more information, see the Action Bar API guide which is a comprehensive guide on AppCompat. 40 | 欲知更多更深入的知识,请看 [ActionBar指南](http://developer.android.com/guide/topics/ui/actionbar.html) 41 | 42 | ##### 如果你的App之前就使用AppCompat ##### 43 | 44 | 对于大多数的应用来说,你只要在`values/`里声明一个主题就可以了: 45 | ``` 46 | values/themes.xml: 47 | 48 | 58 | ``` 59 | 60 | 完了你就可以把`values-v14+`的ActionBar样式移除了。 61 | 62 | #### 设置主题 #### 63 | 64 | AppCompat已经支持新的[color palette theme](http://developer.android.com/training/material/theme.html#ColorPalette)属性,使用这些属性,你可以很轻易地讲你的应用色调与[primary and accent colors](http://www.google.com/design/spec/style/color.html#color-ui-color-application)搭配。举个栗子: 65 | ``` 66 | values/themes.xml: 67 | 68 | 82 | ``` 83 | 84 | 在Android 5.0以上系统上,设置了上面这些后,跟使用了Material主题一样了,你不必单独设置Material主题,它会自动修改状态栏、最近运行屏幕等的颜色。 85 | 86 | 而在早期版本中,AppCompat会尽可能的模拟Material色彩主题。现阶段时能作用于ActionBar和某些组件上——也就是说,对于以前版本的Android系统来说,就算使用了AppCompat也不可能实现所有的Android 5.0样式。 87 | 88 | ##### *Widget着色*(Widget tinting) ##### 89 | 90 | 当设备的版本在Android 5.0以上时,所有的组件都会使用我们刚才设置的主题颜色进行着色,这是因为Android 5.0支持正面这两种特性(5.0之前系统的悲剧):*drawable着色*(drawable tinting)和在drawable中引用主题属性(使用?attr/xxx方式)。 91 | 92 | 对于早期版本的Android系统,AppCompat为下列UI组件提供了类似的行为。 93 | 94 | - AppCompat’s toolbar中的一切 (action modes等等) 95 | - EditText 96 | - Spinner 97 | - CheckBox 98 | - RadioButton 99 | - Switch (要使用新的[android.support.v7.widget.SwitchCompat](https://developer.android.com/reference/android/support/v7/widget/SwitchCompat.html)) 100 | - CheckedTextView 101 | 102 | AppCompat会帮助你实现这些行为,你完全不需要插手(有些要注意的地方,看下面的FAQ)。 103 | 104 | #### Toolbar组件 #### 105 | 106 | ![](http://i.imgur.com/QH2tBHt.png) 107 | 108 | AppCompat支持完全特性的`Toolbar`组件——[android.support.v7.widget.Toolbar](https://developer.android.com/reference/android/support/v7/widget/Toolbar.html)——和Android5.0系统的`Toolbar`完全一样。要两种使用ToolBar的方式: 109 | 110 | - 如果你想要使用现有的ActionBar功能(比如使用菜单、ActionBarDrawerToggle等等)同时又想自己掌握它的样式,那么你可以把ToolBar用作ActionBar。 111 | - 对于一些ActionBar所不支持的场景——比如说在同一屏幕上使用多个ToolBar、使用低于屏幕宽度的尺寸的ToolBar等等(看上图就知道了)——你就要使用ToolBar了。 112 | 113 | ##### Action Bar ##### 114 | 115 | 要将ToolBar用作ActionBar,首先要禁用系统ActionBar,最方便的方式是使用`Theme.AppCompat.NoActionBar`主题(或者light版的NoActionBar). 116 | 117 | 然后创建一个ToolBar实例,通常是写在XML里。 118 | 119 | ``` 120 | 126 | ``` 127 | 128 | 宽、高、背景等你完全可以自定义;由于ToolBar只是一个ViewGroup,因此你可以任意定义它的样式的位置。 129 | 130 | 然后在Activity里面将ToolBar设置为ActionBar就行了: 131 | 132 | ``` 133 | @Override 134 | public void onCreate(Bundle savedInstanceState) { 135 | super.onCreate(savedInstanceState); 136 | setContentView(R.layout.blah); 137 | 138 | Toolbar toolbar = (Toolbar) findViewById(R.id.my_awesome_toolbar); 139 | setSupportActionBar(toolbar); 140 | } 141 | ``` 142 | 143 | 然后options menu就会显示在ToolBar上了。 144 | 145 | ##### Standalone模式 ##### 146 | 147 | standalone模式与actionbar模式的不同是你不必setSupportActionBar了,把它当一个普通组件看待就好,也不必非得把ActionBar给禁用了。 148 | 149 | standalone模式下,你就得手动设置ToolBar的内容和动作了。比如说,如果你想让它显示一个动作按钮(就像Actoinbar一样,但不是actionbar模式),你可以这么做: 150 | 151 | ``` 152 | @Override 153 | public void onCreate(Bundle savedInstanceState) { 154 | super.onCreate(savedInstanceState); 155 | setContentView(R.layout.blah); 156 | 157 | Toolbar toolbar = (Toolbar) findViewById(R.id.my_awesome_toolbar); 158 | 159 | // Set an OnMenuItemClickListener to handle menu item clicks 160 | toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() { 161 | @Override 162 | public boolean onMenuItemClick(MenuItem item) { 163 | // Handle the menu item 164 | return true; 165 | } 166 | }); 167 | 168 | // Inflate a menu to be displayed in the toolbar 169 | toolbar.inflateMenu(R.menu.your_toolbar_menu); 170 | } 171 | ``` 172 | 173 | ToolBar还支持很多其他功能,欲知更多,请查看[它的API](https://developer.android.com/reference/android/support/v7/widget/Toolbar.html)。 174 | 175 | ##### Styling ##### 176 | 177 | ToolBar的样式的设置方式和标准的ActionBar是不一样的,ToolBar的样式是直接设置在这个View上的。 178 | 179 | 下面是一个要作为ActionBar使用的ToolBar的基本样式。 180 | 181 | ``` 182 | 187 | ``` 188 | 189 | app:theme可以确保你的文本的里面的items使用solid colors。 190 | 191 | ###### DarkActionBar ###### 192 | 你也可以直接通过而已属性设置ToolBar的Style。要得到一个看起来像'DarkActionBar'(深色内容、浅色菜单)样式的ToolBar,可以像下面设置theme和popupTheme属性: 193 | 194 | ``` 195 | 201 | ``` 202 | 203 | #### SearchView Widget #### 204 | 205 | AppCompat提供了最新与Lollipop一样的SearchView样式和API,使其具有更强的可定制性(此处应该有掌声). 206 | 207 | 你应该这样定义SearchView的样式: 208 | 209 | ``` 210 | values/themes.xml: 211 | 214 | 232 | ``` 233 | 234 | 你不必设置所有上面的属性,甚至一个都不设置也行,默认的就很不错。 235 | 236 | #### 结语 #### 237 | 238 | 希望这篇文章能让你学会使用AppCompat并开发出牛逼的Material Design风格的app。 239 | 240 | #### FAQ #### 241 | 242 | ##### 为啥我的老Android系统上的EditText(或者上面提到的支持的控件)长得不像Material风格呢? ##### 243 | 244 | AppCompat的工作原理是拦截layout inflation并且在对应的位置插入一个特殊的*可使用Material样式的组件*(tint-aware version of the widget)来实现的。对于大部分应用来说这应该没啥问题,但是下面几种情况有可能导致一些问题: 245 | - 你使用自己的自定义的widget(比如使用的自定义的继承了EditText的类)。 246 | - 你创建EditText的时候没有给它LayoutInflater(比如直接New EditText()) 247 | 248 | 这些特殊的组件目前被我们藏起来了,因为还没有完全做完。以后可能会好点…… 249 | 250 | #####为何有的组件在我的老Android系统上长得没有Material风格?##### 251 | 252 | 目前AppCompat只支持常用的组件的Material主题,其他的以后会有的。 253 | 254 | #####为啥我的ActionBar在Android 5.0上的阴影,我已经把android:windowContentOverlay设置为null了啊?##### 255 | 256 | Android 5.0上,ActionBar的阴影是由最新的elevation API提供的。如果不想要它,可以使用`getSupportActionBar().setElevation(0)`方法,或者在Action Bar style里面修改`elevation`属性。 257 | 258 | #####为啥我的老版本Android没有波纹效果?##### 259 | 260 | 这东西只有用Android 5.0最新的RenderThread才能跑流畅,为了不让你卡出病来,我们现在还是先不给老版本支持这玩意儿。 261 | 262 | #####我使用了AppCompat后还能用Preference么?##### 263 | 264 | 在API v11+版本的机器上,你仍然可以在ActionBarActivity中使用PreferenceFragment。对于更老的老爷机来说,你只能使用普通的非Material样式的PreferenceActivity。 265 | -------------------------------------------------------------------------------- /Material Design on Android Checklist.md: -------------------------------------------------------------------------------- 1 | Material Design on Android Checklist 2 | ================= 3 | 译自 http://android-developers.blogspot.com/2014/10/material-design-on-android-checklist.html —— By [NashLegend](https://github.com/NashLegend) 4 | 5 | Android 5.0 brings in material design as the new design system for the platform and system apps. Consumers will soon start getting Android 5.0 and they’re already seeing glimpses of material design with apps like Google Play Newsstand, Inbox by Gmail and Tumblr. Meanwhile, developers now have the Android 5.0 SDK, along with AppCompat for backward compatibility. And designers now have access to Photoshop, Illustrator and Sketch templates. All this means that now—yes now!—is the time to start implementing material design in your Android apps. Today, let’s talk about what implementing material design really boils down to. 6 | 7 | Below, you’ll find a material design checklist that you can use to mark progress as you implement the new design system. The checklist is divided into 4 key sections based on the 4 key aspects of material design. 8 | 9 | If you include a good chunk of the items in the checklist below, especially the ones indicated as signature elements, and follow traditional Android design best practices (i.e. these, these, and things we discussed on ADiA), you’ll be well on your way to material design awesomeness! -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ProjectBabel 2 | ============ 3 | 4 | 这是一个翻译项目,持续更新中……. 5 | 6 | 不可能啥都懂,但是啥都翻译,所以一旦碰到自己没涉及的领域,就真是跪了,因此: 7 | 8 | - 对于某个单词或者词组不确定如何翻译的,使用*斜体*表示不确定或者这只是我自己瞎编的翻译,后面跟一个括号把原文扔括号里面以防误导别人——如果有人看的话…… 9 | - 对于某个单词或者词组不知道如何翻译的,直接原文扔那儿…… 10 | - 对于一大片的句子段落不懂得如何翻译的,直接原文扔那儿…… 11 | - 对于某些字句段落不知道自己不知道的话,用正常文本格式,因为我不知道我不知道…… 12 | 13 | -------------------------------------------------------------------------------- /images/activity_transitions.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NashLegend/ProjectBabel/370bc382bcd4dc7054746d9b42010dc5c7b1c583/images/activity_transitions.gif -------------------------------------------------------------------------------- /images/color_attribs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NashLegend/ProjectBabel/370bc382bcd4dc7054746d9b42010dc5c7b1c583/images/color_attribs.png -------------------------------------------------------------------------------- /images/contacts_toolbars.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NashLegend/ProjectBabel/370bc382bcd4dc7054746d9b42010dc5c7b1c583/images/contacts_toolbars.png -------------------------------------------------------------------------------- /images/interpolators.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NashLegend/ProjectBabel/370bc382bcd4dc7054746d9b42010dc5c7b1c583/images/interpolators.gif -------------------------------------------------------------------------------- /images/layering.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NashLegend/ProjectBabel/370bc382bcd4dc7054746d9b42010dc5c7b1c583/images/layering.gif -------------------------------------------------------------------------------- /images/palette2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NashLegend/ProjectBabel/370bc382bcd4dc7054746d9b42010dc5c7b1c583/images/palette2.gif -------------------------------------------------------------------------------- /images/ripple.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NashLegend/ProjectBabel/370bc382bcd4dc7054746d9b42010dc5c7b1c583/images/ripple.gif -------------------------------------------------------------------------------- /images/title1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NashLegend/ProjectBabel/370bc382bcd4dc7054746d9b42010dc5c7b1c583/images/title1.png --------------------------------------------------------------------------------