“value”: “androidhwext:style/Theme.Emui.Light.NoTitleBar”,
“extra”: “”
}
]
}
4. 保存图片
将图片保存到entry>src>main>resources>rawfile文件中。
二、欢迎页面
1. 更改文件名
在entry>src>ets>default>pages>index.ets文件右键,在弹出的菜单栏中选择Refactor,再在弹出的子菜单栏中选择Rename,或者按Shift+F6,将文件命名为logo.ets。
将entry>src>main>config.json文件中"js"项中的"pages"项中的"pages/index"更改为"pages/logo"。
config.json最下方部分代码:
“js”: [
{
“mode”: {
“syntax”: “ets”,
“type”: “pageAbility”
},
“pages”: [
“pages/logo”
],
“name”: “default”,
“window”: {
“designWidth”: 720,
“autoDesignWidth”: false
}
}
]
2. 添加背景
在logo.ets文件中,通过Image($rawfile(‘LOGO.png’))可放置Logo图片,通过Text(‘木棉花扫雷’)可放置文字内容。
属性linearGradient为设置渐变颜色,linearGradient中的angle为渐变角度,设置为180,即为从上往下渐变,colors则为渐变的颜色。
logo.ets:
@Entry
@Component
struct Logo {
build() {
Flex({ justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center, direction: FlexDirection.Column }) {
Image($rawfile(‘LOGO.png’))
.objectFit(ImageFit.Contain)
.height(300)
Text(‘木棉花扫雷’)
.fontSize(30)
.fontColor(Color.White)
.margin({ top: 200 })
}
.width(‘100%’)
.height(‘100%’)
.linearGradient(
{
angle: 180,
colors: [[‘#D3D7DC’, 0.1], [“#B4BED2”, 0.6], [“#A0AAC8”, 1]]
})
}
}
3. 添加动画效果
这里使用的动画效果是通过animateTo显式动画实现的。animateTo显式动画可以设置组件从状态A到状态B的变化动画效果,包括样式、位置信息和节点的增加删除等,开发者无需关注变化过程,只需指定起点和终点的状态。animateTo还提供播放状态的回调接口,是对属性动画的增强与封装。
添加状态变量opacityValue和scaleValue并初始化为0,分别用于表示透明度和放缩的倍数,动画效果中实现这两个数值从0到1,即可实现Logo的渐出和放大效果。
定义一个贝塞尔曲线cubicBezier,Curves.cubicBezier(0.1, 0.2, 1, 1)。由于需要使用到动画能力接口中的插值计算,故需要导入curves模块。@ohos.curves模块提供了线性Curve. Linear、阶梯step、三阶贝塞尔(cubicBezier)和弹簧(spring)插值曲线的初始化函数,可以根据入参创建一个插值曲线对象。
在animateTo显式动画中,设置动画时长(duration)为2s,延时(delay)0.1s开始播放,设置显示动效event的闭包函数(curve),即起点状态到终点状态为透明度opacityValue和大小scaleValue从0到1。
logo.ets:
// @ts-nocheck
import Curves from ‘@ohos.curves’
@Entry
@Component
struct Logo {
@State private opacityValue: number = 0
@State private scaleValue: number = 0
private curve1 = Curves.cubicBezier(0.1, 0.2, 1, 1)
build() {
Flex({ justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center, direction: FlexDirection.Column }) {
Image($rawfile(‘LOGO.png’))
.objectFit(ImageFit.Contain)
.height(300)
.scale({ x: this.scaleValue, y: this.scaleValue })
.opacity(this.opacityValue)
.onAppear(() => {
animateTo({
duration: 2000,
curve: this.curve1,
delay: 100,
}, () => {
this.opacityValue = 1
this.scaleValue = 1
})
})
Text(‘木棉花扫雷’)
.fontSize(30)
.fontColor(Color.White)
.margin({ top: 200 })
}
.width(‘100%’)
.height(‘100%’)
.linearGradient(
{
angle: 180,
colors: [[‘#D3D7DC’, 0.1], [“#B4BED2”, 0.6], [“#A0AAC8”, 1]]
})
}
}
4. 添加跳转效果
先创建一个mainpage.ets文件。
在animateTo显示动画播放结束的onFinish回调接口中,调用定时器Timer的setTimeout接口延时1s后,调用router.replace,显示mainpage.ets页面。其中同样需要导入router模块。
logo.ets:
// @ts-nocheck
import router from ‘@system.router’
import Curves from ‘@ohos.curves’
@Entry
@Component
struct Logo {
@State private opacityValue: number = 0
@State private scaleValue: number = 0
private curve1 = Curves.cubicBezier(0.1, 0.2, 1, 1)
build() {
Flex({ justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center, direction: FlexDirection.Column }) {
Image($rawfile(‘LOGO.png’))
.objectFit(ImageFit.Contain)
.height(300)
.scale({ x: this.scaleValue, y: this.scaleValue })
.opacity(this.opacityValue)
.onAppear(() => {
animateTo({
duration: 2000,
curve: this.curve1,
delay: 100,
onFinish: () => {
setTimeout(() => {
router.replace({ uri: “pages/mainpage” })
}, 1000);
}
}, () => {
this.opacityValue = 1
this.scaleValue = 1
})
})
Text(‘木棉花扫雷’)
.fontSize(30)
.fontColor(Color.White)
.margin({ top: 200 })
}
.width(‘100%’)
.height(‘100%’)
.linearGradient(
{
angle: 180,
colors: [[‘#D3D7DC’, 0.1], [“#B4BED2”, 0.6], [“#A0AAC8”, 1]]
})
}
}
三、主页页面
1. 添加背景
游戏页面的背景和欢迎页面的背景几乎一样,这里就不重复啰嗦了。
mainpage.ets:
@Entry
@Component
struct Mainpage {
build() {
Column() {
Image($rawfile(‘mine.png’))
.objectFit(ImageFit.Contain)
.height(300)
.scale({ x: 0.5, y: 0.5 })
.opacity(0.8)
}
.width(‘100%’)
.height(‘100%’)
.linearGradient(
{
angle: 180,
colors: [[‘#D3D7DC’, 0.1], [“#B4BED2”, 0.6], [“#A0AAC8”, 1]]
})
}
}
2. 添加按钮
从效果图可以看出按钮的样式是一致的,因此我们可以使用装饰器@Component自定义按钮。添加四个变量String、difficulty、Number_row和Number_column,分别用于记录难度文本、地雷数量、网格的行数和网格的列数。在Button组件中设置图片和文本的样式。 [br/>在装饰器@Entry装饰的组件中,通过调用自定义组件的形式绘制三个按钮。
mainpage.ets:](mailto:br/%3E%E5%9C%A8%E8%A3%85%E9%A5%B0%E5%99%A8@Entry%E8%A3%85%E9%A5%B0%E7%9A%84%E7%BB%84%E4%BB%B6%E4%B8%AD%EF%BC%8C%E9%80%9A%E8%BF%87%E8%B0%83%E7%94%A8%E8%87%AA%E5%AE%9A%E4%B9%89%E7%BB%84%E4%BB%B6%E7%9A%84%E5%BD%A2%E5%BC%8F%E7%BB%98%E5%88%B6%E4%B8%89%E4%B8%AA%E6%8C%89%E9%92%AE%E3%80%82%3Cbr/)
@Entry
@Component
struct Mainpage {
build() {
Column() {
Image($rawfile(‘mine.png’))
.objectFit(ImageFit.Contain)
.height(300)
.scale({ x: 0.5, y: 0.5 })
.opacity(0.8)
setButton({ String: ‘初级’, difficulty: 10, Number_row: 9, Number_column: 9 });
setButton({ String: ‘中级’, difficulty: 30, Number_row: 12, Number_column: 12 });
setButton({ String: ‘高级’, difficulty: 50, Number_row: 16, Number_column: 16 });
}
.width(‘100%’)
.height(‘100%’)
.linearGradient(
{
angle: 180,
colors: [[‘#D3D7DC’, 0.1], [“#B4BED2”, 0.6], [“#A0AAC8”, 1]]
})
}
}
@Component
struct setButton {
private String: string
private difficulty: number
private Number_row: number
private Number_column: number
build() {
Button({ type: ButtonType.Capsule, stateEffect: true }){
Column(){
Text(this.String)
.textAlign(TextAlign.Center)
.fontSize(30)
.fontWeight(600)
.fontColor(‘#0000FF’)
.margin({ top: -5 })
Flex({ justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center, direction: FlexDirection.Row }) {
Text('( ’ + this.difficulty.toString() + ‘个’)
.textAlign(TextAlign.Center)
.fontSize(22)
.fontWeight(600)
.fontColor(‘#416EBE’)
.margin({ top: -2, right: 5 })
Image($rawfile(‘mine.png’))
.height(26)
.width(26)
Text(this.Number_row.toString() + ‘*’ + this.Number_column.toString() + ’ )')
.textAlign(TextAlign.Center)
.fontSize(22)
.fontWeight(600)
.fontColor(‘#416EBE’)
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)
![](https://i-blog.csdnimg.cn/blog_migrate/4750b47ec41a4d01aa4e35c7d97e7870.jpeg)
总结
学习技术是一条慢长而艰苦的道路,不能靠一时激情,也不是熬几天几夜就能学好的,必须养成平时努力学习的习惯。所以:贵在坚持!
最后如何才能让我们在面试中对答如流呢?
答案当然是平时在工作或者学习中多提升自身实力的啦,那如何才能正确的学习,有方向的学习呢?有没有免费资料可以借鉴?为此我整理了一份Android学习资料路线:
这里是一部分我工作以来以及参与过的大大小小的面试收集总结出来的一套BAT大厂面试资料专题包,主要还是希望大家在如今大环境不好的情况下面试能够顺利一点,希望可以帮助到大家。
好了,今天的分享就到这里,如果你对在面试中遇到的问题,或者刚毕业及工作几年迷茫不知道该如何准备面试并突破现状提升自己,对于自己的未来还不够了解不知道给如何规划。来看看同行们都是如何突破现状,怎么学习的,来吸收他们的面试以及工作经验完善自己的之后的面试计划及职业规划。
最后,祝愿即将跳槽和已经开始求职的大家都能找到一份好的工作!
这些只是整理出来的部分面试题,后续会持续更新,希望通过这些高级面试题能够降低面试Android岗位的门槛,让更多的Android工程师理解Android系统,掌握Android系统。喜欢的话麻烦点击一个喜欢再关注一下
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!
有免费资料可以借鉴?为此我整理了一份Android学习资料路线:
[外链图片转存中…(img-uSwWBxJ2-1712388833584)]
这里是一部分我工作以来以及参与过的大大小小的面试收集总结出来的一套BAT大厂面试资料专题包,主要还是希望大家在如今大环境不好的情况下面试能够顺利一点,希望可以帮助到大家。
[外链图片转存中…(img-a6bPQqzX-1712388833584)]
好了,今天的分享就到这里,如果你对在面试中遇到的问题,或者刚毕业及工作几年迷茫不知道该如何准备面试并突破现状提升自己,对于自己的未来还不够了解不知道给如何规划。来看看同行们都是如何突破现状,怎么学习的,来吸收他们的面试以及工作经验完善自己的之后的面试计划及职业规划。
最后,祝愿即将跳槽和已经开始求职的大家都能找到一份好的工作!
这些只是整理出来的部分面试题,后续会持续更新,希望通过这些高级面试题能够降低面试Android岗位的门槛,让更多的Android工程师理解Android系统,掌握Android系统。喜欢的话麻烦点击一个喜欢再关注一下