精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

如何創建子窗口并與主窗口通信(Window模塊以及AppStorage的使用)

開發 前端
本文使用AppStorage實現主窗口和子窗口之間的數據傳遞,除此之外,Emitter和EventHub等方式也可以實現,用戶可以根據實際業務需要進行選擇。

想了解更多關于開源的內容,請訪問:

51CTO 開源基礎軟件社區

https://ost.51cto.com

場景介紹

應用開發過程中,經常需要創建彈窗(子窗口)用來承載跟當前內容相關的業務,比如電話應用的撥號彈窗;閱讀應用中長按當前內容觸發的編輯彈窗;購物應用經常出現的抽獎活動彈窗等。
本文為大家介紹如何創建子窗口并實現子窗口與主窗口的數據通信。

效果呈現

本例最終效果如下:

如何創建子窗口并與主窗口通信(window模塊以及AppStorage的使用)-開源基礎軟件社區如何創建子窗口并與主窗口通信(window模塊以及AppStorage的使用)-開源基礎軟件社區

環境要求

本例基于以下環境開發,開發者也可以基于其他適配的版本進行開發:

  • IDE: DevEco Studio 4.0 Beta1。
  • SDK: Ohos_sdk_public 4.0.7.5 (API Version 10 Beta1)。

實現思路

本例關鍵特性及實現方案如下:

  • 點擊“創建子窗口”按鈕創建子窗口:使用window模塊的createSubWindow方法創建子窗口,在創建時設置子窗口的大小、位置、內容等。
  • 子窗口可以拖拽:通過gesture屬性為子窗口綁定PanGesture拖拽事件,使用moveWindowTo方法將窗口移動到拖拽位置,呈現拖拽效果。
  • 點擊主窗口的“子窗口數據+1”按鈕,子窗口中的數據加1,反之亦然,即實現主窗口和子窗口間的數據通信:將數據變量存儲在AppStorage中,在主窗口和子窗口中引用該數據,并通過@StorageLink與AppStorage中的數據進行雙向綁定,從而實現主窗口和子窗口之間的數據聯動。
說明

本文使用AppStorage實現主窗口和子窗口之間的數據傳遞,除此之外,Emitter和EventHub等方式也可以實現,用戶可以根據實際業務需要進行選擇。

開發步驟

由于本例重點講解子窗口的創建以及主窗口和子窗口之間的通信,所以開發步驟會著重講解相關內容的開發,其余內容不做贅述,全量代碼可參考完整代碼章節。

創建子窗口。
使用createSubWindow方法創建名為“hiSubWindow”的子窗口,并設置窗口的位置、大小、顯示內容。將創建子窗口的動作放在自定義成員方法showSubWindow()中,方便后續綁定到按鈕上。具體代碼如下:

showSubWindow() {
    // 創建應用子窗口。
    this.windowStage.createSubWindow("hiSubWindow", (err, data) => {
      if (err.code) {
        console.error('Failed to create the subwindow. Cause: ' + JSON.stringify(err));
        return;
      }
      this.sub_windowClass = data;
      console.info('Succeeded in creating the subwindow. Data: ' + JSON.stringify(data));
      // 子窗口創建成功后,設置子窗口的位置
      this.sub_windowClass.moveWindowTo(300, 300, (err) => {
        if (err.code) {
          console.error('Failed to move the window. Cause:' + JSON.stringify(err));
          return;
        }
        console.info('Succeeded in moving the window.');
      });
      // 設置子窗口的大小
      this.sub_windowClass.resize(350, 350, (err) => {
        if (err.code) {
          console.error('Failed to change the window size. Cause:' + JSON.stringify(err));
          return;
        }
        console.info('Succeeded in changing the window size.');
      });
      // 為子窗口加載對應的目標頁面。
      this.sub_windowClass.setUIContent("pages/SubWindow",(err) => {
        if (err.code) {
          console.error('Failed to load the content. Cause:' + JSON.stringify(err));
          return;
        }
        console.info('Succeeded in loading the content.');
        // 顯示子窗口。
        this.sub_windowClass.showWindow((err) => {
          if (err.code) {
            console.error('Failed to show the window. Cause: ' + JSON.stringify(err));
            return;
          }
          console.info('Succeeded in showing the window.');
        });
        this.sub_windowClass.setWindowBackgroundColor('#E8A027')
      });
    })
  }

