色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

harmonyos開發新建頁面

jf_46214456 ? 來源:jf_46214456 ? 作者:jf_46214456 ? 2024-04-24 17:24 ? 次閱讀

介紹

介紹如何使用后臺代理提醒,實現一個簡易鬧鐘。要求完成以下功能:

  1. 展示指針表盤或數字時間。
  2. 添加、修改和刪除鬧鐘。
  3. 展示鬧鐘列表,并可打開和關閉單個鬧鐘。
  4. 鬧鐘到設定的時間后彈出提醒。
  5. 將鬧鐘的定時數據保存到輕量級數據庫。

相關概念

  • [Canvas]:提供畫布組件,用于自定義繪制圖形。
  • [CanvasRenderingContext2D]:使用RenderingContext在Canvas組件上進行繪制,繪制對象可以是矩形、文本、圖片等。
  • [后臺代理提醒]:開發應用時,開發者可以調用后臺提醒發布的接口創建定時提醒,包括倒計時、日歷、鬧鐘三種提醒類型。使用后臺代理提醒能力后,應用可以被凍結或退出,計時和彈出提醒的功能將被后臺系統服務代理。本應用中主要使用到后臺代理提醒的兩個接口:
    • publishReminder 發布一個后臺代理提醒,使用callback方式實現異步調用,該方法需要申請通知彈窗Notification.requestEnableNotification后才能調用。
    • cancelReminder 取消指定id的提醒,使用callback方式實現異步調用。
    • 鴻蒙開發指導文檔:[gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md]

搜狗高速瀏覽器截圖20240326151547.png

相關權限

本篇Codelab需要在module.json5中配置如下權限:

"requestPermissions": [
  {
    "name": "ohos.permission.PUBLISH_AGENT_REMINDER"
  }
]

環境搭建

軟件要求

  • [DevEco Studio]版本:DevEco Studio 3.1 Release。
  • OpenHarmony SDK版本:API version 9。

硬件要求

  • 開發板類型:[潤和RK3568開發板]。
  • OpenHarmony系統:3.2 Release。

環境搭建

完成本篇Codelab我們首先要完成開發環境的搭建,本示例以RK3568開發板為例,參照以下步驟進行:

  1. [獲取OpenHarmony系統版本]:標準系統解決方案(二進制)。以3.2 Release版本為例:
  2. 搭建燒錄環境。
    1. [完成DevEco Device Tool的安裝]
    2. [完成RK3568開發板的燒錄]
  3. 搭建開發環境。
    1. 開始前請參考[工具準備],完成DevEco Studio的安裝和開發環境配置。
    2. 開發環境配置完成后,請參考[使用工程向導]創建工程(模板選擇“Empty Ability”)。
    3. 工程創建完成后,選擇使用[真機進行調測]。

代碼結構解讀

本篇Codelab只對核心代碼進行講解,對于完整代碼,我們會在gitee中提供。

`HarmonyOSOpenHarmony鴻蒙文檔籽料:mau123789v直接拿`

