liyubing

feat(广告):左右挂角ui绘制

... ... @@ -19,49 +19,80 @@ export interface AdvRuleBean {
/**
* 广告展示顺序,0:随机展示;1列表循环
*/
displayMode:number
displayMode: number
/**
* 每间隔刷新n次展示广告
*/
refreshFrequency:number
refreshFrequency: number
/**
* 广告信息集合
*/
advert:AdvertsBean;
advert: AdvertsBean;
}
/**
* 广告组件数据
*/
export interface CompAdvBean{
export interface CompAdvBean {
/**
* 广告订单id
*/
id:string;
id: string;
/**
* 投放开始时间
*/
startTime:number;
startTime: number;
/**
* 投放结束时间
*/
endTime:number;
endTime: number;
/**
* 信息流广告素材
*/
matInfo:CompAdvMatInfoBean
matInfo: CompAdvMatInfoBean
/**
* 信息流广告位
*/
slotInfo:CompAdvSlotInfoBean
slotInfo: CompAdvSlotInfoBean
/**
* 展示优先级
* 广告A,displayPriority=1
* 广告B,displayPriority=2
* 则打开页面时,挂角展示顺序 A->B (优先级升序排列)
*/
displayPriority: number;
/**
* 展示的次数
*/
showCount: number;
/**
* 页面id
*/
pageId: String ;
/**
* 开屏广告-显示时长
*/
displayDuration: String;
/**
* 开屏广告-展示轮数
* 2.launchAdInfo有多个时:
* 广告A,displayRound=10
* 广告B,displayRound=5,
* 每次开机屏展示广告概率
* 广告A=10/(10+5)
* 广告B=5/(10+5)
* 广告A展示10次后,不再展示,
* 广告B展示5此后,不再展示。
* 下一轮展示继续上面逻辑。
*/
displayRound: number;
}
... ...
... ... @@ -52,6 +52,8 @@ export struct PageComponent {
@Builder
ListLayout() {
RelativeContainer() {
List() {
// 下拉刷新
ListItem() {
... ... @@ -94,6 +96,12 @@ export struct PageComponent {
// 包含了 头尾item,判断时需要考虑+2
this.pageModel.endIndex = end;
})
.id('page_list')
// 挂角广告
this.pageHornAd()
}
}
@Builder
... ... @@ -105,6 +113,111 @@ export struct PageComponent {
// })
}
/**
* 页面挂角广告
*/
@Builder
pageHornAd() {
if (this.pageModel.pageLeftCornerAdv.matInfo != null) {
// 页面左挂角
Image(this.pageModel.pageLeftCornerAdv.matInfo.matImageUrl[0])
.width($r('app.float.vp_80'))
.height($r('app.float.vp_80'))
.id("left_iv")
.alignRules({
bottom: { anchor: '__container__', align: VerticalAlign.Bottom },
left: { anchor: '__container__', align: HorizontalAlign.Start },
})
.margin({ bottom: "65vp", left: $r('app.float.card_comp_pagePadding_lf') })
Image($r('app.media.icon_adv_horn_close')).id('left_close').width($r('app.float.vp_16')).alignRules({
top: { anchor: 'left_iv', align: VerticalAlign.Top },
left: { anchor: 'left_iv', align: HorizontalAlign.Start },
}).offset({
x: -10,
y: -10
})
Text($r('app.string.comp_advertisement'))
.width($r('app.float.vp_28'))
.height($r('app.float.vp_16'))
.fontSize($r('app.float.font_size_10'))
.fontColor(Color.White)
.id('left_tag')
.alignRules({
bottom: { anchor: 'left_iv', align: VerticalAlign.Bottom },
left: { anchor: 'left_iv', align: HorizontalAlign.Start },
})
.textAlign(TextAlign.Center)
.backgroundColor($r('app.color.res_color_general_000000_30'))
.borderRadius({
topLeft: $r('app.float.vp_2'),
topRight: $r('app.float.vp_2'),
bottomLeft: $r('app.float.vp_2'),
bottomRight: $r('app.float.vp_2')
})
}
if (this.pageModel.pageRightCornerAdv.matInfo != null && this.pageModel.isShowRightAds) {
// 页面右边挂角
Image(this.pageModel.pageRightCornerAdv.matInfo.matImageUrl[0])
.width($r('app.float.vp_80'))
.height($r('app.float.vp_80'))
.id("right_iv")
.alignRules({
bottom: { anchor: '__container__', align: VerticalAlign.Bottom },
right: { anchor: '__container__', align: HorizontalAlign.End },
})
.margin({ bottom: "65vp", right: $r('app.float.card_comp_pagePadding_lf') })
.onClick(()=>{
// 关闭挂角广告
this.pageModel.isShowLeftAds = false;
})
Image($r('app.media.icon_adv_horn_close'))
.id('right_close')
.width($r('app.float.vp_16'))
.alignRules({
top: { anchor: 'right_iv', align: VerticalAlign.Top },
right: { anchor: 'right_iv', align: HorizontalAlign.End },
})
.offset({
x: 10,
y: -10
})
.onClick(() => {
// 关闭挂角广告
this.pageModel.isShowRightAds = false;
})
Text($r('app.string.comp_advertisement'))
.width($r('app.float.vp_28'))
.height($r('app.float.vp_16'))
.fontSize($r('app.float.font_size_10'))
.fontColor(Color.White)
.id('right_tag')
.alignRules({
bottom: { anchor: 'right_iv', align: VerticalAlign.Bottom },
right: { anchor: 'right_iv', align: HorizontalAlign.End },
})
.textAlign(TextAlign.Center)
.backgroundColor($r('app.color.res_color_general_000000_30'))
.borderRadius({
topLeft: $r('app.float.vp_2'),
topRight: $r('app.float.vp_2'),
bottomLeft: $r('app.float.vp_2'),
bottomRight: $r('app.float.vp_2')
})
}
}
async aboutToAppear() {
// 选中tab,才请求数据。拦截大量接口请求
if (this.navIndex === this.currentTopNavSelectedIndex) {
... ...
... ... @@ -5,6 +5,7 @@ import { closeRefresh } from '../utils/PullDownRefresh';
import PageModel from './PageModel';
import PageViewModel from './PageViewModel';
import { promptAction } from '@kit.ArkUI';
import { AdvRuleBean } from 'wdBean/src/main/ets/bean/adv/AdvsRuleBean';
const TAG = 'PageHelper';
... ... @@ -45,9 +46,50 @@ export class PageHelper {
return;
}
pageModel.pageInfo = pageInfo;
//解析广告资源
this.analysisAdvSource(pageModel);
this.parseGroup(pageModel)
}
/**
* 解析广告资源
* @param pageInfo
*/
analysisAdvSource(pageModel: PageModel) {
let pageInfo = pageModel.pageInfo
if (pageInfo.hasAdInfo === 1 && pageInfo.cornersAdv != null) {
// 优先展示展现中心广告
let cornersAdv = pageInfo.cornersAdv
} else if (pageInfo.cornersAdv2 != null && pageInfo.cornersAdv2.length > 0) {
// 广告中心-挂角广告信息
let cornersAdv2 = pageInfo.cornersAdv2
// 获取
let showCompAdvBean = cornersAdv2[0]
//
let slotInfo = showCompAdvBean.slotInfo;
let postion = slotInfo.position
if (postion == 0) {
//左边挂角
pageModel.pageLeftCornerAdv = showCompAdvBean
pageModel.isShowLeftAds = true
} else {
// 右边挂角
pageModel.pageRightCornerAdv = showCompAdvBean
pageModel.isShowRightAds = true
}
Logger.error("XXX", JSON.stringify(pageInfo.cornersAdv2))
}
}
async parseGroup(pageModel: PageModel) {
let pageInfo: PageInfoDTO = pageModel.pageInfo
pageModel.groupList = []
... ...
... ... @@ -4,6 +4,7 @@ import { ViewType } from 'wdConstant/src/main/ets/enum/ViewType';
import { RefreshConstants as Const } from '../utils/RefreshConstants';
import { PageUIReqBean } from '../components/page/bean/PageUIReqBean';
import { GroupInfoDTO, PageInfoDTO } from 'wdBean/src/main/ets/bean/navigation/PageInfoDTO';
import { CompAdvBean } from 'wdBean/src/main/ets/bean/adv/AdvsRuleBean';
/**
* 页面下拉刷新、上拉加载数据bean。
... ... @@ -50,6 +51,15 @@ export default class PageModel {
// keyGenerator相关字符串,用于刷新list布局
timestamp: String = '1';
//左右挂角广告对象
pageLeftCornerAdv:CompAdvBean = {} as CompAdvBean
isShowLeftAds : boolean = true;
pageRightCornerAdv:CompAdvBean = {} as CompAdvBean
isShowRightAds : boolean = true;
/**
* 简单复制业务数据
*/
... ...
... ... @@ -121,11 +121,11 @@
"value": "#99636363"
},
{
"name":"color_648DF2",
"name": "color_648DF2",
"value": "#648DF2"
},
{
"name":"color_EEEEEE",
"name": "color_EEEEEE",
"value": "#EEEEEE"
},
{
... ... @@ -151,6 +151,10 @@
{
"name": "color_0D000000",
"value": "#0D000000"
},
{
"name": "res_color_general_000000_30",
"value": "#4D000000"
}
]
}
\ No newline at end of file
... ...
... ... @@ -209,6 +209,10 @@
"value": "3vp"
},
{
"name": "vp_2",
"value": "2vp"
},
{
"name": "vp_55",
"value": "55vp"
},
... ... @@ -225,6 +229,14 @@
"value": "16vp"
},
{
"name": "vp_28",
"value": "28vp"
},
{
"name": "vp_80",
"value": "80vp"
},
{
"name": "card_comp_pagePadding_lf",
"value": "16fp"
},
... ...
... ... @@ -48,5 +48,10 @@
"name": "reason_read_write_media",
"value": "user_grant"
}
,
{
"name": "comp_advertisement",
"value": "广告"
}
]
}
\ No newline at end of file
... ...