實現子窗口可拖拽。
為頁面內容綁定PanGesture拖拽事件,拖拽事件發生時獲取到觸摸點的位置信息,使用@Watch監聽到位置變量的變化,然后調用窗口的moveWindowTo方法將窗口移動到對應位置,從而實現拖拽效果。
具體代碼如下:

import window from '@ohos.window';

interface Position {
  x: number,
  y: number
}

@Entry
@Component
struct SubWindow{
  ...
  // 創建位置變量,并使用@Watch監聽,變量發生變化調用moveWindow方法移動窗口
  @State @Watch("moveWindow") windowPosition: Position = { x: 0, y: 0 };
  private panOption: PanGestureOptions = new PanGestureOptions({ direction: PanDirection.All });
  private subWindow: window.Window
  // 通過懸浮窗名稱“hiSubWindow”獲取到創建的懸浮窗
  aboutToAppear() {
    this.subWindow = window.findWindow("hiSubWindow")
  }
  // 將懸浮窗移動到指定位置
  moveWindow() {
    this.subWindow.moveWindowTo(this.windowPosition.x, this.windowPosition.y);
  }

  build(){
    Column(){
      Text(`AppStorage保存的數據:${this.storData}`)
        .fontSize(12)
        .margin({bottom:10})
      Button('主窗口數據+1')
        .fontSize(12)
        .backgroundColor('#A4AE77')
        .onClick(()=>{
          this.storData += 1
        })
    }
    .height('100%')
    .width('100%')
    .alignItems(HorizontalAlign.Center)
    .justifyContent(FlexAlign.Center)
    .gesture(
      PanGesture(this.panOption)
        .onActionStart((event: GestureEvent) => {
          console.info('Pan start');
        })
        // 發生拖拽時,獲取到觸摸點的位置,并將位置信息傳遞給windowPosition
        .onActionUpdate((event: GestureEvent) => {
          this.windowPosition.x += event.offsetX;
          this.windowPosition.y += event.offsetY;
        })
        .onActionEnd(() => {
          console.info('Pan end');
        })
    )
  }
}

實現主窗口和子窗口間的數據通信。本例中即實現點擊主窗口的“子窗口數據+1”按鈕,子窗口中的數據加1,反之亦然。本例使用應用全局UI狀態存儲AppStorage來實現對應效果。

  • 在創建窗口時觸發的onWindowStageCreate回調中將自定義數據變量“data”存入AppStorage。
onWindowStageCreate(windowStage: window.WindowStage) {
    // 將自定義數據變量“data”存入AppStorage
    AppStorage.SetOrCreate('data', 1);
    ...
    windowStage.loadContent('pages/Index', (err, data) => {
      if (err.code) {
        hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? '');
        return;
      }
      hilog.info(0x0000, 'testTag', 'Succeeded in loading the content. Data: %{public}s', JSON.stringify(data) ?? '');
    });
  }
  • 在主窗口中定義變量“storData”,并使用@StorageLink將其與AppStorage中的變量“data”進行雙向綁定,這樣一來,“mainData”的變化可以傳導至“data”,并且該變化可以被UI框架監聽到,從而完成UI狀態刷新。
...
// 使用@StorageLink將"mainData"與AppStorage中的變量"data"進行雙向綁定
@StorageLink('data') mainData: number = 1;
...
build() {
    Row() {
      Column() {
        Text(`AppStorage保存的數據:${this.mainData}`)
          .margin({bottom:30})
        Button('子窗口數據+1')
          .backgroundColor('#A4AE77')
          .margin({bottom:30})
          .onClick(()=>{
            // 點擊,storData的值加1
            this.mainData += 1
          })
      ...
      }
      .width('100%')
    }
    .height('100%')
  }
  • 在主窗口中定義變量“subData”,并使用@StorageLink將其與AppStorage中的變量“data”進行雙向綁定。由于主窗口的“mainData”也與“data”進行了綁定,因此,“mainData”的值可以通過“data”傳遞給“subData”,反之亦然。這樣就實現了主窗口和子窗口之間的數據同步。