├──entry/src/main/ets                       // 代碼區    
│  ├──common
│  │  ├──constants
│  │  │  ├──AlarmSettingType.ets            // 鬧鐘設置類型枚舉
│  │  │  ├──CommonConstants.ets             // 公共常量類
│  │  │  ├──DetailConstant.ets              // 詳情頁常量類
│  │  │  └──MainConstant.ets                // 首頁常量類
│  │  └──utils
│  │     ├──DataTypeUtils.ets               // 數據類型工具類
│  │     ├──DimensionUtil.ets               // 屏幕適配工具類
│  │     └──GlobalContext.ets               // 全局變量工具類
│  ├──entryability
│  │  └──EntryAbility.ets                   // 程序入口類
│  ├──model
│  │  ├──database
│  │  │  ├──PreferencesHandler.ets          // 輕量級數據庫操作類
│  │  │  └──PreferencesListener.ets         // 輕量級數據庫回調接口   
│  │  └──ReminderService.ets                // 系統后臺提醒服務類   
│  │──pages
│  │  ├──DetailIndex.ets                    // 詳情頁入口文件
│  │  └──MainIndex.ets                      // 主頁入口文件
│  │──view
│  │  ├──Detail     
│  │  │  ├──dialog
│  │  │  │  ├──CommonDialog.ets             // 公共Dialog組件
│  │  │  │  ├──DurationDialog.ets           // 鬧鈴時長選擇Dialog組件
│  │  │  │  ├──IntervalDialog.ets           // 鬧鈴間隔選擇Dialog組件
│  │  │  │  ├──RenameDialog.ets             // 鬧鈴名設置Dialog組件
│  │  │  │  └──RepeatDialog.ets             // 鬧鈴重復設置Dialog組件
│  │  │  ├──DatePickArea.ets                // 詳情頁時間選擇組件
│  │  │  └──SettingItem.ets                 // 詳情頁設置組件
│  │  ├──Main    
│  │  │  ├──AlarmList.ets                   // 主頁鬧鐘列表組件
│  │  │  ├──AlarmListItem.ets               // 主頁鬧鐘列表子項組件
│  │  │  └──ClockArea.ets                   // 主頁時鐘組件
│  │  └──BackContainer.ets                  // 自定義頭部組件
│  └──viewmodel
│     ├──AlarmItemBean.ets                  // 鬧鐘屬性類
│     ├──AlarmSettingBean.ets               // 鬧鐘設置屬性類
│     ├──DayDateBean.ets                    // 日期屬性類
│     ├──DetailViewModel.ets                // 詳情模塊邏輯功能類   
│     ├──MainViewModel.ets                  // 主頁邏輯功能類
│     └──ReminderItemBean.ets               // 后臺提醒屬性類
└──entry/src/main/resources                 // 資源文件目錄

鬧鐘主界面

鬧鐘界面包括當前時間、鬧鐘列表、添加鬧鐘子組件,具體包括以下模塊:

  • 展示當前時間。
  • 展示鬧鐘列表。
  • 添加鬧鐘。
  • 后臺代理提醒。

展示當前時間

當前時間使用了Canvas組件繪制,默認展示指針表盤,點擊表盤區域切換為數字時鐘。

在主頁的ClockArea組件中初始化Canvas畫布,并綁定指針表盤和數字時鐘切換事件。

// ClockArea.ets
@Component
export default struct ClockArea {
  ...
  build() {
    Canvas(this.renderContext)
      .width(this.canvasSize)
      .aspectRatio(CommonConstants.DEFAULT_LAYOUT_WEIGHT)
      .onReady(() = > {
        if (this.drawInterval === CommonConstants.DEFAULT_NUMBER_NEGATIVE) {
          this.startDrawTask();
        }
      })
      .onClick(() = > {
        this.showClock = !this.showClock;
      })
  }
  // 啟動繪畫任務
  private startDrawTask() {
    let that = this;
    that.renderContext.translate(
      this.canvasSize / CommonConstants.DEFAULT_DOUBLE,
      this.canvasSize / CommonConstants.DEFAULT_DOUBLE);
    that.drawClockArea();
    this.drawInterval = setInterval(() = > {
      that.drawClockArea();
    }, MainConstant.DEFAULT_ONE_SECOND_MS);
  }
  ...      
}

繪畫任務是使用CanvasRenderingContext2D對象在Canvas畫布組件上繪制指針表盤和數字時鐘。

// ClockArea.ets
// 開始繪制時鐘區域
private drawClockArea(): void{
  this.renderContext.clearRect(
    -this.canvasSize,
    -this.canvasSize / CommonConstants.DEFAULT_DOUBLE,
    this.canvasSize * CommonConstants.DEFAULT_DOUBLE,
    this.canvasSize);
  let date = new Date();
  let hours = date.getHours();
  let minutes = date.getMinutes();
  let seconds = date.getSeconds();
  if (this.showClock) {
    // 繪制表盤時鐘
  } else {
    // 繪制數字時鐘
  }
}

展示鬧鐘列表

鬧鐘列表組件,展示已添加的鬧鐘信息,可對鬧鐘進行啟停操作,點擊鬧鐘可跳轉到鬧鐘操作界面(修改和刪除鬧鐘)。主頁啟動后獲取輕量級數據庫中的鬧鐘定時數據,并監控數據庫數據變化。

