Harmony鸿蒙实战开发-抽奖app【源码在文末】
·
Harmony鸿蒙实战开发-抽奖app【源码在文末】
运行工具:DevEco Studio
一、运行演示
二、部分代码
/*
* Copyright (c) 2023 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import window from '@ohos.window';
import Logger from '../common/utils/Logger';
import DrawModel from '../viewmodel/DrawModel';
import PrizeDialog from '../view/PrizeDialog';
import PrizeData from '../viewmodel/PrizeData';
import StyleConstants from '../common/constants/StyleConstants';
import CommonConstants from '../common/constants/CommonConstants';
// 获取上下文
let context = getContext(this);
@Entry
@Component
struct CanvasPage {
private settings: RenderingContextSettings = new RenderingContextSettings(true);
private canvasContext: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings);
@State drawModel: DrawModel = new DrawModel();
@State screenWidth: number = 0;
@State screenHeight: number = 0;
@State rotateDegree: number = 0;
@State enableFlag: boolean = true;
@State prizeData: PrizeData = new PrizeData();
dialogController: CustomDialogController = new CustomDialogController({
builder: PrizeDialog({
prizeData: $prizeData,
enableFlag: $enableFlag
}),
autoCancel: false
});
aboutToAppear() {
// 获取屏幕宽高,不包括导航视图的高度
window.getLastWindow(context)
.then((windowClass: window.Window) => {
let windowProperties = windowClass.getWindowProperties();
this.screenWidth = px2vp(windowProperties.windowRect.width);
this.screenHeight = px2vp(windowProperties.windowRect.height);
})
.catch((error: Error) => {
Logger.error('获取窗口大小失败。原因:' + JSON.stringify(error));
})
}
build() {
Stack({ alignContent: Alignment.Center }) {
Canvas(this.canvasContext)
.width(StyleConstants.FULL_PERCENT)
.height(StyleConstants.FULL_PERCENT)
.onReady(() => {
this.drawModel.draw(this.canvasContext, this.screenWidth, this.screenHeight);
})
.rotate({
x: 0,
y: 0,
z: 1,
angle: this.rotateDegree,
centerX: this.screenWidth / CommonConstants.TWO,
centerY: this.screenHeight / CommonConstants.TWO
})
Image($r('app.media.ic_center'))
.width(StyleConstants.CENTER_IMAGE_WIDTH)
.height(StyleConstants.CENTER_IMAGE_HEIGHT)
.enabled(this.enableFlag)
.onClick(() => {
this.enableFlag = !this.enableFlag;
this.startAnimator();
})
}
.width(StyleConstants.FULL_PERCENT)
.height(StyleConstants.FULL_PERCENT)
.backgroundImage($r('app.media.ic_background'), ImageRepeat.NoRepeat)
.backgroundImageSize({
width: StyleConstants.FULL_PERCENT,
height: StyleConstants.BACKGROUND_IMAGE_SIZE
})
}
/**
* 启动动画
*/
startAnimator() {
let randomAngle = Math.round(Math.random() * CommonConstants.CIRCLE);
// 获取奖品信息
this.prizeData = this.drawModel.showPrizeData(randomAngle);
animateTo({
duration: CommonConstants.DURATION,
curve: Curve.Ease,
delay: 0,
iterations: 1,
playMode: PlayMode.Normal,
onFinish: () => {
this.rotateDegree = CommonConstants.ANGLE - randomAngle;
// 显示奖品信息弹窗
this.dialogController.open();
}
}, () => {
this.rotateDegree = CommonConstants.CIRCLE * CommonConstants.FIVE +
CommonConstants.ANGLE - randomAngle;
})
}
}
三、源码
通过百度网盘分享的文件:…zip
链接:https://pan.baidu.com/s/1xbu6QWOItJCKOzAaG49Piw
文件已经加密,请联系请加下方(wx号),获取源码,仅一杯奶茶钱
号码:Lvnvn0508
更多推荐


所有评论(0)