...
// 使用@StorageLink將"subData"與AppStorage中的變量"data"進行雙向綁定
  @StorageLink('data') subData: number = 1;
...
  build(){
    Column(){
      Text(`AppStorage保存的數據:${this.subData}`)
        .fontSize(12)
        .margin({bottom:10})
      Button('主窗口數據+1')
        .fontSize(12)
        .backgroundColor('#A4AE77')
        .onClick(()=>{
          // 點擊,subData的值加1
          this.subData += 1
        })
    }
    ...
  }

完整代碼

本例完整代碼如下:
EntryAbility文件代碼:

// EntryAbility.ts
import AbilityConstant from '@ohos.app.ability.AbilityConstant';
import hilog from '@ohos.hilog';
import UIAbility from '@ohos.app.ability.UIAbility';
import Want from '@ohos.app.ability.Want';
import window from '@ohos.window';

let sub_windowClass = null;
export default class EntryAbility extends UIAbility {

  destroySubWindow() {
    // 銷毀子窗口。當不再需要子窗口時,可根據具體實現邏輯,使用destroy對其進行銷毀。
    sub_windowClass.destroyWindow((err) => {
      if (err.code) {
        console.error('Failed to destroy the window. Cause: ' + JSON.stringify(err));
        return;
      }
      console.info('Succeeded in destroying the window.');
    });
  }

  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {

    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');
  }

  onDestroy() {
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onDestroy');
  }

  onWindowStageCreate(windowStage: window.WindowStage) {
    // 將自定義數據變量“data”存入AppStorage
    AppStorage.SetOrCreate('data', 1);
    AppStorage.SetOrCreate('window', windowStage);
    // 為主窗口添加加載頁面
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate');

    windowStage.loadContent('pages/Index', (err, data) => {
      if (err.code) {
        hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? '');
        return;
      }
      hilog.info(0x0000, 'testTag', 'Succeeded in loading the content. Data: %{public}s', JSON.stringify(data) ?? '');
    });
  }

  onWindowStageDestroy() {
    this.destroySubWindow();
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageDestroy');
  }

  onForeground() {
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onForeground');
  }

  onBackground() {
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onBackground');
  }
}

主窗口代碼:

// Index.ets
import window from '@ohos.window';

@Entry
@Component
struct Index {
  // 使用@StorageLink將"mainData"與AppStorage中的變量"data"進行雙向綁定
  @StorageLink('data') mainData: number = 1;
  @StorageLink('window') storWindow:window.WindowStage = null
  private windowStage = this.storWindow
  private sub_windowClass = null

  showSubWindow() {
    // 創建應用子窗口。
    this.windowStage.createSubWindow("hiSubWindow", (err, data) => {
      if (err.code) {
        console.error('Failed to create the subwindow. Cause: ' + JSON.stringify(err));
        return;
      }
      this.sub_windowClass = data;
      console.info('Succeeded in creating the subwindow. Data: ' + JSON.stringify(data));
      // 子窗口創建成功后,設置子窗口的位置、大小及相關屬性等。
      this.sub_windowClass.moveWindowTo(300, 300, (err) => {
        if (err.code) {
          console.error('Failed to move the window. Cause:' + JSON.stringify(err));
          return;
        }
        console.info('Succeeded in moving the window.');
      });
      this.sub_windowClass.resize(350, 350, (err) => {
        if (err.code) {
          console.error('Failed to change the window size. Cause:' + JSON.stringify(err));
          return;
        }
        console.info('Succeeded in changing the window size.');
      });
      // 為子窗口加載對應的目標頁面。
      this.sub_windowClass.setUIContent("pages/SubWindow",(err) => {
        if (err.code) {
          console.error('Failed to load the content. Cause:' + JSON.stringify(err));
          return;
        }
        console.info('Succeeded in loading the content.');
        // 顯示子窗口。
        this.sub_windowClass.showWindow((err) => {
          if (err.code) {
            console.error('Failed to show the window. Cause: ' + JSON.stringify(err));
            return;
          }
          console.info('Succeeded in showing the window.');
        });
        this.sub_windowClass.setWindowBackgroundColor('#E8A027')
      });
    })
  }