// MainViewModel.ets
public queryAlarmsTasker(callback: (alarms: Array< AlarmItem >) = > void) {
  let that = this;
  that.queryDatabaseAlarms(callback);
  let preference = GlobalContext.getContext().getObject('preference') as PreferencesHandler;
  preference.addPreferencesListener({
    onDataChanged() {
      that.queryDatabaseAlarms(callback);
    }
  } as PreferencesListener)
}

在AlarmList.ets中添加鬧鐘列表子組件,并綁定啟停、跳轉事件。

// AlarmList.ets
@Component
export default struct AlarmList {
  @Link alarmItems: Array< AlarmItem >;

  build() {
    List({ space: DimensionUtil.getVp($r('app.float.alarm_list_space')) }) {
      ForEach(this.alarmItems, (item: AlarmItem) = > {
        ListItem() {
          AlarmListItem({ alarmItem: item })
        }.onClick(() = > {
          router.pushUrl({ url: "pages/DetailIndex", params: { alarmItem: item } });
        })
      }, (item: AlarmItem) = > JSON.stringify(item))
    }
    .padding({
      left: DimensionUtil.getVp($r('app.float.alarm_list_content_distance')),
      right: DimensionUtil.getVp($r('app.float.alarm_list_content_distance'))
    })
    .listDirection(Axis.Vertical)
    .layoutWeight(CommonConstants.DEFAULT_LAYOUT_WEIGHT)
    .margin({ top: DimensionUtil.getVp($r('app.float.alarm_list_content_distance')) })
  }
}

添加鬧鐘

添加鬧鐘,點擊界面底部鬧鐘添加按鈕,跳轉到鬧鐘操作界面(新增鬧鐘)。

在MainIndex.ets中為添加按鈕綁定跳轉事件。

// MainIndex.ets
@Entry
@Component
struct MainIndex {
  ...
  build() {
    Column() {
	  ...
      Button() {
        Image($r('app.media.ic_add')).objectFit(ImageFit.Fill)
      }
      ...
      .onClick(() = > {
        router.pushUrl({ url: "pages/DetailIndex" });
      })
    }
    ...
  }
}

后臺代理提醒

后臺代理提醒,根據鬧鐘列表中的數據來設置(啟停)鬧鐘實例。

// MainViewModel.ets
// 開啟/關閉鬧鐘
public openAlarm(id: number, isOpen: boolean) {
  for (let i = 0; i < this.alarms.length; i++) {
    if (this.alarms[i].id === id) {
      this.alarms[i].isOpen = isOpen;
      if (isOpen) {
        this.reminderService.addReminder(this.alarms[i]);
      } else {
        this.reminderService.deleteReminder(this.alarms[i].id);
      }
      let preference = GlobalContext.getContext().getObject('preference') as PreferencesHandler;
      preference.set(CommonConstants.ALARM_KEY, JSON.stringify(this.alarms));
      break;
    }
  }
}

鬧鐘詳情界面

鬧鐘操作界面分為新增和修改界面,其中在修改界面可刪除鬧鐘。具體包括以下模塊:

  • 退出或保存詳情。
  • 設置鬧鐘時間。
  • 設置鬧鐘詳情。
  • 提供后臺代理提醒能力

退出或保存詳情

點擊左上角“x”圖標關閉操作界面,關閉鬧鐘操作界面子組件,點擊右上角“√”圖標,保存當前設置并關閉操作界面。

在DetailIndex.ets入口頁面中引入頭部組件BackContainer,自定義了返回按鈕和返回邏輯操作,添加確定(“√”)子組件,并綁定點擊事件。

// DetailIndex.ets
build()
{
  Column() {
    ...
    Button() {
      Image($r('app.media.ic_confirm')).objectFit(ImageFit.Fill)
    }
    .backgroundColor($r('app.color.trans_parent'))
    .width(DimensionUtil.getVp($r('app.float.title_button_size')))
    .height(DimensionUtil.getVp($r('app.float.title_button_size')))
    .onClick(() = > {
      this.viewModel.setAlarmRemind(this.alarmItem);
      router.back();
    })
    ...
  }
}

