HarmonyOS应用<节气通>开发第18篇:关于页面与隐私政策
·

引言
关于页面是应用的重要组成部分,向用户展示应用信息、版本号、隐私政策和用户协议。本文将实现:
- 应用介绍
- 版本信息
- 隐私政策展示
- 用户协议展示
- 更新日志
通过本文,你将掌握如何构建一个完整的关于页面。
学习目标
完成本文后,你将能够:
- ✅ 实现应用介绍页面
- ✅ 显示版本信息
- ✅ 添加隐私政策
- ✅ 展示用户协议
- ✅ 添加更新日志
需求分析
功能模块设计
| 模块 | 功能描述 | 技术要点 |
|---|---|---|
| 应用介绍 | 展示应用功能和特色 | 图文展示、段落排版 |
| 版本信息 | 显示当前版本号 | 文本展示、更新检查 |
| 隐私政策 | 展示隐私声明 | WebView或文本展示 |
| 用户协议 | 展示服务条款 | WebView或文本展示 |
| 更新日志 | 展示版本更新内容 | 列表展示 |
设计思路
方案对比
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 图文介绍 | 视觉效果好,品牌形象突出 | 加载稍慢,图片资源占用大 | 推荐 - 适合大多数应用 |
| 纯文字介绍 | 加载快,资源占用小 | 视觉效果一般,吸引力不足 | 工具类或轻量应用 |
| 视频介绍 | 生动形象,信息传递更全面 | 流量消耗大,加载时间长 | 大型应用或品牌宣传 |
| 卡片式介绍 | 层次分明,信息结构清晰 | 设计复杂度较高 | 功能较多的应用 |
关键决策
决策1: 使用大图背景+渐变遮罩
- 原因:增加视觉吸引力,突出品牌形象,营造主题氛围
- 优势:用户进入页面就能感受到应用的主题和风格
- 技术实现:使用
Stack组件叠加背景图和渐变遮罩,确保文字可读
决策2: 更新日志使用列表展示
- 原因:日志内容结构化展示,便于阅读和快速浏览
- 优势:用户可以快速了解每个版本的更新内容
- 设计细节:版本号加粗突出,日期用灰色弱化,更新项用圆形标记
决策3: 法律信息使用独立入口
- 原因:法律文件内容较多,需要单独页面展示以确保可读性
- 优势:符合合规要求,用户体验更好
- 入口设计:使用列表项形式,点击跳转详情页
决策4: 检查更新功能
- 原因:方便用户获取最新版本功能
- 优势:提升用户体验,促进版本更新
- 实现方式:点击后检查版本并提示用户
架构设计
// 更新日志数据模型
interface ChangelogItem {
version: string; // 版本号
date: string; // 更新日期
content: string[]; // 更新内容列表
}
// 页面状态管理
@State version: string = '1.0.0'; // 当前版本号
@State changelog: ChangelogItem[] = []; // 更新日志列表
@State isCheckingUpdate: boolean = false; // 更新检查状态
页面结构规划
| 区域 | 功能 | 组件 |
|---|---|---|
| 顶部导航 | 返回按钮 + 标题 | Row + Image + Text |
| 应用介绍 | 背景图 + Logo + 名称 + 描述 | Stack + Image + Column |
| 功能特色 | 功能列表展示 | Card + Column + Row |
| 版本信息 | 当前版本 + 检查更新 | Card + Row |
| 更新日志 | 版本更新记录列表 | Card + ForEach |
| 法律信息 | 隐私政策、用户协议入口 | Card + Column + Divider |
| 底部版权 | 版权信息 | Column + Text |
视觉设计要点
-
色彩方案:
- 主色调:
#4A9B6D(绿色系,体现自然、节气主题) - 背景色:
#F8F7F2(浅米色,舒适阅读体验) - 文字颜色:标题
#333333,描述#666666,辅助#999999
- 主色调:
-
间距规范:
- 卡片间距:12vp
- 内边距:16vp
- 元素间距:8-16vp
-
卡片设计:
- 使用
Card组件增加层次感 - 圆角:8vp
- 阴影:轻微阴影提升立体感
- 使用
核心实现
步骤1: 页面结构设计
完整代码
// pages/About.ets
import router from '@ohos.router';
import prompt from '@ohos.prompt';
@Entry
@Component
struct About {
// 当前版本
@State version: string = '1.0.0';
// 更新日志
@State changelog: ChangelogItem[] = [
{ version: '1.0.0', date: '2024-01-15', content: ['首次发布', '支持24节气信息展示', '添加节气详情页面', '实现测验功能'] },
{ version: '0.9.0', date: '2024-01-10', content: ['新增文章模块', '优化首页布局', '修复已知bug'] },
{ version: '0.8.0', date: '2024-01-05', content: ['实现收藏功能', '添加学习记录', '优化性能'] }
];
/**
* 检查更新
*/
checkUpdate(): void {
prompt.showToast({ message: '当前已是最新版本' });
}
/**
* 构建UI
*/
build() {
Scroll() {
Column({ space: 0 }) {
// 1. 顶部导航
this.buildHeader()
// 2. 应用介绍
this.buildAppIntro()
// 3. 功能特色
this.buildFeatures()
// 4. 版本信息
this.buildVersionInfo()
// 5. 更新日志
this.buildChangelog()
// 6. 法律信息
this.buildLegalInfo()
// 7. 底部版权
this.buildFooter()
}
}
.width('100%')
.height('100%')
.backgroundColor('#F8F7F2')
}
}
interface ChangelogItem {
version: string;
date: string;
content: string[];
}
代码解析
1. 状态管理
- version: 当前版本号
- changelog: 更新日志列表
2. 页面结构
- 顶部导航
- 应用介绍
- 功能特色
- 版本信息
- 更新日志
- 法律信息
- 底部版权
步骤2: 顶部导航
/**
* 构建顶部导航
*/
@Builder
buildHeader(): void {
Row({ space: 16 }) {
Image($r('app.media.ic_back'))
.width(24)
.height(24)
.fillColor('#333333')
.onClick(() => {
try {
router.back();
} catch (error) {
console.error('返回失败: ' + JSON.stringify(error));
}
})
Text('关于我们')
.fontSize(18)
.fontWeight(FontWeight.Bold)
.fontColor('#333333')
Blank()
}
.width('100%')
.height(56)
.padding({ left: 16, right: 16 })
.backgroundColor('#FFFFFF')
}
设计要点:
- 返回按钮
- 标题居中
- 简洁的导航栏
步骤3: 应用介绍
/**
* 构建应用介绍
*/
@Builder
buildAppIntro(): void {
Stack({ alignContent: Alignment.BottomStart }) {
// 背景图
Image($r('app.media.ic_app_banner'))
.width('100%')
.height(200)
.objectFit(ImageFit.Cover)
// 渐变遮罩
Row()
.width('100%')
.height(200)
.linearGradient({
angle: 180,
colors: [
['#00000000', 0.3],
['#000000DD', 1]
]
})
// 内容
Column({ space: 8 }) {
// 应用图标和名称
Row({ space: 12 }) {
Stack({ alignContent: Alignment.Center }) {
Circle()
.width(64)
.height(64)
.fillColor('#4A9B6D')
Text('节')
.fontSize(32)
.fontWeight(FontWeight.Bold)
.fontColor('#FFFFFF')
}
Column({ space: 4 }) {
Text('节气通')
.fontSize(20)
.fontWeight(FontWeight.Bold)
.fontColor('#FFFFFF')
Text('探索二十四节气的奥秘')
.fontSize(14)
.fontColor('#FFFFFF')
.opacity(0.8)
}
}
}
.padding(16)
.width('100%')
}
.width('100%')
}
设计要点:
- 大图背景
- 渐变遮罩
- 应用图标和名称
步骤4: 功能特色
/**
* 构建功能特色
*/
@Builder
buildFeatures(): void {
Card() {
Column({ space: 16 }) {
// 标题
Text('功能特色')
.fontSize(18)
.fontWeight(FontWeight.Bold)
.fontColor('#333333')
// 特色列表
Column({ space: 12 }) {
this.buildFeatureItem(
$r('app.media.ic_calendar'),
'节气日历',
'完整展示24节气,了解每个节气的特点和习俗'
)
this.buildFeatureItem(
$r('app.media.ic_book'),
'知识百科',
'丰富的节气知识,包括气候、养生、食谱等'
)
this.buildFeatureItem(
$r('app.media.ic_test'),
'知识测验',
'检验学习成果,巩固节气知识'
)
this.buildFeatureItem(
$r('app.media.ic_star'),
'学习记录',
'记录学习历程,追踪学习进度'
)
}
}
.padding(16)
}
.width('92%')
.margin({ left: '4%', right: '4%', top: 12 })
}
/**
* 构建特色项
*/
@Builder
buildFeatureItem(icon: Resource, title: string, desc: string): void {
Row({ space: 12 }) {
Stack({ alignContent: Alignment.Center }) {
Circle()
.width(48)
.height(48)
.fillColor('#E8F5E9')
Image(icon)
.width(24)
.height(24)
.fillColor('#4A9B6D')
}
Column({ space: 4 }) {
Text(title)
.fontSize(15)
.fontWeight(FontWeight.Medium)
.fontColor('#333333')
Text(desc)
.fontSize(13)
.fontColor('#666666')
}
.flexGrow(1)
}
}
设计要点:
- 图标+标题+描述
- 列表布局
- 绿色主题色调
步骤5: 版本信息
/**
* 构建版本信息
*/
@Builder
buildVersionInfo(): void {
Card() {
Column({ space: 12 }) {
// 版本号
Row({ space: 8 }) {
Image($r('app.media.ic_info'))
.width(20)
.height(20)
.fillColor('#999999')
Text('版本信息')
.fontSize(16)
.fontColor('#333333')
Blank()
Text('v' + this.version)
.fontSize(14)
.fontColor('#999999')
}
// 检查更新
Row({ space: 8 }) {
Image($r('app.media.ic_update'))
.width(20)
.height(20)
.fillColor('#4A9B6D')
Text('检查更新')
.fontSize(16)
.fontColor('#333333')
.flexGrow(1)
Image($r('app.media.ic_arrow_right'))
.width(16)
.height(16)
.fillColor('#CCCCCC')
}
.onClick(() => {
this.checkUpdate();
})
}
.padding(16)
}
.width('92%')
.margin({ left: '4%', right: '4%', top: 12 })
}
设计要点:
- 版本号展示
- 检查更新按钮
步骤6: 更新日志
/**
* 构建更新日志
*/
@Builder
buildChangelog(): void {
Card() {
Column({ space: 16 }) {
// 标题
Row({ space: 8 }) {
Image($r('app.media.ic_history'))
.width(20)
.height(20)
.fillColor('#4A9B6D')
Text('更新日志')
.fontSize(18)
.fontWeight(FontWeight.Bold)
.fontColor('#333333')
}
// 日志列表
Column({ space: 16 }) {
ForEach(this.changelog, (item: ChangelogItem) => {
Column({ space: 8 }) {
// 版本和日期
Row({ space: 8 }) {
Text(item.version)
.fontSize(15)
.fontWeight(FontWeight.Bold)
.fontColor('#333333')
Text(item.date)
.fontSize(13)
.fontColor('#999999')
}
// 更新内容
Column({ space: 4 }) {
ForEach(item.content, (content: string) => {
Row({ space: 8 }) {
Circle()
.width(6)
.height(6)
.fillColor('#4A9B6D')
Text(content)
.fontSize(14)
.fontColor('#666666')
}
})
}
}
})
}
}
.padding(16)
}
.width('92%')
.margin({ left: '4%', right: '4%', top: 12 })
}
设计要点:
- 版本号+日期
- 更新内容列表
- 圆形列表项标记
步骤7: 法律信息
/**
* 构建法律信息
*/
@Builder
buildLegalInfo(): void {
Card() {
Column({ space: 0 }) {
// 隐私政策
this.buildLegalItem(
$r('app.media.ic_shield'),
'隐私政策',
() => {
prompt.showToast({ message: '隐私政策页面开发中' });
}
)
Divider()
.width('100%')
.color('#EEEEEE')
.height(1)
// 用户协议
this.buildLegalItem(
$r('app.media.ic_file'),
'用户协议',
() => {
prompt.showToast({ message: '用户协议页面开发中' });
}
)
Divider()
.width('100%')
.color('#EEEEEE')
.height(1)
// 第三方服务
this.buildLegalItem(
$r('app.media.ic_link'),
'第三方服务',
() => {
prompt.showToast({ message: '第三方服务页面开发中' });
}
)
}
}
.width('92%')
.margin({ left: '4%', right: '4%', top: 12 })
}
/**
* 构建法律项
*/
@Builder
buildLegalItem(icon: Resource, title: string, onClick: () => void): void {
Row({ space: 12 }) {
Image(icon)
.width(20)
.height(20)
.fillColor('#999999')
Text(title)
.fontSize(15)
.fontColor('#333333')
.flexGrow(1)
Image($r('app.media.ic_arrow_right'))
.width(16)
.height(16)
.fillColor('#CCCCCC')
}
.width('100%')
.height(52)
.padding({ left: 16, right: 16 })
.onClick(onClick)
}
设计要点:
- 隐私政策入口
- 用户协议入口
- 第三方服务入口
步骤8: 底部版权
/**
* 构建底部版权
*/
@Builder
buildFooter(): void {
Column({ space: 8 }) {
Text('节气通 v' + this.version)
.fontSize(14)
.fontColor('#999999')
Text('Copyright 2024 JieQiTong. All rights reserved.')
.fontSize(12)
.fontColor('#BBBBBB')
}
.width('100%')
.padding({ top: 24, bottom: 100 })
.alignItems(HorizontalAlign.Center)
}
设计要点:
- 应用名称和版本
- 版权信息
常见问题与解决方案
问题1: 背景图显示不全或拉伸变形
现象:
顶部背景图只显示部分内容,或者图片被拉伸变形。
原因分析:
- 图片尺寸与屏幕比例不匹配
objectFit属性设置不当- 图片资源本身尺寸不足
解决方案:
// ✅ 正确的图片显示配置
Stack({ alignContent: Alignment.BottomStart }) {
// 背景图
Image($r('app.media.ic_app_banner'))
.width('100%')
.height(200)
.objectFit(ImageFit.Cover) // 使用Cover模式保持比例
.onError(() => {
console.error('背景图加载失败');
})
// 渐变遮罩
Row()
.width('100%')
.height(200)
.linearGradient({
angle: 180,
colors: [
['#00000000', 0.3],
['#000000DD', 1]
]
})
// ... 内容
}
图片适配建议:
// 根据不同屏幕尺寸选择合适的图片
getBannerImage(): Resource {
const screenWidth = px2vp(windowWidth);
if (screenWidth > 1080) {
return $r('app.media.ic_app_banner_large');
} else if (screenWidth > 720) {
return $r('app.media.ic_app_banner_medium');
} else {
return $r('app.media.ic_app_banner_small');
}
}
问题2: 更新日志列表渲染错误或卡顿
现象:ForEach 渲染更新日志时出错,或者列表滚动卡顿。
原因分析:
- 缺少
key生成函数 - 数据结构不正确
- 嵌套
ForEach没有正确设置key - 列表项过多导致性能问题
解决方案:
// ✅ 正确的嵌套列表渲染
Column({ space: 16 }) {
ForEach(this.changelog, (item: ChangelogItem) => {
Column({ space: 8 }) {
// 版本信息
Row({ space: 8 }) {
Text(item.version).fontSize(15).fontWeight(FontWeight.Bold)
Text(item.date).fontSize(13).fontColor('#999')
}
// 更新内容(嵌套ForEach)
Column({ space: 4 }) {
ForEach(item.content, (content: string) => {
Row({ space: 8 }) {
Circle().width(6).height(6).fillColor('#4A9B6D')
Text(content).fontSize(14).fontColor('#666')
}
}, (content: string) => content) // 内层key生成函数
}
}
}, (item: ChangelogItem) => item.version) // 外层key生成函数
}
性能优化:
// ✅ 使用LazyForEach优化大数据量列表
List({ space: 16 }) {
LazyForEach(this.changelogDataSource, (item: ChangelogItem) => {
ListItem() {
Column({ space: 8 }) {
Row({ space: 8 }) {
Text(item.version).fontSize(15).fontWeight(FontWeight.Bold)
Text(item.date).fontSize(13).fontColor('#999')
}
Column({ space: 4 }) {
ForEach(item.content, (content: string) => {
Row({ space: 8 }) {
Circle().width(6).height(6).fillColor('#4A9B6D')
Text(content).fontSize(14).fontColor('#666')
}
}, (content: string) => content)
}
}
.padding(16)
}
}, (item: ChangelogItem) => item.version)
}
.width('100%')
.cachedCount(3) // 预加载3个列表项
问题3: 检查更新功能不工作或无响应
现象:
点击检查更新按钮没有反应,或者没有显示任何提示。
原因分析:
- 点击事件没有正确绑定
- 缺少异常处理
- 状态管理问题
- API调用失败
解决方案:
// ✅ 完整的检查更新实现
@State isCheckingUpdate: boolean = false;
checkUpdate(): void {
if (this.isCheckingUpdate) {
return; // 防止重复调用
}
this.isCheckingUpdate = true;
// 模拟版本检查
setTimeout(() => {
try {
// 模拟检查逻辑
const hasUpdate = false; // 实际应调用API
if (hasUpdate) {
prompt.showDialog({
title: '发现新版本',
message: '有新版本可用,是否更新?',
buttons: [
{ text: '稍后', color: '#666' },
{ text: '立即更新', color: '#4A9B6D' }
]
}).then((result) => {
if (result.index === 1) {
// 跳转到应用市场
prompt.showToast({ message: '正在跳转到应用市场...' });
}
});
} else {
prompt.showToast({ message: '当前已是最新版本' });
}
} catch (error) {
console.error('检查更新失败: ', error);
prompt.showToast({ message: '检查更新失败,请稍后重试' });
} finally {
this.isCheckingUpdate = false;
}
}, 1000);
}
// 按钮绑定
buildCheckUpdateButton(): void {
Row({ space: 8 }) {
Image($r('app.media.ic_update')).width(20).height(20).fillColor('#4A9B6D')
Text(this.isCheckingUpdate ? '检查中...' : '检查更新')
.fontSize(16)
.fontColor('#333')
.flexGrow(1)
if (!this.isCheckingUpdate) {
Image($r('app.media.ic_arrow_right')).width(16).height(16).fillColor('#CCC')
}
}
.width('100%')
.padding(16)
.onClick(() => {
if (!this.isCheckingUpdate) {
this.checkUpdate();
}
})
}
问题4: 页面滚动不流畅或卡顿
现象:
页面滚动时有卡顿现象,尤其是在低端设备上。
原因分析:
- 页面元素过多,渲染压力大
- 没有使用虚拟列表优化
- 图片没有懒加载
- 复杂的布局计算
解决方案:
// ✅ 使用Scroll包裹整个内容
Scroll() {
Column({ space: 0 }) {
this.buildHeader()
this.buildAppIntro()
this.buildFeatures()
this.buildVersionInfo()
this.buildChangelog()
this.buildLegalInfo()
this.buildFooter()
}
}
.width('100%')
.height('100%')
.backgroundColor('#F8F7F2')
.scrollable(ScrollDirection.Vertical)
.scrollBar(BarState.Off) // 隐藏滚动条提升视觉效果
进一步优化:
// ✅ 使用LazyForEach优化更新日志列表
buildChangelog(): void {
Card() {
Column({ space: 16 }) {
// 标题
Row({ space: 8 }) {
Image($r('app.media.ic_history')).width(20).height(20).fillColor('#4A9B6D')
Text('更新日志').fontSize(18).fontWeight(FontWeight.Bold).fontColor('#333')
}
// 使用List + LazyForEach
List({ space: 16 }) {
LazyForEach(this.changelog, (item: ChangelogItem) => {
ListItem() {
this.buildChangelogItem(item)
}
}, (item: ChangelogItem) => item.version)
}
.width('100%')
.cachedCount(3)
}
.padding(16)
}
.width('92%')
.margin({ left: '4%', right: '4%', top: 12 })
}
问题5: 版权信息显示位置不正确或被遮挡
现象:
底部版权信息被TabBar遮挡,或者显示位置过高。
原因分析:
- 底部
padding不足 - TabBar高度计算不准确
- 页面布局结构问题
解决方案:
// ✅ 正确的底部版权设计
buildFooter(): void {
Column({ space: 8 }) {
Text('节气通 v' + this.version)
.fontSize(14)
.fontColor('#999999')
Text('Copyright 2024 JieQiTong. All rights reserved.')
.fontSize(12)
.fontColor('#BBBBBB')
}
.width('100%')
.padding({ top: 24, bottom: 100 }) // 底部padding留出TabBar空间
.alignItems(HorizontalAlign.Center)
}
动态计算TabBar高度:
// ✅ 根据实际TabBar高度调整
get tabBarHeight(): number {
// 通常TabBar高度为56vp或60vp
return 56;
}
buildFooter(): void {
Column({ space: 8 }) {
Text('节气通 v' + this.version).fontSize(14).fontColor('#999')
Text('Copyright 2024 JieQiTong. All rights reserved.').fontSize(12).fontColor('#BBB')
}
.width('100%')
.padding({
top: 24,
bottom: this.tabBarHeight + 20 // TabBar高度 + 额外间距
})
.alignItems(HorizontalAlign.Center)
}
问题6: 功能特色列表渲染错误
现象:
功能特色列表项显示不正确,或者布局混乱。
原因分析:
flexGrow设置不当- 布局嵌套层级问题
- 图标尺寸不一致
解决方案:
// ✅ 正确的功能特色项布局
@Builder
buildFeatureItem(icon: Resource, title: string, desc: string): void {
Row({ space: 12 }) {
// 图标区域(固定大小)
Stack({ alignContent: Alignment.Center }) {
Circle()
.width(48)
.height(48)
.fillColor('#E8F5E9')
Image(icon)
.width(24)
.height(24)
.fillColor('#4A9B6D')
}
.flexShrink(0) // 防止被压缩
// 文字区域(自动扩展)
Column({ space: 4 }) {
Text(title)
.fontSize(15)
.fontWeight(FontWeight.Medium)
.fontColor('#333333')
Text(desc)
.fontSize(13)
.fontColor('#666666')
.maxLines(2) // 最多显示2行
.textOverflow({ overflow: TextOverflow.Ellipsis })
}
.flexGrow(1) // 占据剩余空间
.alignItems(HorizontalAlign.Start) // 左对齐
}
.width('100%')
}
问题7: 法律信息点击无响应
现象:
点击隐私政策、用户协议等法律信息项没有跳转。
原因分析:
- 点击事件没有绑定
- 路由跳转失败
- 权限问题
解决方案:
// ✅ 正确的法律项点击处理
@Builder
buildLegalItem(icon: Resource, title: string, pageUrl: string): void {
Row({ space: 12 }) {
Image(icon)
.width(20)
.height(20)
.fillColor('#999999')
Text(title)
.fontSize(15)
.fontColor('#333333')
.flexGrow(1)
Image($r('app.media.ic_arrow_right'))
.width(16)
.height(16)
.fillColor('#CCCCCC')
}
.width('100%')
.height(52)
.padding({ left: 16, right: 16 })
.onClick(() => {
this.navigateToLegalPage(pageUrl, title);
})
}
// 统一的跳转方法
navigateToLegalPage(pageUrl: string, title: string): void {
try {
router.pushUrl({
url: pageUrl,
params: { title: title }
});
} catch (error) {
console.error('跳转失败: ', error);
prompt.showToast({ message: '页面开发中,敬请期待' });
}
}
问题8: 应用图标显示为空白
现象:
应用介绍区域的图标显示为空白或默认图标。
原因分析:
- 图标资源不存在或路径错误
- 资源ID拼写错误
- 图标尺寸不符合要求
解决方案:
// ✅ 正确的图标显示
Stack({ alignContent: Alignment.Center }) {
Circle()
.width(64)
.height(64)
.fillColor('#4A9B6D')
// 使用文字代替图标(备用方案)
Text('节')
.fontSize(32)
.fontWeight(FontWeight.Bold)
.fontColor('#FFFFFF')
}
// 或者使用图片图标
Stack({ alignContent: Alignment.Center }) {
Circle()
.width(64)
.height(64)
.fillColor('#4A9B6D')
Image($r('app.media.ic_app_logo'))
.width(32)
.height(32)
.fillColor('#FFFFFF')
.onError(() => {
// 图标加载失败时显示文字
Text('节')
.fontSize(32)
.fontWeight(FontWeight.Bold)
.fontColor('#FFFFFF')
})
}
资源检查清单:
- 确认资源文件存在于
resources/base/media/目录 - 确认资源ID在
resources/base/profile/main_pages.json中注册 - 确认资源文件名和ID拼写一致
- 确认图片格式正确(png、jpg等)
本章小结
核心知识点
本文完成了关于页面的实现:
1. 应用介绍
- 大图背景+渐变遮罩
- 应用图标和名称
- 简洁的介绍文字
2. 功能特色
- 图标+标题+描述
- 列表布局展示
3. 版本信息
- 当前版本号
- 检查更新功能
4. 更新日志
- 版本号+日期
- 更新内容列表
5. 法律信息
- 隐私政策入口
- 用户协议入口
- 第三方服务入口
6. 底部版权
- 应用名称和版本
- 版权信息
下一步预告
关于页面已经完成!在下一篇文章中,我们将学习:
- 空态页面设计
- 空状态展示
- 引导用户操作
- 个性化空态
节气通应用已发布上线,可在应用市场下载体验
相关
- 项目源码: Atomgit仓库
更多推荐


所有评论(0)