  build() {
    Row() {
      Column() {
        Text(`AppStorage保存的數據:${this.mainData}`)
          .margin({bottom:30})
        Button('子窗口數據+1')
          .backgroundColor('#A4AE77')
          .margin({bottom:30})
          .onClick(()=>{
            // 點擊,storData的值加1
            this.mainData += 1
          })
        Button('創建子窗口')
          .backgroundColor('#A4AE77')
          .onClick(()=>{
            // 點擊彈出子窗口
            this.showSubWindow()
          })
      }
      .width('100%')
    }
    .height('100%')
  }
}

子窗口代碼:

// SubWindow.ets
import window from '@ohos.window';

interface Position {
  x: number,
  y: number
}

@Entry
@Component
struct SubWindow{
  // 使用@StorageLink將"subData"與AppStorage中的變量"data"進行雙向綁定
  @StorageLink('data') subData: number = 1;
  // 創建位置變量,并使用@Watch監聽,變量發生變化調用moveWindow方法移動窗口
  @State @Watch("moveWindow") windowPosition: Position = { x: 0, y: 0 };
  private panOption: PanGestureOptions = new PanGestureOptions({ direction: PanDirection.All });
  private subWindow: window.Window
  // 通過懸浮窗名稱“hiSubWindow”獲取到創建的懸浮窗
  aboutToAppear() {
    this.subWindow = window.findWindow("hiSubWindow")
  }
  // 將懸浮窗移動到指定位置
  moveWindow() {
    this.subWindow.moveWindowTo(this.windowPosition.x, this.windowPosition.y);
  }

  build(){
    Column(){
      Text(`AppStorage保存的數據:${this.subData}`)
        .fontSize(12)
        .margin({bottom:10})
      Button('主窗口數據+1')
        .fontSize(12)
        .backgroundColor('#A4AE77')
        .onClick(()=>{
          // 點擊,subData的值加1
          this.subData += 1
        })
    }
    .height('100%')
    .width('100%')
    .alignItems(HorizontalAlign.Center)
    .justifyContent(FlexAlign.Center)
    .gesture(
      PanGesture(this.panOption)
        .onActionStart((event: GestureEvent) => {
          console.info('Pan start');
        })
        // 發生拖拽時,獲取到觸摸點的位置,并將位置信息傳遞給windowPosition
        .onActionUpdate((event: GestureEvent) => {
          this.windowPosition.x += event.offsetX;
          this.windowPosition.y += event.offsetY;
        })
        .onActionEnd(() => {
          console.info('Pan end');
        })
    )
  }
}

想了解更多關于開源的內容,請訪問:

51CTO 開源基礎軟件社區

https://ost.51cto.com

責任編輯:jianghua 來源: 51CTO 開源基礎軟件社區
相關推薦

2011-05-11 17:48:31

CocoaiOS

2023-11-10 16:28:02

TCP窗口

2009-11-26 14:23:11

Silverlight

2010-08-11 14:41:08

Flex窗口

2023-02-19 15:33:51

WindowsC++窗口程序

2013-11-14 17:02:41

Android多窗口

2025-05-19 00:02:45

SQL窗口函數

2009-12-24 14:38:52

WPF全屏幕窗口

2010-05-18 13:27:44

IIS管理

2011-06-08 15:14:46

Qt 教程

2013-01-07 13:15:39

Android開發窗口背景視圖

2010-05-18 13:33:45

IIS管理

2022-11-23 14:47:29

北向開發鴻蒙

2021-05-17 10:39:14

KDE文件管理器客戶端

2020-04-07 15:25:22

Fluxbox窗口管理器Linux

2023-12-10 14:43:30

PythonGUIeel

2009-11-11 10:56:15

調用Visual St

2023-12-11 07:41:30

PyQt6Python用對象樹管理窗口

2011-09-02 17:38:33

UbuntuEmerald

2024-08-29 08:00:00

點贊
收藏

51CTO技術棧公眾號