// BackContainer.ets
build() {
  Row() {
    ...
    Text(this.header)
      .fontSize(DimensionUtil.getFp($r('app.float.detail_title_font_size')))
      .lineHeight(DimensionUtil.getVp($r('app.float.title_line_height')))
      .margin({ left: DimensionUtil.getVp($r('app.float.title_margin')) })
      .fontColor($r('app.color.grey_divider'))
      .fontWeight(FontWeight.Bold)
    Blank()
    if (this.closer) {
      this.closer();
    }
  }
  .padding({
    left: DimensionUtil.getVp($r('app.float.title_horizon_margin')),
    right: DimensionUtil.getVp($r('app.float.title_horizon_margin'))
  })
  .height(DimensionUtil.getVp($r('app.float.page_title_height')))
  .width(CommonConstants.FULL_LENGTH)
}

設置鬧鐘時間

設置鬧鐘提醒時間,在鬧鐘操作界面可通過滑動選擇器設置鬧鐘的提醒時間(包括:時段、小時、分鐘)。詳情頁DetailIndex.ets中添加鬧鐘時間選擇器子組件DatePickArea.ets。

// DatePickArea.ets
@Component
export default struct DatePickArea {
  build() {
    Stack({ alignContent: Alignment.Center }) {
      Row() {
        ForEach(DetailConstant.DAY_DATA, (item: DayDataBean) = > {
          TextPicker({ range: item.data, selected: item.delSelect })
            .layoutWeight(CommonConstants.DEFAULT_LAYOUT_WEIGHT)
            .backgroundColor($r('app.color.grey_light'))
            .onChange((value: string, index: number) = > {
              item.delSelect = index;
            })
        }, (item: DayDataBean) = > JSON.stringify(item))
      }
    }
    .height(DimensionUtil.getVp($r('app.float.date_picker_height')))
    .padding({
      left: DimensionUtil.getVp($r('app.float.date_picker_padding_horizon')),
      right: DimensionUtil.getVp($r('app.float.date_picker_padding_horizon'))
    })
  }
}

設置鬧鐘詳情

點擊詳情頁DetailIndex.ets設置條目組件SettingItem.ets,支持設置鬧鐘重復時間、鬧鐘名稱、重復次數和鬧鈴時長。

// SettingItem.ets
build() {
  Column() {
    ForEach(this.settingInfo, (item: AlarmSettingBean, index: number | undefined) = > {
      Divider()
      ...
      Row() {
        Text(item.title)...
        Text(item.content)...
        Image($r('app.media.ic_right'))...
      }
      ...
      .onClick(() = > {
        this.showSettingDialog(item.sType);
      })
    }, (item: AlarmSettingBean, index: number | undefined) = > JSON.stringify(item) + index)
  }
  ...
}

提供后臺代理提醒能力

導入系統提醒服務類ReminderService.ets,它由系統后臺代理提醒能力封裝,支持新增、修改、刪除系統鬧鐘功能,在設置、刪除鬧鐘后同步更新到輕量級數據庫中并刷新主頁頁面。

// DetailViewModel.ets
public async setAlarmRemind(alarmItem: AlarmItem) {
  alarmItem.hour = this.getAlarmTime(CommonConstants.DEFAULT_SINGLE);
  alarmItem.minute = this.getAlarmTime(CommonConstants.DEFAULT_DATA_PICKER_HOUR_SELECTION);
  let index = await this.findAlarmWithId(alarmItem.id);
  if (index !== CommonConstants.DEFAULT_NUMBER_NEGATIVE) { // 已存在,刪除原有提醒
    this.reminderService.deleteReminder(alarmItem.id);
  } else { // 不存在,以數據長度為notificationId新增鬧鐘數據
    index = this.alarms.length;
    alarmItem.notificationId = index;
    this.alarms.push(alarmItem);
  }
  this.reminderService.addReminder(alarmItem, (newId: number) = > {
    alarmItem.id = newId;
    alarmItem.isOpen = true;
    this.alarms[index] = alarmItem;
    let preference = GlobalContext.getContext().getObject('preference') as PreferencesHandler;
    preference.set(CommonConstants.ALARM_KEY, JSON.stringify(this.alarms));
  })
}

