diff --git a/manifest.appcache b/manifest.appcache index 619fb2155..0758dfa0d 100644 --- a/manifest.appcache +++ b/manifest.appcache @@ -2,258 +2,6 @@ CACHE MANIFEST # Revision 1407253957629 CACHE: -building-wearables.html -index.html -animations/cardflip.html -animations/crossfade.html -animations/index.html -animations/layout.html -animations/screen-slide.html -animations/zoom.html -background-jobs/load-data-background/handle-result.html -background-jobs/load-data-background/index.html -background-jobs/load-data-background/setup-loader.html -background-jobs/run-background-service/create-service.html -background-jobs/run-background-service/index.html -background-jobs/run-background-service/report-status.html -background-jobs/run-background-service/send-request.html -background-jobs/scheduling/alarms.html -background-jobs/scheduling/index.html -background-jobs/scheduling/wake-lock.html -basics/actionbar/adding-buttons.html -basics/actionbar/index.html -basics/actionbar/overlaying.html -basics/actionbar/setting-up.html -basics/actionbar/styling.html -basics/activity-lifecycle/index.html -basics/activity-lifecycle/pausing.html -basics/activity-lifecycle/recreating.html -basics/activity-lifecycle/starting.html -basics/activity-lifecycle/stopping.html -basics/data-storage/database.html -basics/data-storage/files.html -basics/data-storage/index.html -basics/data-storage/shared-preference.html -basics/firstapp/building-ui.html -basics/firstapp/creating-project.html -basics/firstapp/index.html -basics/firstapp/running-app.html -basics/firstapp/starting-activity.html -basics/fragments/communicating.html -basics/fragments/creating.html -basics/fragments/fragment-ui.html -basics/fragments/index.html -basics/index.html -basics/intents/filters.html -basics/intents/index.html -basics/intents/result.html -basics/intents/sending.html -basics/supporting-devices/index.html -basics/supporting-devices/languages.html -basics/supporting-devices/platforms.html -basics/supporting-devices/screens.html -best-background.html -best-performance.html -best-security.html -best-testing.html -best-user-input.html -best-ux.html -building-connectivity.html -building-content-sharing.html -building-graphics.html -building-multimedia.html -building-userinfo.html -cloud/cloudsave/index.html -cloud/cloudsync/backupapi.html -cloud/cloudsync/gcm.html -cloud/cloudsync/index.html -connectivity/connect-devices-wireless/index.html -connectivity/connect-devices-wireless/nsd-wifi-index.html -connectivity/connect-devices-wireless/nsd.html -connectivity/connect-devices-wireless/wifi-direct.html -connectivity/efficient-downloads/connectivity-patterns.html -connectivity/efficient-downloads/efficient-network-access.html -connectivity/efficient-downloads/index.html -connectivity/efficient-downloads/redundant-redundant.html -connectivity/efficient-downloads/regular-update.html -connectivity/network-ops/connecting.html -connectivity/network-ops/managing.html -connectivity/network-ops/index.html -connectivity/network-ops/xml.html -connectivity/sync-adapters/create-authenticator.html -connectivity/sync-adapters/create-stub-provider.html -connectivity/sync-adapters/create-sync-adapter.html -connectivity/sync-adapters/index.html -connectivity/sync-adapters/running-sync-adapter.html -connectivity/volley/index.html -connectivity/volley/request-custom.html -connectivity/volley/request-queue.html -connectivity/volley/request.html -connectivity/volley/simple.html -contacts-provider/display-badge.html -contacts-provider/index.html -contacts-provider/modify-data.html -contacts-provider/retrieve-detail.html -contacts-provider/retrieve-names.html -content-sharing/beam-files/index.html -content-sharing/beam-files/receive-files.html -content-sharing/beam-files/sending-files.html -content-sharing/secure-file-sharing/index.html -content-sharing/secure-file-sharing/request-file.html -content-sharing/secure-file-sharing/retrieve-info.html -content-sharing/secure-file-sharing/setup-sharing.html -content-sharing/secure-file-sharing/sharing-file.html -content-sharing/sharing/index.html -content-sharing/sharing/receive.html -content-sharing/sharing/send.html -content-sharing/sharing/shareaction.html -graphics/displaying-bitmaps/cache-bitmap.html -graphics/displaying-bitmaps/display-bitmap.html -graphics/displaying-bitmaps/index.html -graphics/displaying-bitmaps/load-bitmap.html -graphics/displaying-bitmaps/manage-bitmap-memory.html -graphics/displaying-bitmaps/process-bitmap.html -graphics/opengl/motion.html -graphics/opengl/draw.html -graphics/opengl/environment.html -graphics/opengl/index.html -graphics/opengl/projection.html -graphics/opengl/shapes.html -graphics/opengl/touch.html -input/game-controller/compatibility.html -input/game-controller/controller-inputs.html -input/game-controller/index.html -input/game-controller/multi-controller.html -input/gestures/detector.html -input/gestures/index.html -input/gestures/movement.html -input/gestures/multi.html -input/gestures/scale.html -input/gestures/scroll.html -input/gestures/viewgroup.html -input/keyboard-input/commands.html -input/keyboard-input/index.html -input/keyboard-input/navigation.html -input/keyboard-input/type.html -input/keyboard-input/visibility.html -location/activity-recognition.html -location/display-address.html -location/index.html -location/geofencing.html -location/location-testing.html -location/retrieve-current.html -location/retrieve-location-updates.html -multimedia/audio/audio-focus.html -multimedia/audio/audio-output.html -multimedia/audio/index.html -multimedia/audio/volume-playback.html -multimedia/camera/index.html -multimedia/camera/cameradirect.html -multimedia/camera/photobasic.html -multimedia/camera/videobasic.html -multimedia/printing/custom-docs.html -multimedia/printing/html-docs.html -multimedia/printing/index.html -multimedia/printing/photos.html -performance/improving-layouts/index.html -performance/improving-layouts/loading-ondemand.html -performance/improving-layouts/optimizing-layout.html -performance/improving-layouts/reuse-layouts.html -performance/improving-layouts/smooth-scrolling.html -performance/memory.html -performance/monitor-device-state/battery-monitor.html -performance/monitor-device-state/connectivity-monitor.html -performance/monitor-device-state/docking-monitor.html -performance/monitor-device-state/index.html -performance/monitor-device-state/manifest-receivers.html -performance/multi-threads/communicate-ui.html -performance/multi-threads/create-threadpool.html -performance/multi-threads/define-runnable.html -performance/multi-threads/index.html -performance/multi-threads/run-code.html -performance/perf-anr/index.html -performance/perf-jni/index.html -performance/performance-tips.html -performance/smp/index.html -security/enterprise/device-management-policy.html -security/enterprise/index.html -security/security-ssl.html -security/security-tips.html -testing/activity-testing/activity-basic-testing.html -testing/activity-testing/activity-function-testing.html -testing/activity-testing/activity-unit-testing.html -testing/activity-testing/activity-ui-testing.html -testing/activity-testing/index.html -testing/activity-testing/prepare-activity-testing.html -ui/accessibility/accessible-app.html -ui/accessibility/index.html -ui/accessibility/accessible-service.html -ui/backward-compatible-ui/abstract.html -ui/backward-compatible-ui/index.html -ui/backward-compatible-ui/new-impl.html -ui/backward-compatible-ui/older-impl.html -ui/backward-compatible-ui/using-component.html -ui/custom-view/create-view.html -ui/custom-view/custom-draw.html -ui/custom-view/index.html -ui/custom-view/make-interactive.html -ui/custom-view/optimize-view.html -ui/multiscreen/adapt-ui.html -ui/multiscreen/index.html -ui/multiscreen/screen-desities.html -ui/multiscreen/screen-sizes.html -ui/system-ui/index.html -ui/system-ui/dim.html -ui/system-ui/hide-ui.html -ui/system-ui/immersive.html -ui/system-ui/hide-nav.html -ui/system-ui/visibility.html -ui/tv/index.html -ui/tv/optimize-layouts-tv.html -ui/tv/optimize-nav-tv.html -ui/tv/unsupport-features-tv.html -ux/app-indexing/deep-linking.html -ux/app-indexing/enable-app-indexing.html -ux/app-indexing/index.html -ux/design-nav/ancestral-temporal.html -ux/design-nav/descendant-lateral.html -ux/design-nav/index.html -ux/design-nav/multi-sizes.html -ux/design-nav/screen-planning.html -ux/design-nav/wireframing.html -ux/implement-nav/ancestral.html -ux/implement-nav/descendant.html -ux/implement-nav/index.html -ux/implement-nav/lateral.html -ux/implement-nav/nav-drawer.html -ux/implement-nav/temporal.html -ux/notify-user/build-notification.html -ux/notify-user/expand-notification.html -ux/notify-user/index.html -ux/notify-user/nav.html -ux/notify-user/progess-notification.html -ux/notify-user/update-notification.html -ux/search/back-compat.html -ux/search/index.html -ux/search/search.html -ux/search/setup.html -wearables/apps/bt-debugging.html -wearables/apps/creating.html -wearables/apps/index.html -wearables/apps/layouts.html -wearables/apps/packaging.html -wearables/apps/voice.html -wearables/data-layer/accessing.html -wearables/data-layer/assets.html -wearables/data-layer/data-items.html -wearables/data-layer/events.html -wearables/data-layer/index.html -wearables/data-layer/messages.html -wearables/notifications/creating.html -wearables/notifications/index.html -wearables/notifications/pages.html -wearables/notifications/stacks.html -wearables/notifications/voice-input.html gitbook/app.js gitbook/fonts/fontawesome/FontAwesome.otf gitbook/fonts/fontawesome/fontawesome-webfont.eot diff --git a/material/animations.md b/material/animations.md index 922afbda6..83b1de346 100644 --- a/material/animations.md +++ b/material/animations.md @@ -17,7 +17,7 @@ Material Design中的触摸反馈,是在用户与UI元素交互时,提供视 大多数情况下,你需要在你的 XML 文件中设定视图的背景来实现这个功能: * `?android:attr/selectableItemBackground` 用于有界Ripple动画 -* `?android:attr/selectableItemBackgroundBorderless` 用于越出视图边界的动画 +* `?android:attr/selectableItemBackgroundBorderless` 用于越出视图边界的动画。它会被绘制在最近的切不是全屏的父视图上。 > 注意:`selectableItemBackgroundBorderless` 是 API level 21 新加入的属性 @@ -25,7 +25,7 @@ Material Design中的触摸反馈,是在用户与UI元素交互时,提供视 你可以给`RippleDrawable`赋予一个颜色。要改变默认的触摸反馈颜色,使用主题的`android:colorControlHighlight` 属性。 -更多星系,参见`RippleDrawable`类的API文档。 +更多信息,参见`RippleDrawable`类的API文档。 ## 使用填充效果(Reveal Effect) @@ -51,7 +51,7 @@ Animator anim = anim.start(); ``` -要用此效果隐藏一个原本可见的视图 +要用此效果隐藏一个原本可见的视图: ```java // previously visible view @@ -85,12 +85,11 @@ anim.start(); ![Figure 1 - A transition with shared elements.](ContactsAnim.gif) - Material Design中的Activity切换,当不同Activity之间拥有共有元素,则可以通过不同状态之间的动画和形变提供视觉上的连续性。你可以为共有元素设定进入和退出Activity时的自定义动画。 -* 入场变换决定视图如何入场。比如,在*爆炸式入场*变换中,视图从场外飞到屏幕中央。 -* 出场变换决定视图如何退出。比如,在*爆炸式出场*变换中,视图从屏幕中央飞出场外。 -* 共有元素的变换决定一个共有视图在两个Activity之间如何变换。比如,如果两个activity有同一张图片,但是放在不同位置,以及拥有不同大小,*变更图片* 变换会流畅的把图片移到相应位置,同时缩放图片大小。 +* **入场变换**决定视图如何入场。比如,在*爆炸式入场*变换中,视图从场外飞到屏幕中央。 +* **出场变换**决定视图如何退出。比如,在*爆炸式出场*变换中,视图从屏幕中央飞出场外。 +* **共有元素的变换**决定一个共有视图在两个Activity之间如何变换。比如,如果两个activity有同一张图片,但是放在不同位置,以及拥有不同大小,*变更图片* 变换会流畅的把图片移到相应位置,同时缩放图片大小。 Android 5.0 (API level 21) 支持这些入场和退出变换: @@ -98,7 +97,7 @@ Android 5.0 (API level 21) 支持这些入场和退出变换: * 滑动 - 把视图从场景边缘移入或移出 * 淡入淡出 - 通过改变透明度添加或移除元素 -任何继承于 Visibility 类的变换,都支持被用于入场或退出变换。更多信息,请参见 `Transition` 类的API文档。 +任何继承于 [`Visibility`](http://developer.android.com/reference/android/transition/Visibility.html) 类的变换,都支持被用于入场或退出变换。更多信息,请参见 [`Transition`](http://developer.android.com/reference/android/transition/Transition.html) 类的API文档。 Android 5.0 (API level 21) 还支持这些共有元素变换效果: @@ -111,7 +110,7 @@ Android 5.0 (API level 21) 还支持这些共有元素变换效果: ![](SceneTransition.png) -## 自定义变换 +### 自定义变换 首先,当你继承Material主题的style时,要通过`android:windowContentTransitions`属性来开启窗口内容变换功能。你也可以在style定义中声明进入、退出和共有元素变换: @@ -167,7 +166,7 @@ getWindow().setExitTransition(new Explode()); 要尽早开始入场变换,可以在被调用的Activity上使用`Window.setAllowEnterTransitionOverlap()` 。它可以使你拥有更戏剧性的入场变换。 -## 使用变换开始一个Activity +### 使用变换开始一个Activity 如果你开启Activity入场和退出效果,那么当你在用如下方法开始Activity时,变换效果会被应用: @@ -178,7 +177,7 @@ startActivity(intent, 如果你为第二个Activity设定了入场变换,变换也会在activity开始时被启用。要在开始另一个acitivity时禁用变换,可以给bundle的选项提供一个`null`对象: -## 开始一个拥有共用元素的Activity +### 开始一个拥有共用元素的Activity 要在两个拥有共用元素的activity间进行变换动画: @@ -212,7 +211,9 @@ imgContainerView.setOnClickListener(new View.OnClickListener() { 对于用代码编写的共有动态视图,使用`View.setTransitionName()`方法来在两个activity中定义共有元素。 -## 开始一个拥有多个共有元素的Activity +要在第二个activity结束时进行逆向的场景变换动画,调用`Activity.finishAfterTransition()`方法,而不是`Activity.finish()`。 + +### 开始一个拥有多个共有元素的Activity 要在拥有多个共有元素的activity之间使用变换动画,就要用`android:transitionName`属性在两个layout中定义这个共有元素(或在两个Activity中使用`View.setTransitionName()`方法),再创建`ActivityOptions`对象: @@ -314,7 +315,6 @@ mAnimator.start(); ``` - ## 动画矢量 Drawables 矢量Drawable是可以无损缩放的。`AnimatedVectorDrawable`类是你可以操作矢量Drawable。 @@ -364,7 +364,7 @@ mAnimator.start(); ``` -动画的定义代表ObjectAnimator或者AnimatorSet对象。例子中第一个animator将目标组旋转了360度。 +动画的定义代表`ObjectAnimator`或者`AnimatorSet`对象。例子中第一个animator将目标组旋转了360度。 ```xml @@ -389,4 +389,4 @@ mAnimator.start(); ``` -更多信息,请参考AnimatedVectorDrawable的API指南。 +更多信息,请参考`AnimatedVectorDrawable`的API指南。 diff --git a/material/compatibility.md b/material/compatibility.md index 232c286ed..df9862ef1 100644 --- a/material/compatibility.md +++ b/material/compatibility.md @@ -4,7 +4,7 @@ 有些Material Design特性,比如主题和自定义Activits切换效果等,只在Android 5.0 (API level 21) 以上中可用。不过,你仍然可以使用这些特性实现Material Design,并保持对旧版本Android 系统的兼容。 -## 定义后备Style +## 定义备选Style 你可以配置你的应用,在支持Material Design的设备上使用Material主题,在旧版本Android上使用旧的主题: @@ -12,13 +12,13 @@ 2. 在`res/values-v21/styles.xml`中定义一个同名的主题,继承自Material 主题 3. 在`AndroidManifest.xml`中,将这个主题设置为应用的主题 -> 注意:如果你的应用设置了一个主题,但是没有提供后备Style,你可能无法在低于Android 5.0版本的系统中运行应用。 +> 注意:如果你的应用设置了一个主题,但是没有提供备选Style,你可能无法在低于Android 5.0版本的系统中运行应用。 -## 提供后备layout +## 提供layout -如果你根据Material Design设计的应用的Layout中没有使用任何Android 5.0 (API level 21)中新的XML属性,他们在旧版本Android中就能正常工作。否则,你要提供后备Layout。你可以在后备Layout中定义你的应用在旧版本系统中的界面。 +如果你根据Material Design设计的应用的Layout中没有使用任何Android 5.0 (API level 21)中新的XML属性,他们在旧版本Android中就能正常工作。否则,你要提供备选Layout。你可以在备选Layout中定义你的应用在旧版本系统中的界面。 -在`res/layout-v21/`中定义Android 5.0 (API level 21) 以上系统的Layout,在`res/layout`中定义早前版本Android的Layout。比如,`res/layout/my_activity.xml`是对于`res/layout-v21/my_activity.xml`的一个后备Layout。 +在`res/layout-v21/`中定义Android 5.0 (API level 21) 以上系统的Layout,在`res/layout`中定义早前版本Android的Layout。比如,`res/layout/my_activity.xml`是对于`res/layout-v21/my_activity.xml`的一个备选Layout。 为了避免代码重复,在`res/values`中定义style,然后在`res/values-v21`中修改新API需要的style。使用style的继承,在`res/values/`中定义父style,在`res/values-v21/`中继承。 @@ -26,14 +26,15 @@ [v7 support libraries r21](https://developer.android.com/tools/support-library/features.html#v7) 及更高版本包含了以下Material Design 特性: +* 当你应用一个 `Theme.AppCompat` 主题时, 会得到为一些系统控件准备的 Material Design style * `Theme.AppCompat`主题包含调色板主体属性 -* `RecyclerView`组件用于显示数据集 -* `CardView`组件用于创建卡片 -* `Palette`类用于从图片提取主色调 +* `RecyclerView` 组件用于显示数据集 +* `CardView` 组件用于创建卡片 +* `Palette` 类用于从图片提取主色调 ### 系统组件 -`Theme.AppCompat`主题中提供了这些组件的Material Design style: +`Theme.AppCompat` 主题中提供了这些组件的 Material Design style: * EditText * Spinner @@ -41,7 +42,8 @@ * RadioButton * SwitchCompat * CheckedTextView -* Color Palette + +### 调色板 要获取Material Design style,并用v7 support library自定义调色板,就要应用以下中的一个Theme.AppCompat主题: diff --git a/material/drawables.md b/material/drawables.md index bcef41766..80efe8906 100644 --- a/material/drawables.md +++ b/material/drawables.md @@ -4,7 +4,7 @@ ## 使用Drawable -以下这些drawable的特性,能帮助你在应用中实现Material Design: +以下这些drawable的功能,能帮助你在应用中实现Material Design: * Drawable染色 * 提取主色调 @@ -16,11 +16,11 @@ 使用 Android 5.0 (API level 21)以上版本,你可以使用alpha mask(透明度图层,译者注)给位图和nine patches图片染色。你可以用颜色Resource或者主题属性来获取颜色(比如,`?android:attr/colorPrimary`)。通常,你只需要创建一次这些颜色asset,便可以在主题中自动匹配这些颜色。 -你可以用`setTint()`方法将一种染色方式应用到BitmapDrawable或者NinePatchDrawable对象。你也在layout中使用`android:tint`和`android:initMode`属性设置tint color和模式。 +你可以用`setTint()`方法将一种染色方式应用到`BitmapDrawable`或者`NinePatchDrawable`对象。你也在layout中使用`android:tint`和`android:initMode`属性设置染色的颜色和模式。 ## 从图片中提取主色调 -Android Support Library v21及更高版本带有Palatte类,可以让你从图片中提取主色调。这个类可以提取以下颜色: +Android Support Library v21及更高版本带有`Palatte`类,可以让你从图片中提取主色调。这个类可以提取以下颜色: * Vibrant: 亮色 * Vibrant dark: 深亮色 @@ -42,8 +42,7 @@ dependencies { } ``` -更多信息,请参见Palette类的API文档。 - +更多信息,请参见[Palette](http://developer.android.com/reference/android/support/v7/graphics/Palette.html)类的API文档。 ## 创建矢量drawable @@ -73,4 +72,4 @@ dependencies { ``` -矢量图片在Android中用`VectorDrawable`对象来表示。更多关于`pathData`语法的信息,请看[SVG Path](http://www.w3.org/TR/SVG11/paths.html#PathData)的文档。更多关于矢量drawable动画的信息,请参见[矢量drawable动画](https://developer.android.com/training/material/animations.html#AnimVector)。 +矢量图片在Android中用[VectorDrawable](http://developer.android.com/reference/android/graphics/drawable/VectorDrawable.html)对象来表示。更多关于`pathData`语法的信息,请看[SVG Path](http://www.w3.org/TR/SVG11/paths.html#PathData)的文档。更多关于矢量drawable动画的信息,请参见[矢量drawable动画](https://developer.android.com/training/material/animations.html#AnimVector)。 diff --git a/material/get-started.md b/material/get-started.md index b604fe5e2..0cb1b70ee 100644 --- a/material/get-started.md +++ b/material/get-started.md @@ -6,20 +6,20 @@ 1. 学习 [Material Design 规格标准](http://www.google.com/design/spec/material-design/introduction.html) 2. 应用 Material Design 主题 -3. 创建遵从 Material Design 的 Layout 文件 +3. 创建符合 Material Design 的 Layout 文件 4. 定义视图的 elevation 值来修改阴影 5. 使用系统组件来创建列表和卡片 6. 自定义动画 -## 维护兼容性 +#### 维护兼容性 你可以添加 Material Design 特性,同时保持对 Android 5.0 之前版本的兼容。更多信息,请参见[维护兼容性章节](https://developer.android.com/training/material/compatibility.html)。 -## 使用 Material Design 更新现有应用 +#### 使用 Material Design 更新现有应用 -要更新现有应用,使其使用 Material Design,你需要翻新你的 layout 文件来遵从 Material Design 标准,并确保其包含了正确的深度,触摸反馈和动画。 +要更新现有应用,使其使用 Material Design,你需要翻新你的 layout 文件来遵从 Material Design 标准,并确保其包含了正确的元素高度,触摸反馈和动画。 -## 使用 Material Design 创建新的应用 +#### 使用 Material Design 创建新的应用 如果你要创建使用 Material Design 的新的应用,Material Design 指南提供了一套跨平台统一的设计。请遵从指南,使用新功能来进行 Android 应用的设计和开发。 @@ -37,7 +37,7 @@ ``` -Material 主题提供了更新后的系统组件,使你可以设置调色板和在触摸和 Activity 切换时使用默认的动画。更多信息,请参见 Material 主题章节。 +Material 主题提供了更新后的系统组件,使你可以设置调色板和在触摸和 Activity 切换时使用默认的动画。更多信息,请参见 [Material 主题](http://developer.android.com/training/material/theme.html) 章节。 ## 设计你的 Layouts @@ -51,7 +51,7 @@ Material 主题提供了更新后的系统组件,使你可以设置调色板 ## 定义视图的 Elevation -视图可以投射阴影, elevation 值决定了阴影的大小和顺序。要设定 elevation 值,请使用 `android:elevation` 属性: +视图可以投射阴影, elevation 值决定了阴影的大小和绘制顺序。要设定 elevation 值,请使用 `android:elevation` 属性: ```xml 编写: [allenlsy](https://github.com/allenlsy) - 原文: -Material Design 是一个全面的关于视觉,动作和交互的指南,实现跨平台的设计。要在你的 Android 应用中使用 Material Design, 你需要遵从 Material Design 规格文档,并学习在 Android 5.0 中新添加的组件和功能。 +Material Design 是一个全面的关于视觉,动作和交互的指南,实现跨平台的设计。要在你的 Android 应用中使用 Material Design, 你需要遵从 [Material Design](http://www.google.com/design/spec/material-design/introduction.html) 规格文档,来使用 Android 5.0 中新添加的组件和功能。 本课会通过以下方面教你如何创建 Material Design 设计的应用: @@ -12,7 +12,7 @@ Material Design 是一个全面的关于视觉,动作和交互的指南,实 * 矢量 drawable * 自定义动画 -本课还将告诉你在使用 Material Design 时如何兼容 Android 5.0 (API level 21) 之前的版本 +本课还将告诉你在使用 Material Design 时如何兼容 Android 5.0 (API level 21) 之前的版本。 # 课程 diff --git a/material/lists-cards.md b/material/lists-cards.md index f26aabe1a..18aa96c7b 100644 --- a/material/lists-cards.md +++ b/material/lists-cards.md @@ -2,7 +2,7 @@ > 编写: [allenlsy](https://github.com/allenlsy) - 原文: -要在应用中创建复杂的列表和使用 Material Design 的卡片列表,你可以使用 `RecyclerView` 和 `CardView`。 +要在应用中创建复杂的列表和使用 Material Design 的卡片列表,你可以使用 [`RecyclerView`](http://developer.android.com/reference/android/support/v7/widget/RecyclerView.html) 和 [`CardView`](http://developer.android.com/reference/android/support/v7/widget/CardView.html)。 ## 创建列表 @@ -11,7 +11,7 @@ `RecyclerView` 通过以下方式简化显示流程,并操作大量数据: * 使用 Layout manager 来定位元素 -* 常用操作的默认动画,比如添加或移除元素 +* 为常用操作定义默认动画,比如添加或移除元素 你也可以为 RecyclerView 自定义 Layout manager 和动画。 @@ -21,9 +21,9 @@ ![](list_mail.png) -Layout manager 给元素视图在 RecyclerView 中定位,并决定什么时候重用不在不可见的元素视图。要重用(或回收)视图,layout manager 会让 adapter 用另外的元素内容替换视图内的内容。回收 View 这个方法能提高性能,因为它避免了创建不必要的view对象,或执行昂贵的 `findViewById()` 查找。 +Layout manager 把元素视图放在 RecyclerView,并决定什么时候重用不可见的元素视图。要重用(或回收)视图时,layout manager 会让 adapter 用另外的元素内容替换视图内的内容。回收 View 这个方法能提高性能,因为它避免了创建不必要的view对象,或执行昂贵的 `findViewById()` 查找。 -`RecyclerView` 提供这些内建的 layout manager: +`RecyclerView` 提供以下内建的 layout manager: * `LinearLayoutManager` 用于显示横向或纵向的滚动列表 * `GridLayoutManager` 用于显示方格元素 @@ -33,11 +33,11 @@ Layout manager 给元素视图在 RecyclerView 中定位,并决定什么时候 ## 动画 -添加和删除元素的动画在RecyclerView中是默认被启用的。要自定义动画,你需要继承`RecyclerView.ItemAnimator` 类,使用`RecyclerView.setItemAnimator()`方法。 +添加和删除元素的动画在 RecyclerView 中是默认被启用的。要自定义动画,你需要继承`RecyclerView.ItemAnimator` 类,使用`RecyclerView.setItemAnimator()`方法。 ### 例子 -以下代码示例了如何添加RecyclerView 到一个Layout: +以下代码示例了如何添加 RecyclerView 到一个 Layout : ```xml @@ -48,7 +48,7 @@ Layout manager 给元素视图在 RecyclerView 中定位,并决定什么时候 android:layout_height="match_parent"/> ``` -添加 RecycclerView 组件到Layout之后,获得一个到RecyclerView的对象,连接它到Layout manager,再附上 adapter用于数据显示: +添加 RecyclerView 组件到Layout之后,获得一个到 RecyclerView 的对象,连接它到 Layout manager,再附上 adapter 用于数据显示: ```java public class MyActivity extends Activity { @@ -78,8 +78,7 @@ public class MyActivity extends Activity { } ``` -Adapter 支持获取数据集元素,创建元素的视图,并可以将新元素的内容去替代不可见元素视图中的内容。以下代码展示了一个简单的实现,其中的数据集包含了一个字符串数组,元素用 TextView 显示: - +Adapter 支持获取数据集元素,创建元素的视图,并可以将新元素的内容去替代不可见元素视图中的内容。以下代码展示了一个简单的实现,其中的数据集包含了一个字符串数组,数据元素用 TextView 显示: ```java @@ -138,9 +137,9 @@ public class MyAdapter extends RecyclerView.Adapter { ![](card_travel.png) -CardView 继承于FrameLayout类,它可以在卡片中显示信息,并保持在不同平台上拥有统一的风格。CardView组件可以设定阴影和圆角。 +CardView 继承于 FrameLayout 类,它可以在卡片中显示信息,并保持在不同平台上拥有统一的风格。CardView 组件可以设定阴影和圆角。 -创建一个带阴影的卡片,使用 `card_view:cardElevation` 属性。CardView 使用了Android 5.0 (API level 21)中的真是高度值以及动态阴影效果,在5.0一下的版本中有编程实现阴影想过的备选方案。更多内容,请参见保持兼容性章节。 +要创建一个带阴影的卡片,使用 `card_view:cardElevation` 属性。CardView 使用了Android 5.0 (API level 21)中的真实高度值以及动态阴影效果,在 5.0 以下的版本中有编程实现阴影的备选方案。更多内容,请参见保持兼容性章节。 使用以下属性来自定义CardView: diff --git a/material/shadows-clipping.md b/material/shadows-clipping.md index 9dd9bec8b..ed36cfd16 100644 --- a/material/shadows-clipping.md +++ b/material/shadows-clipping.md @@ -4,21 +4,26 @@ Material Design 引入了UI元素深度的概念。深度可以帮助用户理解每个元素的不同重要性,让用户集中注意力做手头的工作。 -视图的elevation,用 Z 属性来表示,它决定了阴影的大小:更大的 Z 值可以投射出更大的阴影。视图只会把阴影投射到 Z=0 的平面上;他们不会把阴影投射到介于自己和 Z=0 平面之间的视图上。 +视图的elevation,用 Z 属性来表示,它决定了阴影的大小:更大的 Z 值可以投射出更大更柔软的阴影。Z 值较大的视图会遮盖住Z值较小的视图。不过,Z值大小不会影响视图的大小。 -Z 值较大的视图会遮盖住Z值较小的视图。不过,Z值大小不会影响视图的大小。 +阴影是由被投射视图的上级视图来完成绘制,因此他受上级视图影响,附着在上级视图上。 Elevation对于创建临时上升这种动画同样很有用。 -## 給视图赋Elevation值 +更多信息,请参见[3D空间中的对象](http://www.google.com/design/spec/what-is-material/objects-in-3d-space.html)。 -视图的 Z 值有两个组成部分,elevation 和 translation。elevation 是一个必须部分,translation 是用于动画的: +## 给视图赋Elevation值 + +视图的 Z 值有两个组成部分: + +* elevation: 静态组成部分 +* translation: 动态部分,用于动画 Z = elevation + translationZ ![](shadows-depth.png) -要在layout中设置视图的elevation,使用`android:elevation`属性。要在Activity代码中设置elevation,使用`View.setElevation()`方法。 +在layout中设置视图的elevation,要使用`android:elevation`属性。要在Activity代码中设置elevation,使用`View.setElevation()`方法。 要设置视图的translation,使用`View.setTranslationZ()`方法。 @@ -26,13 +31,13 @@ Z = elevation + translationZ 你也可以使用 StateListAnimator 来声明动画。这非常适用于要通过状态改变来触发动画的情况,比如当用户按下按钮。更多信息,请查看[Animate View State Changes(当视图状态变化的动画,译者注)](https://developer.android.com/training/material/animations.html#ViewState)。 -Z值和X,Y值的测量单位是一样的。 +Z值的计算单位是dp。 ## 自定义视图的阴影和轮廓 -视图背景的边界决定了阴影的形状。轮廓是一个图形对象的外围形状,决定了触摸反馈动画的ripple区域。 +视图背景的边界决定了阴影的形状。**轮廓**是一个图形对象的外围形状,决定了触摸反馈动画的ripple区域。 -考虑以下是个视图: +假设以下是个视图: ```xml ``` -这个视图会投影出圆角,因为这是背景drawble的轮廓。如果提供一个自定义的轮廓,会覆盖这个默认的阴影形状。 +这个视图会投影出圆角,因为背景drawble可以决定视图轮廓。如果提供一个自定义的轮廓,会覆盖这个默认的阴影形状。 以下方式可以自定义视图的轮廓: @@ -61,11 +66,11 @@ Z值和X,Y值的测量单位是一样的。 2. 覆写 `getOutline()` 函数. 3. 用 `View.setOutlineProvider()` 方法来设定视图的轮廓提供者. -使用`Outline`类的函数,你可以创建椭圆和带圆角的矩形轮廓。视图的轮廓提供者会从视图的背景中获取轮廓。要避免视图投射阴影,你可以设置轮廓提供者为 null。 +使用`Outline`类的函数,你可以创建椭圆和带圆角的矩形轮廓。视图的轮廓提供者会从视图的背景中获取轮廓。如果不想让视图投射阴影,你可以设置轮廓提供者为 null。 -## Clip 视图 +## Clipping 视图 -Clipping 视图使你轻松的改变视图的形状。附着视图可以是为了设计的一致性,也可以是为了当用户输入信息时,改变视图的形状。你可以通过`View.setClipToOutline()` 将视图附着给一个轮廓,或使用`android:clipToOutline`属性。只有矩形、原型和圆角矩形轮廓支持附着,你可以通过`Outlin.canClip()`方法来检查是否支持附着。 +Clipping 视图(附着视图,译者注)使你轻松的改变视图的形状。你可以为了一致性而附着视图,也可以是为了当用户输入信息时,改变视图的形状。你可以通过`View.setClipToOutline()` 将视图附着给一个轮廓,或使用`android:clipToOutline`属性。只有矩形、圆形和圆角矩形轮廓支持附着功能,你可以通过`Outlin.canClip()`方法来检查是否支持附着。 把视图附着给drawable的形状,要将这个drawable设置为视图的背景,并调用`View.setClipToOutline()` 方法。 diff --git a/material/theme.md b/material/theme.md index 73a2ef167..87475b44b 100644 --- a/material/theme.md +++ b/material/theme.md @@ -16,16 +16,19 @@ Material 主题被定义在: -* @android:style/Theme.Material (dark version) -* @android:style/Theme.Material.Light (light version) -* @android:style/Theme.Material.Light.DarkActionBar +* `@android:style/Theme.Material` (暗色版本) +* `@android:style/Theme.Material.Light` (亮色版本) +* `@android:style/Theme.Material.Light.DarkActionBar`