免费一区二区三区四区| 97av影视网在线观看| 日韩国产精品一区二区| 超碰人人人人人人人| 国产日韩欧美一区二区东京热| 精品国产一区二区三区性色av| 97超碰欧美中文字幕| 久久在线播放| 日韩av一级片| 亚洲精品一区二区三区四区高清| 国产精品yjizz| 1024在线看片| 桃花岛成人影院| 国产精品白丝jk黑袜喷水| 国产亚洲欧洲高清| 99色这里只有精品| 136福利视频导航| 俺要去色综合狠狠| 精品成人乱色一区二区| 91蜜桃网站免费观看| 欧美三级韩国三级日本三斤在线观看 | 免费在线观看av网站| 欧美女同一区| 精品无人码麻豆乱码1区2区| 亚洲人成网站777色婷婷| 国产欧美久久久久| 97国产精品久久久| 一本色道久久精品| 亚洲精品白浆高清久久久久久| 国产成人一区二区三区别| 国模吧精品人体gogo| 久久久久久黄| 亚洲美女av在线播放| 男人天堂1024| 无码精品一区二区三区在线| 狠狠爱综合网| 亚洲成人亚洲激情| 麻豆tv在线播放| 精品美女在线观看视频在线观看| 免费黄网站欧美| 色天天综合狠狠色| 亚洲免费黄色录像| 在线免费观看污| 成人在线视频一区| 国内精品久久久久久中文字幕 | 明星裸体视频一区二区| 黄色小说在线观看视频| 老牛精品亚洲成av人片| 亚洲成a人v欧美综合天堂| 国产综合欧美在线看| 日韩免费在线视频观看| 午夜视频精品| 日韩电影中文字幕在线观看| 日本免费黄视频| 国产免费av在线| 国产综合久久久久久鬼色| 欧美国产日韩中文字幕在线| 蜜臀视频在线观看| 色戒汤唯在线观看| av爱爱亚洲一区| 欧美理论电影在线| 亚洲欧美精品在线观看| 亚洲视频久久久| 成人免费av| 国产亚洲精品美女| 一区二区三区伦理片| 精品176极品一区| 欧美自拍丝袜亚洲| 成人国产在线看| 天天干天天干天天干| 三级欧美在线一区| 亚洲人成网7777777国产| 久久性爱视频网站| 欧美aaaaaaaa| 欧美精品三级日韩久久| 污免费在线观看| 天堂中文av在线资源库| 亚洲天天做日日做天天谢日日欢| 国产精品日韩一区二区| 亚洲天堂777| 精品一区二区三区在线观看| 97成人精品视频在线观看| 成人黄色免费网址| 欧美激情黄色片| 欧美老女人性生活| 性猛交ⅹxxx富婆video| 综合中文字幕| 在线成人av网站| 午夜诱惑痒痒网| 大黄网站在线观看| 中文字幕亚洲一区二区va在线| 99国产高清| 在线观看不卡的av| 国产精品一区二区三区99| 成人免费在线看片| 蜜桃视频在线观看视频| 成人毛片在线观看| 欧美日韩中文国产一区发布 | 视频一区视频二区中文字幕| 国产欧美精品一区二区三区介绍| 日韩精品国产一区二区| 午夜天堂精品久久久久| 性色av一区二区三区| 久久精品这里只有精品| 自拍自偷一区二区三区| 欧美大片国产精品| 老女人性生活视频| 中日韩免视频上线全都免费| 色香阁99久久精品久久久| 精品国产一区二区亚洲人成毛片| 特级黄色片视频| 成人香蕉视频| 亚洲国产aⅴ天堂久久| 欧美三级午夜理伦三级老人| 精品美女视频在线观看免费软件 | 蜜臀av在线| 在线一区二区三区| 亚洲婷婷在线观看| 99久久.com| 日韩中文av在线| 日韩成人免费在线观看| 久久国产精品72免费观看| 久久99精品国产一区二区三区| 日本xxxxwww| 国产福利一区二区三区| 91手机在线播放| 成人三级黄色免费网站| 国产婷婷精品av在线| 麻豆亚洲一区| 黑人极品ⅴideos精品欧美棵| 欧美影院精品一区| 一区二区在线播放视频| 欧美aaa视频| 欧美在线综合视频| 日本黄色片在线播放| 欧美日韩另类图片| 亚洲品质视频自拍网| 久久老司机精品视频| 精品亚洲欧美一区| 亚洲高清不卡一区| 日本免费久久| 亚洲免费视频网站| 国产视频91在线| 成人综合婷婷国产精品久久蜜臀| 色中文字幕在线观看| 成人区精品一区二区不卡| 亚洲免费av观看| av在线播放天堂| 三级在线看中文字幕完整版| 欧美α欧美αv大片| 星空大象在线观看免费播放| 国产99精品一区| 日韩在线观看网址| 亚洲欧美日韩激情| 久久er99精品| 亚洲精品自在在线观看| 91福利精品在线观看| 91精品国产91热久久久做人人| 无码人妻丰满熟妇啪啪网站| 欧美成人中文| 国产精品手机在线| 98色花堂精品视频在线观看| 欧美性淫爽ww久久久久无| 97人妻精品一区二区免费| 亚洲国产一区二区在线观看| 欧美激情视频播放| 韩国av在线免费观看| 国产亚洲人成网站| 久久99999| 97视频一区| 中文字幕在线亚洲| 日韩精品手机在线| 91麻豆国产福利在线观看| 亚洲一区二区自拍偷拍| 黑森林国产精品av| 日韩三级中文字幕| 能直接看的av| 精品一区二区三区在线观看| 国产日产欧美一区二区| jazzjazz国产精品久久| 91黄色8090| 国产一级免费在线观看| 欧美情侣在线播放| 美女洗澡无遮挡| 天堂久久一区二区三区| 伊人狠狠色丁香综合尤物| 天天综合av| 中文字幕日韩电影| 亚洲av无码乱码国产麻豆| 中文字幕第一区二区| 波多野结衣家庭教师在线播放| 蜜桃tv一区二区三区| 国产日产久久高清欧美一区| 天堂√在线中文官网在线| 综合av第一页| www.这里只有精品| 免费看成人哺乳视频网站| 国产精品旅馆在线| 九色在线观看| 日韩一区二区免费视频| 天天操天天摸天天干| 国产黑丝在线一区二区三区| 欧美大片在线播放| 136福利精品导航| 欧美性视频网站| 日韩性xxxx| 欧美日韩一级二级| av网站免费在线看| 国产精品一区一区三区| 国产精品免费观看久久| 激情视频极品美女日韩| 国产精品一区二区在线| 日本不良网站在线观看| 欧美成人免费在线观看| 一级片aaaa| 精品日本高清在线播放| 在线观看国产免费视频| 91久久综合| 精品免费二区三区三区高中清不卡| 91香蕉在线观看| 亚洲视频国产视频| 色噜噜在线播放| 日韩一区二区影院| 国产偷人爽久久久久久老妇app| 久久久精品黄色| 97xxxxx| 欧美精品大片| 国产日韩欧美二区| 国产日韩欧美中文在线| 欧美成人精品激情在线观看| 二区在线观看| 亚洲男人天堂久| 婷婷久久久久久| 精品第一国产综合精品aⅴ| 亚洲无码精品国产| 欧洲精品一区二区三区在线观看| 欧美成人精品欧美一级乱黄| 亚洲黄色录像片| 完美搭档在线观看| 国产精品乡下勾搭老头1| 激情在线观看视频| 国产在线精品视频| 手机精品视频在线| 狠狠色综合日日| 日本不卡一区二区在线观看| 欧美精品自拍| 只有这里有精品| 羞羞答答成人影院www| 亚洲人成网站在线观看播放| 欧美精品尤物在线观看| 96久久精品| 一区视频网站| 成人欧美一区二区| 国偷自产av一区二区三区| 国产999精品视频| 成人在线直播| 久久视频精品在线| 无码精品人妻一区二区三区影院| 亚洲成年人影院在线| 日韩一级片免费看| 亚洲精品视频免费| 97视频免费在线| 欧美日韩加勒比精品一区| 国产香蕉视频在线| 欧美性极品xxxx娇小| 欧美一级特黄高清视频| www.在线欧美| 国产精品三级在线观看无码| 精品一区二区成人精品| www.51色.com| 成人免费视频app| 成人免费av片| 中日韩av电影| 亚洲熟女www一区二区三区| 2023国产精品视频| 日本特黄在线观看| 懂色av一区二区三区蜜臀| www国产视频| 久久精品在线观看| 自拍偷拍第9页| 久久一留热品黄| 人与嘼交av免费| 亚洲色图视频免费播放| 国产精品不卡av| 色婷婷久久久亚洲一区二区三区| 久久精品一级片| 欧美性生活大片免费观看网址| 国产在线观看第一页| 91麻豆精品久久久久蜜臀| 久久久久久在线观看| 欧美美女激情18p| 老熟妇高潮一区二区高清视频| 亚洲精品中文字幕女同| 日本在线视频网| 国产亚洲激情视频在线| av在线免费网址| 欧美在线日韩在线| 国产va在线视频| 国产精品高精视频免费| 自拍网站在线观看| 91精品久久久久久久久不口人| av不卡一区| 亚洲欧洲免费无码| 在线一区欧美| 五月天丁香花婷婷| xnxx国产精品| 欧美黄色免费看| 欧美在线影院一区二区| 国产综合视频在线| 久久久成人av| a级片国产精品自在拍在线播放| 欧美亚洲成人xxx| 天堂精品在线视频| 不卡的av一区| 欧美日韩精品在线一区| 男女激情免费视频| 久久99蜜桃精品| 美女久久久久久久久久| 亚洲一二三专区| 日本在线免费观看| 欧美精选一区二区| 国产在线一二三| 97视频在线免费观看| 日本精品视频| 一区二区三区不卡在线| 久久综合九色| 特级西西人体wwwww| 亚洲综合区在线| 日韩免费视频网站| 欧美xxx久久| 在线网址91| 91精品国产99久久久久久红楼| av一区二区在线观看| 成人综合视频在线| av电影在线观看不卡| 免费毛片在线播放免费 | 日本精品一区二区三区四区| 国产成人在线视频网站| 黄色一级片中国| 亚洲国产一区二区在线播放| 国产精品嫩草影院桃色| 色黄久久久久久| jizz久久久久久| 视频一区二区在线| 亚洲精品国产首次亮相| 亚洲一级片网站| 中文字幕av资源一区| 337p粉嫩色噜噜噜大肥臀| 制服丝袜中文字幕一区| 日韩黄色影院| 成人黄色av免费在线观看| 国产乱人伦精品一区| 男人添女荫道口女人有什么感觉| 国产精品一区二区黑丝| 青青草精品在线视频| 日韩欧美国产wwwww| 啦啦啦中文在线观看日本| 成人羞羞视频免费| 在线观看亚洲| 在线观看免费的av| 国产精品乱码人人做人人爱| 青青草精品在线视频| 欧美mv日韩mv国产| 91福利区在线观看| 蜜桃传媒视频麻豆第一区免费观看 | 国产成人精品一区二| 欧美日韩国产精品综合 | 暖暖视频在线免费观看| 国产v综合ⅴ日韩v欧美大片| 96sao精品免费视频观看| 国产欧美日韩综合精品二区| 激情欧美丁香| 91中文字幕永久在线| 欧美性极品少妇| 爆操欧美美女| 国产一区二区三区免费不卡| 美女被久久久| 久久嫩草捆绑紧缚| 欧美成人aa大片| 人人视频精品| 中文字幕一区二区三区有限公司| 国产高清在线观看免费不卡| 国产成人精品片| 一区二区三区精品99久久| 国产啊啊啊视频在线观看| 久久久久久久免费| 久久激情五月婷婷| 亚洲色图第四色| 91精品国产欧美一区二区18| av白虎一区| 亚洲一区尤物| www.日韩精品| 亚洲在线精品视频| 性欧美xxxx交| 亚洲女同一区| 天天综合天天添夜夜添狠狠添| 亚洲国产欧美在线| 8888四色奇米在线观看| 国产精品久久久久久久久久尿| **女人18毛片一区二区|