鸿蒙开发【小鱼案例】实操

本文详细介绍了如何在OHOS项目中,通过动画组件和组件布局,实现小鱼在点击箭头按钮时的移动效果,包括页面初始化、坐标设置、按钮操作及动画应用的过程。
摘要由CSDN通过智能技术生成

小鱼案例详细实操

如下图所示,利用动画组件在点击箭头按钮时,让小鱼能够动起来。

一、在项目下新建一个页面

如图所示:

二、导入我们所需要的相应的图片,并且规范命

三、页面初始化准备

3.1采用Row行式布局,嵌套一个stack布局,同时设置背景图片的属性

导入背景图片,设置背景图片的高和宽度

代码示例:

build() {
 
Row() {
   
Stack(){


          }
 
.height('100%')
 
.width('100%')
 
 
}
 
.width('100%')
 
.height('100%')

  .backgroundImage($r('app.media.sea'))
 
.backgroundImageSize({height: '105%', width: '100%'})

}

四、绘制页面

4.1设置状态变量isBegin 来显示游戏是否开始

设置一个isBegin 的默认值为False布尔变量

代码如下:

//是否开始游戏
@State isBegin:boolean =false

4.2设置小鱼坐标,角度以及小鱼图片

并且写一个小鱼图片地址的变量来处理转向的另一张图,再写小鱼的坐标变量

代码如下:

struct AnimationPage {
 
//小鱼坐标
 
@State fishX:number = 200
 
@State fishY:number =180
 
//小鱼角度
 
@State angle:number = 0
 
//小鱼图片
 
@State src :Resource = $r("app.media.fish")
 
//是否开始游戏
 
@State isBegin:boolean =false

4.3 利用if判断进而展示开始游戏按钮

然后游戏开始,就会显示小鱼图片以及操作按钮

代码如下:

if (!this.isBegin){
 
Button('开始游戏')
   
.onClick(()=>{
     
//显示动画
     
animateTo({duration:1000 },
       
() =>{ //回调函数
         
this.isBegin =true
       
})
   
})
}else{
 
//小鱼图片
 
Image(this.src)
   
.position({x:this.fishX -20,y:this.fishY -20})
   
.rotate({angle:this.angle,centerX:'50%',centerY:'50%'})
   
.width(40)
   
.height(40)
  

   })

运行结果:

4.4 添加一个返回按钮

这里需要用到页面路由router,所有需要导包,利用back实现返回

源码:

import router from '@ohos.router'

代码如下:

// 返回按钮
Button('返回')
 
.position({x:0,y:0})
 
.backgroundColor('#20101010')
 
.onClick(()=>{
   
//返回上一页
   
router.back()
 
})

由于这里只有一个页面,点击返回按钮并没有明显效果

运行结果:

4.5 设置按钮操作

同样的利用Row容器布局,在分别添加左箭头,右箭头,利用Column容器添加上箭头,以及下箭头按钮

代码如下:

//操作按钮
Row(){
 
Button('←').backgroundColor('#20101010')

//利用Column容器添加上箭头,以及下箭头按钮
    Column({space:40}){
 
Button('').backgroundColor('#20101010')
   
   
  Button('').backgroundColor('#20101010')
  
Button('→').backgroundColor('#20101010')
 

4.6 分别给箭头添加点击事件,改变其坐标

4.6.1左箭头的点击事件

要让鱼向左,那就用水平移动,向左变小,向右变大

代码如下:

.onClick(()=>{
      this.fishX -=20
  })

4.6.2右箭头点击事件

要让鱼向右,那就用水平移动,向左变小,向右变大

代码如下:

.onClick(()=>{
 
this.fishX +=20

4.6.3上箭头点击事件

要让鱼向上,那就用垂直移动,向上变小,向下变大

代码如下:

.onClick(()=>{
 
this.fishY -=20

4.6.3下箭头点击事件

要让鱼向下,那就用垂直移动,向上变小,向下变大

代码如下:

.onClick(()=>{
 
this.fishX +=20

4.6.4 整体代码:

//操作按钮
Row(){
 
Button('←').backgroundColor('#20101010')
   
//显示动画
   
//设置点击事件改变坐标,点击向做移动20
   
.onClick(()=>{
   
          this.fishX -=20
      })
 
Column({space:40}){
   
Button('').backgroundColor('#20101010')
     
.onClick(()=>{
       
this.fishY -=20
     
})
   
Button('').backgroundColor('#20101010')
     
.onClick(()=>{
       
this.fishY +=20
     
})
 
}
 
Button('→').backgroundColor('#20101010')
   
.onClick(()=>{
     
this.fishX +=20
    })
}
.height(240)
.width(240)
.justifyContent(FlexAlign.Center)
.position({x:0,y:120})

4.7 添加动画

4.7.1 小鱼的显示动画

在小鱼图片属性下使用animation添加动画播放时长500ms,然后对左箭头的方向设置镜像图片。右箭头设置正常图片

代码如下:

//显示动画
//设置点击事件改变坐标,点击向做移动20
.onClick(()=>{
 
animateTo({duration:500 },
   
() =>{ //回调函数
     
this.fishX -=20
     
this.src=$r("app.media.fishrev")
 
})

})

右箭头下的小鱼图片

Button('→').backgroundColor('#20101010')
 
.onClick(()=>{
   
this.fishX +=20
   
this.src=$r('app.media.fish')
 
})

4.7.2 小鱼的转场动画

用transition给小鱼图片加转场动画,设置type的入场类型:TransitionType.Insert和不透明度opacity:0。然后使用translate来修改坐标,然后用animateTo来添加开始。

Image(this.src)
 
.position({x:this.fishX -20,y:this.fishY -20})
 
.rotate({angle:this.angle,centerX:'50%',centerY:'50%'})
 
.width(40)
 
.height(40)
 
.animation({duration:500,curve:Curve.Smooth})
  
//加入出场动画
 
.transition({
  
type:TransitionType.Insert,
  
opacity:0 ,//入场,一开始是透明的,慢慢变得不透明
  
translate:{x:-250}

 }
)

五、源代码展示:

import router from '@ohos.router'

@Entry
@Component

struct AnimationPage {
 
//小鱼坐标
 
@State fishX:number = 200
 
@State fishY:number =180
 
//小鱼角度
 
@State angle:number = 0
 
//小鱼图片
 
@State src :Resource = $r("app.media.fish")
 
//是否开始游戏
 
@State isBegin:boolean =false
 
build() {
   
Row() {
     
Stack(){
       
// 返回按钮
       
Button('返回')
         
.position({x:0,y:0})
         
.backgroundColor('#20101010')
         
.onClick(()=>{
           
//返回上一页
           
router.back()
         
})

       
if (!this.isBegin){
         
Button('开始游戏')
           
.onClick(()=>{
             
//显示动画
             
animateTo({duration:1000 },
               
() =>{ //回调函数
                 
//
                 
this.isBegin =true
               
})
           
})
       
}else{
         
//小鱼图片
         
Image(this.src)
           
.position({x:this.fishX -20,y:this.fishY -20})
           
.rotate({angle:this.angle,centerX:'50%',centerY:'50%'})
           
.width(40)
           
.height(40)
           
.animation({duration:500,curve:Curve.Smooth})
            
//加入出场动画
          
.transition({
            
type:TransitionType.Insert,
            
opacity:0 ,//入场,一开始是透明的,慢慢变得不透明
            
translate:{x:-250}

           }
)

             
//先加属性动画
           
// .animation({duration:500})
          //
操作按钮
         
Row(){
           
Button('←').backgroundColor('#20101010')
             
//显示动画
             
//设置点击事件改变坐标,点击向做移动20
             
.onClick(()=>{
               
animateTo({duration:500 },
                 
() =>{ //回调函数
                   
this.fishX -=20
                   
this.src=$r("app.media.fishrev")
               
})

             
})
           
Column({space:40}){
             
Button('').backgroundColor('#20101010')
               
.onClick(()=>{
                 
this.fishY -=20
               
})
             
Button('').backgroundColor('#20101010')
               
.onClick(()=>{
                 
this.fishY +=20
               
})
           
}
           
Button('→').backgroundColor('#20101010')
             
.onClick(()=>{
               
this.fishX +=20
               
this.src=$r('app.media.fish')
             
})
         
}
         
.height(240)
         
.width(240)
         
.justifyContent(FlexAlign.Center)
         
.position({x:0,y:120})
       
}
      }
   
.height('100%')
   
.width('100%')
   
}
   
.width('100%')
   
.height('100%')
   
.backgroundImage($r('app.media.sea'))
   
.backgroundImageSize({height: '105%', width: '100%'})
 
}
}

嘿嘿 就让我i们继续学习,继续加油吧!

  • 23
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值