public async removeAlarmRemind(id: number) {
  this.reminderService.deleteReminder(id);
  let index = await this.findAlarmWithId(id);
  if (index !== CommonConstants.DEFAULT_NUMBER_NEGATIVE) {
    this.alarms.splice(index, CommonConstants.DEFAULT_SINGLE);
  }
  let preference = GlobalContext.getContext().getObject('preference') as PreferencesHandler;
  preference.set(CommonConstants.ALARM_KEY, JSON.stringify(this.alarms));
}

審核編輯 黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 鴻蒙
    +關注

    關注

    57

    文章

    2388

    瀏覽量

    42964
  • HarmonyOS
    +關注

    關注

    79

    文章

    1980

    瀏覽量

    30404
  • OpenHarmony
    +關注

    關注

    25

    文章

    3744

    瀏覽量

    16473
收藏 人收藏

    評論

    相關推薦

    鴻蒙OS開發實例:【頁面傳值跳轉】

    本篇主要介紹如何在HarmonyOS中,在頁面跳轉之間如何傳值 HarmonyOS頁面指的是帶有@Entry裝飾器的文件,其不能獨自存在,必須依賴UIAbility這樣的組件容器
    的頭像 發表于 03-29 20:16 ?2324次閱讀
    鴻蒙OS<b class='flag-5'>開發</b>實例:【<b class='flag-5'>頁面</b>傳值跳轉】

    HarmonyOS開發案例:【排行榜頁面

    本課程使用聲明式語法和組件化基礎知識,搭建一個可刷新的排行榜頁面。在排行榜頁面中,使用循環渲染控制語法來實現列表數據渲染,使用@Builder創建排行列表布局內容,使用裝飾器@State、@Prop、@Link來管理組件狀態。
    的頭像 發表于 04-30 16:16 ?2052次閱讀
    <b class='flag-5'>HarmonyOS</b><b class='flag-5'>開發</b>案例:【排行榜<b class='flag-5'>頁面</b>】

    HarmonyOS開發案例:【UIAbility內和UIAbility間頁面的跳轉】

    基于Stage模型下的UIAbility開發,實現UIAbility內和UIAbility間頁面的跳轉。
    的頭像 發表于 05-09 15:06 ?1658次閱讀
    <b class='flag-5'>HarmonyOS</b><b class='flag-5'>開發</b>案例:【UIAbility內和UIAbility間<b class='flag-5'>頁面</b>的跳轉】

    HarmonyOS應用開發頁面開發

    該文檔帶領大家手把手開發頁面,包含的知識有:1、XML編寫頁面;2、加載XML布局;3、創建Feature Ability;4、代碼編寫界面;5、實現頁面跳轉;6、跨設備啟動FA;注:
    發表于 09-10 17:44

    HarmonyOS應用開發】Hello HarmonyOS到Hi HarmonyOS(3)

    頁面跳轉。創建第二個頁面新建一個Empty Feature Ability(Java),看意思是一個空的元程序,其實不是,它里面還有模板的一些代碼,后續我們可以刪除重寫。頁面名稱
    發表于 11-11 09:25

    【資料】HarmonyOS應用開發頁面開發

    HarmonyOS應用開發頁面開發回復帖子查看資料下載鏈接:[hide][/hide]
    發表于 08-12 11:53

    #HarmonyOS征文# HarmonyOS實戰—實現注冊登錄和修改密碼頁面

    1. 注冊登錄頁面設置的要求如下: 新建項目:TextApplication上面的數值單位都是 px ,所以要轉換成 vp 和 fp在 1920*1080 分辨率下,1px = 1/3vpP40
    發表于 08-13 17:23

    HarmonyOS應用開發-ClickableImageJsDome體驗

    的設計。本DEMO主要涉及到的頁面元素有有image,image-animator,展現圖片資源在界面交互中幾種常見運用效果。旨在幫助開發人員快速了解HarmonyOS JSUI應用的開發
    發表于 06-18 11:42

    HarmonyOS/OpenHarmony應用開發-DevEco Studio新建項目的整體說明

    ,是開發者需要優先了解熟悉*附件:HarmonyOSOpenHarmony應用開發-DevEco Studio新建項目的整體說明.docx
    發表于 09-15 16:51

    華為開發者分論壇HarmonyOS學生公開課-如何學習HarmonyOS應用開發

    2021華為開發者分論壇HarmonyOS學生公開課-如何學習HarmonyOS應用開發
    的頭像 發表于 10-24 11:09 ?2162次閱讀
    華為<b class='flag-5'>開發</b>者分論壇<b class='flag-5'>HarmonyOS</b>學生公開課-如何學習<b class='flag-5'>HarmonyOS</b>應用<b class='flag-5'>開發</b>?

    HarmonyOS 應用開發-ClickableImageJsDome體驗

    的設計。本DEMO主要涉及到的頁面元素有有image,image-animator,展現圖片資源在界面交互中幾種常見運用效果。旨在幫助開發人員快速了解 HarmonyOS JSUI應用的開發
    的頭像 發表于 06-20 00:24 ?1138次閱讀
    <b class='flag-5'>HarmonyOS</b> 應用<b class='flag-5'>開發</b>-ClickableImageJsDome體驗

    面向HarmonyOS開發者的HarmonyOS 3.0 Beta介紹

    2021年10月,我們面向開發者發布了HarmonyOS 3.0 Developer Preview版,但開發的腳步永不停歇,現在我們又更新了API版本,配套發布了HarmonyOS
    的頭像 發表于 07-06 20:34 ?3338次閱讀

    小白指南:手把手教你用低代碼開發一個應用頁面

    一 什么是低代碼開發 在了解低代碼開發之前,我們先看看使用低代碼開發的效果。 低代碼開發效果示例 低代碼開發是DevEco Studio為
    的頭像 發表于 02-17 09:10 ?1220次閱讀

    HarmonyOS開發案例:【Ability內頁面間的跳轉】

    基于Stage模型下的Ability開發,實現Ability內頁面間的跳轉和數據傳遞。
    的頭像 發表于 05-09 10:39 ?612次閱讀
    <b class='flag-5'>HarmonyOS</b><b class='flag-5'>開發</b>案例:【Ability內<b class='flag-5'>頁面</b>間的跳轉】

    HarmonyOS Web頁面加載的原理和優化方法

    在移動互聯網時代,應用的頁面渲染速度對于用戶體驗至關重要。相對于原生頁面,Web頁面的性能存在多方面的技術挑戰。本文以HarmonyOS的ArkWeb組件為基礎,介紹了Web
    的頭像 發表于 12-05 15:14 ?326次閱讀
    <b class='flag-5'>HarmonyOS</b> Web<b class='flag-5'>頁面</b>加載的原理和優化方法
    主站蜘蛛池模板: 美女被爽cao免费漫画| 欧洲最强rapper潮水喷视频| 欧美精品久久久久性色AV苍井 | 麻豆精选2021| 依人在线观看| 久久亚洲精品中文字幕60分钟| 依人青青青在线观看| 久久人妻少妇嫩草AV蜜桃35I| 一个人的视频在线观看免费观看| 精品无码国产自产在线观看水浒传| 一本道综合久久免费| 浪小辉军警服务员VIDEOS| 98国产精品人妻无码免费| 日本国产精品无码一区免费看| 高傲教师麻麻被同学调教123| 无码国产精品高潮久久9| 国产午夜在线观看视频| 亚洲色婷婷久久精品AV蜜桃| 久久精品视频91| 5580免费午夜福利院| 欧美国产一区二区三区激情无套| xvideos中文版在线视频| 天堂网久久| 精品国产成人a区在线观看| 在线视频av大全色久久| 欧美性狂猛AAAAAA| 国产美女又黄又爽又色视频网站| 野草在线视频完整视频| 年轻的老师5理伦片| 国产短视频精品区| 亚洲一品AV片观看五月色婷婷| 久久视频在线视频| WWW国产精品内射老师| 小蝌蚪视频在线观看免费观看WWW 小货SAO边洗澡边CAO你动漫 | 乱奷XXXXXHD| 插曲的痛30分钟视频最新章节| 忘忧草下载| 快穿女主有名器的H纯肉黄暴拉文| chinesevideos原创麻豆| 亚欧免费观看在线观看更新| 两个奶头被吃得又翘又痛|