+ ![](MaterialDark.png) -![](MaterialDark.png) + +![](MaterialLight.png) +

-想知道可用的 Material style 的列表,可以在 API 文档中参见 R.style. +想知道可用的 Material style 的列表,可以在 API 文档中参见 [R.style](http://developer.android.com/reference/android/R.style.html). > 注意: Material 主题只支持 Android 5.0 (API level 21) 及以上版本。[v7 Support 库](https://developer.android.com/tools/support-library/features.html#v7)提供了一些组件的 Material Deisgn 样式,也支持自定义调色板。更多信息,请参见维护兼容性章节。 @@ -54,7 +57,7 @@ Material 主题使得你很容易自定义状态栏,你可以设定适合自 你也可以在状态栏的背景上绘画。比如,你想让位于照片之上的状态栏透明,并保留一点深色渐变以确保白色图标可见。这样的话,设定 `android:statusBarColor` 属性为 `@android:color/transparent` 并调整窗口的 Flag 标记。你也可以用 `Window.setStatusBarColor()` 来实现动画或淡入淡出。 -> 注意:状态栏必须随时保持和 primary toolbar (即顶部Actionbar,译者注) 的清晰界线。除了一种情况,在状态栏后面显示图片或媒体内容时,你需要用渐变色来确保前台图标仍然可见。 +> 注意:状态栏必须随时保持和 primary toolbar (即顶部Actionbar,译者注) 的界线清晰。除了一种情况,即在状态栏后面显示图片或媒体内容时之外,你都要用渐变色来确保前台图标仍然可见。 当你自定义导航栏和状态栏时,要么两者都透明,要么只修改状态栏。其他情况下,导航栏应该保持黑色。 diff --git a/performance/improving-layouts/hierarchy-linearlayout.png b/performance/improving-layouts/hierarchy-linearlayout.png new file mode 100644 index 000000000..cac4caef0 Binary files /dev/null and b/performance/improving-layouts/hierarchy-linearlayout.png differ diff --git a/performance/improving-layouts/hierarchy-relativelayout.png b/performance/improving-layouts/hierarchy-relativelayout.png new file mode 100644 index 000000000..b3408e58b Binary files /dev/null and b/performance/improving-layouts/hierarchy-relativelayout.png differ diff --git a/performance/improving-layouts/index.md b/performance/improving-layouts/index.md index 4bad3b1fd..a7044f613 100644 --- a/performance/improving-layouts/index.md +++ b/performance/improving-layouts/index.md @@ -2,7 +2,7 @@ > 编写: [allenlsy](https://github.com/allenlsy) - 原文: -Layout是Android 应用中直接影响用户体验的关键部分。如果实现的不好,你的Layout会导致稍微费内存一点的程序变得非常卡顿。Android SDK 带有帮助你找到Layout性能问题的工具。使用它,你会用最小的内存空间实现流畅的UI。 +Layout 是 Android 应用中直接影响用户体验的关键部分。如果实现的不好,你的 Layout 会导致程序非常占用内存并且 UI 缓慢。Android SDK 带有帮助你找到 Layout 性能问题的工具。结合本课内容使用它,你会用最小的内存空间实现流畅的 UI。 # Lessons @@ -13,7 +13,7 @@ Layout是Android 应用中直接影响用户体验的关键部分。如果实现 #### [使用``标签重用Layout](reuse-layouts.html) -如果你的程序 UI 在不同地方重复使用某个 Layout,那本节教你如何创建高效的,可重用的 Layout 部件,并把它们“包含”到 UI Layout 中。 +如果你的程序的 UI 在不同地方重复使用某个 Layout,那本节教你如何创建高效的,可重用的 Layout 部件,并把它们“包含”到 UI Layout 中。 #### [按需载入视图](loading-ondemand.html) @@ -21,4 +21,4 @@ Layout是Android 应用中直接影响用户体验的关键部分。如果实现 #### [优化ListView的滑动性能](smooth-scrolling.html) -如果你有一个包含复杂或者每个项 (item) 包含很多数据的 ListView ,那么上下滚动的性能可能会降低。本节给你一些关于如何把滚动变得更流畅的提示。 +如果你有一个每个列表项 (item) 都包含很多数据或者复杂数据的 ListView ,那么列表滚动的性能可能会降低。本节给你一些关于如何把滚动变得更流畅的提示。 diff --git a/performance/improving-layouts/layout-listitem.png b/performance/improving-layouts/layout-listitem.png new file mode 100644 index 000000000..9cb241df6 Binary files /dev/null and b/performance/improving-layouts/layout-listitem.png differ diff --git a/performance/improving-layouts/optimizing-layout.md b/performance/improving-layouts/optimizing-layout.md index fb6f09eb6..92d557b02 100644 --- a/performance/improving-layouts/optimizing-layout.md +++ b/performance/improving-layouts/optimizing-layout.md @@ -2,68 +2,67 @@ > 编写:[allenlsy](https://github.com/allenlsy) - 原文: -一个常见的误区是,用最基础的 Layout 结构可以使 Layout 性能提高。然而,你的程序的每个组件和 Layout 都需要初始化、布置位置和绘制。例如,嵌套的 LinearLayout 可能会使得 View 的层级结构很深。此外,嵌套使用了 layout_weight 参数的 LinearLayout 的计算量会尤其大,因为每个子元素都需要被测量两次。这对需要多次重复 inflate 的 Layout 尤其需要注意,比如使用 ListView 或 GridView 时。 +一个常见的误区是,用最基础的 Layout 结构可以使 Layout 性能提高。然而,你的程序的每个组件和 Layout 都需要初始化、布局和绘制。例如,嵌套的 LinearLayout 可能会使得 View 的层级结构过深。此外,嵌套使用了 `layout_weight` 参数的 LinearLayout 的计算量会尤其大,因为每个子元素都需要被测量两次。这对需要多次重复 inflate 的 Layout 尤其需要注意,比如嵌套在 ListView 或 GridView 时。 本课中,你将学习使用 [Hierarchy Viewer](http://developer.android.com/tools/help/hierarchy-viewer.html)和[Layoutopt](http://developer.android.com/tools/help/layoutopt.html)来检查和优化 Layout。 ## 检查 Layout -Android SDK 工具带有有一个叫做 [Hierarchy Viewer](http://developer.android.com/tools/help/hierarchy-viewer.html) 的工具,能够在程序运行时分析 Layout。你可以用这个工具找到 Layout 的性能瓶颈。 +Android SDK 工具中有一个叫做 [Hierarchy Viewer](http://developer.android.com/tools/help/hierarchy-viewer.html) 的工具,能够在程序运行时分析 Layout。你可以用这个工具找到 Layout 的性能瓶颈。 -Hierarchy Viewer 会让你选择设备或者模拟器上正在运行的进程,然后显示其 Layout 的树型结构。每个块上的交通灯分别代表了它在测量、布置和绘画时的性能,帮你找出瓶颈部分。 +Hierarchy Viewer 会让你选择设备或者模拟器上正在运行的进程,然后显示其 Layout 的树型结构。每个块上的交通灯分别代表了它在测量、布局和绘画时的性能,帮你找出瓶颈部分。 -比如,下图是 ListView 中一个列表项的 Layout 。它的左边是一个小位图,右边是两个层叠的文字(Text)。像这种需要被多次 inflate 的 Layout ,优化它们会有事半功倍的效果。 +比如,下图是 ListView 中一个列表项的 Layout 。列表项里,左边放一个小位图,右边是两个层叠的文字。像这种需要被多次 inflate 的 Layout ,优化它们会有事半功倍的效果。 -![](http://developer.android.com/images/training/layout-listitem.png) +![](layout-listitem.png) `hierarchyviewer` 这个工具在 `/tools/` 中。当打开时,它显示一张可使用设备的列表,和它正在运行的组件。点击 __Load View Hierarchy__ 来查看所选组件的层级。比如,下图就是前一个图中所示 Layout 的层级关系。 +![](hierarchy-linearlayout.png) -![](http://developer.android.com/images/training/hierarchy-linearlayout.png) - -这张图中,你可以看到一个三层结构,其中在布置右下角的 TextView 的时候有问题。点击其中的项会显示每个步骤所花费的时间。这样,谁花了多长时间在什么哪个步骤上面,就清晰可见了。 +图中,你可以看到一个三层结构,其中右下角的 TextView 在布局的时候有问题。点击其中的项会显示每个步骤所花费的时间。这样,谁花了多长时间在什么哪个步骤上面,就清晰可见了。 ![](http://developer.android.com/images/training/hierarchy-layouttimes.png) 可以看到,渲染一个完整的列表项的时间就是: * 测量: 0.977ms -* 布置: 0.167ms +* 布局: 0.167ms * 绘制: 2.717ms ## 修正 Layout -因为上面的 Layout 性能太慢,原因在这个嵌套的 LinearLayout,解决的办法可能是将 Layout 层级变浅变宽,而不是又窄又深。RelativeaLayout 作为根节点时就可以达到目的。所以,当换成基于 RelativeLayout 的设计时,你的 Layout 变成了两层。新的 Layout 长成这样: +上面的 Layout 由于有这个嵌套的 LinearLayout 导致性能太慢,可能的解决办法是将 Layout 层级扁平化————变浅变宽,而不是又窄又深。RelativeaLayout 作为根节点时就可以达到目的。所以,当换成基于 RelativeLayout 的设计时,你的 Layout 变成了两层。新的 Layout 变成这样: -![](http://developer.android.com/images/training/hierarchy-relativelayout.png) +![](hierarchy-relativelayout.png) 现在渲染列表项的时间: * 测量: 0.598ms -* 布置: 0.110ms +* 布局: 0.110ms * 绘制: 2.146ms 可能看起来是很小的进步,但是由于它对列表中每个项都有效,这个时间要翻倍。 -更明显的性能差距,是当使用在 LinearLayout 中使用 `layout_weight` 的时候,因为会减慢“测量”的速度。这只是一个正确使用各种 Layout 的例子,当你使用 `layout_weight` 时一定要慎重。 +这个时间的主要差异是由于在 LinearLayout 中使用 `layout_weight` 所致,因为会减慢“测量”的速度。这只是一个正确使用各种 Layout 的例子,当你使用 `layout_weight` 时有必要慎重。 ## 使用 Lint > 大部分叫做 lint 的编程工具,都是类似于代码规范的检测工具。比如JSLint,CSSLinkt, JSONLint 等等。译者注。 +> 大部分叫做 lint 的编程工具,都是代码规范的检测工具。比如JSLint,CSSLinkt, JSONLint 等等。译者注。 -经常运行 [Lint](http://tools.android.com/tips/lint) 工具来检查 Layout 可能的优化方法,是个很好的实践。Lint 已经取代了 Layoutopt 工具,它拥有更强大的功能。Lint 中包含的一些检测[规则](http://tools.android.com/tips/lint-checks)有: +运行 [Lint](http://tools.android.com/tips/lint) 工具来检查 Layout 可能的优化方法,是个很好的实践。Lint 已经取代了 Layoutopt 工具,它拥有更强大的功能。Lint 中包含的一些检测[规则](http://tools.android.com/tips/lint-checks)有: * 使用compound drawable —— 用一个 drawable 替代一个包含 `ImageView` 和 `TextView` 的 `LinearLayout` 时会更有效率。 -* 合并根 frame —— 如果 `FrameLayout` 是 Layout 的根节点,并且没有使用padding 或者背景等,那么用 merge 标签替代他们会稍微高效些。 -* 没用的子节点 —— 一个没有子节点或者背景的 Layout 应该被去掉,来提高性能 -* 没用的父节点 —— 一个节点如果只有一个子节点,并且它不是 `ScrollView` 或根节点,并且它没有背景,这样的节点应该直接被子节点取代。 +* 合并根 frame —— 如果 `FrameLayout` 是 Layout 的根节点,并且没有使用 padding 或者背景等,那么用 merge 标签替代他们会稍微高效些。 +* 没用的子节点 —— 一个没有子节点或者背景的 Layout 应该被去掉,来获得更扁平的层级 +* 没用的父节点 —— 一个节点如果没有兄弟节点,并且它不是 `ScrollView` 或根节点,没有背景,这样的节点应该直接被子节点取代,来获得更扁平的层级 * 太深的 Layout —— Layout 的嵌套层数太深对性能有很大影响。尝试使用更扁平的 Layout ,比如 `RelativeLayout` 或 `GridLayout` 来提高性能。一般最多不超过10层。 -另一个使用 Lint 的好处就是,他内置于 Android Studio. 无论何时你编译你的程序的时候, Lint都会自动运行. 在使用 Android Studio 时,你也可以让 Lint 检查明确的编译级别,或者检查所有的编译级别. - +另一个使用 Lint 的好处就是,它内置于 Android Studio 中。Lint 在你导编译程序时自动运行。Android Studio 中,你可以为单独的 build variant 或者所有 variant 运行 lint。 -在 Android Studio 中,在 File>Settings>Project 中,你也可以管理检查列表和自定义检查列表,检查配置页面会显示其支持的检查选项. +你也可以在 Android Studio 中管理检测选项,在 **File > Settings > Project Settings** 中。检测配置页面会显示支持的检测项目。 -![](http://developer.android.com/images/tools/studio-inspections-config.png) +![](studio-inspections-config.png) -Lint 还能自动修复问题、提供建议或者直接跳转到不合适的代码处供你审查. \ No newline at end of file +Lint 有自动修复、提示建议和直接跳转到问题处的功能。 diff --git a/performance/improving-layouts/reuse-layouts.md b/performance/improving-layouts/reuse-layouts.md index 368c6a19f..118d97957 100644 --- a/performance/improving-layouts/reuse-layouts.md +++ b/performance/improving-layouts/reuse-layouts.md @@ -4,11 +4,11 @@ 虽然 Android 提供很多小的可重用的交互组件,你仍然可能需要重用复杂一点的组件,这也许会用到 Layout。为了高效重用整个的 Layout,你可以使用 `` 和 `` 标签把其他 Layout 嵌入当前 Layout。 -重用 Layout 非常强大,它让你可以创建复杂的可重用 Layout。比如,一个 yes/no 按钮面板,或者带有文字的自定义进度条。这还意味着,任何在多个 Layout 中重复出现的元素可以被提取出来,单独管理设计,再添加到 Layout 中。所以,当你要添加一个自定义 View 来实现单独的 UI 组件时,你可以更简单的直接重用某个 Layout 文件。 +重用 Layout 非常强大,它让你可以创建复杂的可重用 Layout。比如,一个 yes/no 按钮面板,或者带有文字的自定义进度条。这也意味着,任何在多个 Layout 中重复出现的元素可以被提取出来,被单独管理,再添加到 Layout 中。所以,虽然可以添加一个自定义 View 来实现单独的 UI 组件,你可以更简单的直接重用某个 Layout 文件。 ## 创建可重用 Layout -如果你已经知道你需要重用的 Layout,先创建一个新的 Layout XML 文件。比如,以下是一个来自 G-Kenya codelab 的 Layout,定义了一个需要添加到每个 Activity 中的标题栏(titlebar.xml): +如果你已经知道你需要重用的 Layout,就先创建一个新的 XML 文件并定义 Layout 。比如,以下是一个来自 G-Kenya codelab 的 Layout,定义了一个需要添加到每个 Activity 中的标题栏(titlebar.xml): ```xml ``` -根节点就是你想添加入的 Layout 类型。当需要显示这个标题栏时,就应该添加这个 Layout。 +根节点 View 就是你想添加入的 Layout 类型。 ## 使用``标签 @@ -48,7 +48,7 @@ ``` -你也可以覆写被include元素的根元素的所有 Layout 参数(任何 android:layout_* 属性)。比如: +你也可以覆写被添加的 Layout 的所有 Layout 参数(任何 android:layout_* 属性),通过在 `` 中声明他们来完成。比如: ```xml `标签 -`` 标签在你嵌套 Layout 时取消了 UI 层级中冗余的 ViewGroup 。比如,如果你有一个 Layout 是一个竖直方向的 LinearLayout,其中包含两个连续的 View 可以在别的 Layout 中重用,那么你会做一个 LinearLayout 来包含这两个 View ,以便重用。不过,当使用另一个 LinearLayout 来嵌套这个可重用的 LinearLayout 时,这种嵌套 LinearLayout 的方式除了减慢你的 UI 性能外没有任何意义。 +`` 标签在你嵌套 Layout 时取消了 UI 层级中冗余的 ViewGroup 。比如,如果你有一个 Layout 是一个竖直方向的 LinearLayout,其中包含两个连续的 View 可以在别的 Layout 中重用,那么你会做一个 LinearLayout 来包含这两个 View ,以便重用。不过,当使用一个 LinearLayout 作为另一个 LinearLayout 的根节点时,这种嵌套 LinearLayout 的方式除了减慢你的 UI 性能外没有任何意义。 为了避免这种情况,你可以用 `` 元素来替代可重用 Layout 的根节点。例如: @@ -81,4 +81,4 @@ ``` -现在,当你要将这个 Layout 包含到另一个 Layout 中时(并且使用了 `` 标签),系统会直接把两个 Button 放到 Layout 中,而不会有多余的 Layout 被嵌套。 +现在,当你要将这个 Layout 包含到另一个 Layout 中时(并且使用了 `` 标签),系统会忽略 `` 标签,直接把两个 Button 放到 Layout 中 `` 的所在位置。 diff --git a/performance/improving-layouts/studio-inspections-config.png b/performance/improving-layouts/studio-inspections-config.png new file mode 100644 index 000000000..e41afa16b Binary files /dev/null and b/performance/improving-layouts/studio-inspections-config.png differ