在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

鴻蒙OS開發實例:【瀑布流式圖片瀏覽】

jf_46214456 ? 來源:jf_46214456 ? 作者:jf_46214456 ? 2024-03-29 17:38 ? 次閱讀

介紹

瀑布流式展示圖片文字,在當前產品設計中已非常常見,本篇將介紹關于WaterFlow的圖片瀏覽場景,順便集成Video控件,以提高實踐的趣味性

準備

  1. 請參照[官方指導],創建一個Demo工程,選擇Stage模型
  2. 熟讀HarmonyOS 官方指導“[https://gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md”]

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

效果

豎屏

image.png

橫屏

數據源

功能介紹

  1. 瀑布流式圖片展示
  2. 橫豎屏圖片/視頻展示

核心代碼

布局

整體結構為:瀑布流 + 加載進度條

每條數據結構: 圖片 + 文字 【由于沒有設定圖片寬高比,因此通過文字長度來自然生成瀑布流效果】

由于有點數據量,按照官方指導,采用LazyForEach懶加載方式

Stack() {
  WaterFlow({ scroller: this.scroller }) {
    LazyForEach(dataSource, item = > {
      FlowItem() {
        Column({ space: 10 }) {
          Image(item.coverUrl).objectFit(ImageFit.Cover)
            .width('100%')
            .height(this.imageHeight)
          Text(item.title)
            .fontSize(px2fp(50))
            .fontColor(Color.Black)
            .width('100%')
        }.onClick(() = > {
          router.pushUrl({ url: 'custompages/waterflow/Detail', params: item })
        })
      }
    }, item = > item)
  }
  .columnsTemplate(this.columnsTemplate)
  .columnsGap(5)
  .rowsGap(5)
  .onReachStart(() = > {
    console.info("onReachStart")
  })
  .onReachEnd(() = > {
    console.info("onReachEnd")

    if (!this.running) {
      if ((this.pageNo + 1) * 15 < this.total) {
        this.pageNo++
        this.running = true

        setTimeout(() = > {
          this.requestData()
        }, 2000)
      }
    }

  })
  .width('100%')
  .height('100%')
  .layoutDirection(FlexDirection.Column)

  if (this.running) {
     this.loadDataFooter()
  }

}
復制

橫豎屏感知

橫豎屏感知整體有兩個場景:1. 當前頁面發生變化 2.初次進入頁面
這里介紹幾種監聽方式:

當前頁面監聽

import mediaquery from '@ohos.mediaquery';

//這里你也可以使用"orientation: portrait" 參數
listener = mediaquery.matchMediaSync('(orientation: landscape)');
this.listener.on('change', 回調方法)
復制

外部傳參

通過UIAbility, 一直傳到Page文件

事件傳遞

采用EeventHub機制,在UIAbility把橫豎屏切換事件發出來,Page文件注冊監聽事件

this.context.eventHub.on('onConfigurationUpdate', (data) = > {
  console.log(JSON.stringify(data))
  let config = data as Configuration
  this.screenDirection = config.direction
  this.configureParamsByScreenDirection()
});
復制

API數據請求

這里需要設置Android 或者 iOS 特征UA

requestData() {
  let url = `https://api.apiopen.top/api/getHaoKanVideo?page=${this.pageNo}&size=15`
  let httpRequest = http.createHttp()
  httpRequest.request(
    url,
    {
      header: {
        "User-Agent": "Mozilla/5.0 (Linux; Android 8.0.0; SM-G955U Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Mobile Safari/537.36"
      }
    }).then((value: http.HttpResponse) = > {

    if (value.responseCode == 200) {

      let searchResult: SearchResult = JSON.parse(value.result as string)

      if (searchResult) {
        this.total = searchResult.result.total

        searchResult.result.list.forEach(ItemModel = > {
          dataSource.addData(ItemModel)
        })
      }
    } else {
      console.error(JSON.stringify(value))
    }

  }).catch(e = > {

    Logger.d(JSON.stringify(e))

    promptAction.showToast({
      message: '網絡異常: ' + JSON.stringify(e),
      duration: 2000
    })

  }).finally(() = > {
    this.running = false
  })

}
復制

橫豎屏布局調整

因為要適應橫豎屏,所以需要在原有布局的基礎上做一點改造, 讓瀑布流的列參數改造為@State 變量 , 讓圖片高度的參數改造為@State 變量

WaterFlow({ scroller: this.scroller }) {
  LazyForEach(dataSource, item = > {
    FlowItem() {
      Column({ space: 10 }) {
        Image(item.coverUrl).objectFit(ImageFit.Cover)
          .width('100%')
          .height(this.imageHeight)
        Text(item.title)
          .fontSize(px2fp(50))
          .fontColor(Color.Black)
          .width('100%')
      }.onClick(() = > {
        router.pushUrl({ url: 'custompages/waterflow/Detail', params: item })
      })
    }
  }, item = > item)
}
.columnsTemplate(this.columnsTemplate)
復制

瀑布流完整代碼

API返回的數據結構

import { ItemModel } from './ItemModel'

export default class SearchResult{
  public code: number
  public message: string
  public result: childResult
}

class childResult {
  public total: number
  public list: ItemModel[]
};
復制

Item Model

export class ItemModel{
  public id: number
  public tilte: string
  public userName: string
  public userPic: string
  public coverUrl: string
  public playUrl: string
  public duration: string
}復制

WaterFlow數據源接口

import List from '@ohos.util.List';
import { ItemModel } from './ItemModel';

export class PicData implements IDataSource {

  private data: List< ItemModel > = new List< ItemModel >()

  addData(item: ItemModel){
    this.data.add(item)
  }

  unregisterDataChangeListener(listener: DataChangeListener): void {

  }

  registerDataChangeListener(listener: DataChangeListener): void {

  }

  getData(index: number): ItemModel {
     return this.data.get(index)
  }

  totalCount(): number {
    return this.data.length
  }


}復制

布局

import http from '@ohos.net.http';
import { CommonConstants } from '../../common/CommonConstants';
import Logger from '../../common/Logger';
import { PicData } from './PicData';
import SearchResult from './Result';
import promptAction from '@ohos.promptAction'
import router from '@ohos.router';
import common from '@ohos.app.ability.common';
import { Configuration } from '@ohos.app.ability.Configuration';
import mediaquery from '@ohos.mediaquery';

let dataSource = new PicData()

/**
 * 問題: 橫豎屏切換,間距會發生偶發性變化
 * 解決方案:延遲300毫秒改變參數
 *
 */
@Entry
@Component
struct GridLayoutIndex {
  private context = getContext(this) as common.UIAbilityContext;
  @State pageNo: number = 0
  total: number = 0
  @State running: boolean = true
  @State screenDirection: number = this.context.config.direction
  @State columnsTemplate: string = '1fr 1fr'
  @State imageHeight: string = '20%'
  scroller: Scroller = new Scroller()

  // 當設備橫屏時條件成立
  listener = mediaquery.matchMediaSync('(orientation: landscape)');

  onPortrait(mediaQueryResult) {
    if (mediaQueryResult.matches) {
      //橫屏
      this.screenDirection = 1
    } else {
      //豎屏
      this.screenDirection = 0
    }

    setTimeout(()= >{
      this.configureParamsByScreenDirection()
    }, 300)
  }

  onBackPress(){
    this.context.eventHub.off('onConfigurationUpdate')
  }

  aboutToAppear() {
    console.log('已進入瀑布流頁面')

    console.log('當前屏幕方向:' + this.context.config.direction)

    if (AppStorage.Get('screenDirection') != 'undefined') {
      this.screenDirection = AppStorage.Get(CommonConstants.ScreenDirection)
    }

    this.configureParamsByScreenDirection()

    this.eventHubFunc()

    let portraitFunc = this.onPortrait.bind(this)
    this.listener.on('change', portraitFunc)

    this.requestData()
  }

  @Builder loadDataFooter() {
    LoadingProgress()
      .width(px2vp(150))
      .height(px2vp(150))
      .color(Color.Orange)
  }

  build() {
    Stack() {
      WaterFlow({ scroller: this.scroller }) {
        LazyForEach(dataSource, item = > {
          FlowItem() {
            Column({ space: 10 }) {
              Image(item.coverUrl).objectFit(ImageFit.Cover)
                .width('100%')
                .height(this.imageHeight)
              Text(item.title)
                .fontSize(px2fp(50))
                .fontColor(Color.Black)
                .width('100%')
            }.onClick(() = > {
              router.pushUrl({ url: 'custompages/waterflow/Detail', params: item })
            })
          }
        }, item = > item)
      }
      .columnsTemplate(this.columnsTemplate)
      .columnsGap(5)
      .rowsGap(5)
      .onReachStart(() = > {
        console.info("onReachStart")
      })
      .onReachEnd(() = > {
        console.info("onReachEnd")

        if (!this.running) {
          if ((this.pageNo + 1) * 15 < this.total) {
            this.pageNo++
            this.running = true

            setTimeout(() = > {
              this.requestData()
            }, 2000)
          }
        }

      })
      .width('100%')
      .height('100%')
      .layoutDirection(FlexDirection.Column)

      if (this.running) {
         this.loadDataFooter()
      }

    }

  }

  requestData() {
    let url = `https://api.apiopen.top/api/getHaoKanVideo?page=${this.pageNo}&size=15`
    let httpRequest = http.createHttp()
    httpRequest.request(
      url,
      {
        header: {
          "User-Agent": "Mozilla/5.0 (Linux; Android 8.0.0; SM-G955U Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Mobile Safari/537.36"
        }
      }).then((value: http.HttpResponse) = > {

      if (value.responseCode == 200) {

        let searchResult: SearchResult = JSON.parse(value.result as string)

        if (searchResult) {
          this.total = searchResult.result.total

          searchResult.result.list.forEach(ItemModel = > {
            dataSource.addData(ItemModel)
          })
        }
      } else {
        console.error(JSON.stringify(value))
      }

    }).catch(e = > {

      Logger.d(JSON.stringify(e))

      promptAction.showToast({
        message: '網絡異常: ' + JSON.stringify(e),
        duration: 2000
      })

    }).finally(() = > {
      this.running = false
    })

  }

  eventHubFunc() {
    this.context.eventHub.on('onConfigurationUpdate', (data) = > {
      console.log(JSON.stringify(data))
      // let config = data as Configuration
      // this.screenDirection = config.direction
      // this.configureParamsByScreenDirection()
    });
  }

  configureParamsByScreenDirection(){
    if (this.screenDirection == 0) {
      this.columnsTemplate = '1fr 1fr'
      this.imageHeight = '20%'
    } else {
      this.columnsTemplate = '1fr 1fr 1fr 1fr'
      this.imageHeight = '50%'
    }
  }

}

復制

圖片詳情頁

import { CommonConstants } from '../../common/CommonConstants';
import router from '@ohos.router';
import { ItemModel } from './ItemModel';
import common from '@ohos.app.ability.common';
import { Configuration } from '@ohos.app.ability.Configuration';

@Entry
@Component
struct DetailIndex{
  private context = getContext(this) as common.UIAbilityContext;

  extParams: ItemModel
  @State previewUri: Resource = $r('app.media.splash')
  @State curRate: PlaybackSpeed = PlaybackSpeed.Speed_Forward_1_00_X
  @State isAutoPlay: boolean = false
  @State showControls: boolean = true
  controller: VideoController = new VideoController()

  @State screenDirection: number = 0
  @State videoWidth: string = '100%'
  @State videoHeight: string = '70%'

  @State tipWidth: string = '100%'
  @State tipHeight: string = '30%'

  @State componentDirection: number = FlexDirection.Column
  @State tipDirection: number = FlexDirection.Column

  aboutToAppear() {
    console.log('準備加載數據')
    if(AppStorage.Get('screenDirection') != 'undefined'){
      this.screenDirection = AppStorage.Get(CommonConstants.ScreenDirection)
    }

    this.configureParamsByScreenDirection()

    this.extParams = router.getParams() as ItemModel
    this.eventHubFunc()
  }

  onBackPress(){
    this.context.eventHub.off('onConfigurationUpdate')
  }

  build() {
      Flex({direction: this.componentDirection}){
        Video({
          src: this.extParams.playUrl,
          previewUri: this.extParams.coverUrl,
          currentProgressRate: this.curRate,
          controller: this.controller,
        }).width(this.videoWidth).height(this.videoHeight)
          .autoPlay(this.isAutoPlay)
          .objectFit(ImageFit.Contain)
          .controls(this.showControls)
          .onStart(() = > {
            console.info('onStart')
          })
          .onPause(() = > {
            console.info('onPause')
          })
          .onFinish(() = > {
            console.info('onFinish')
          })
          .onError(() = > {
            console.info('onError')
          })
          .onPrepared((e) = > {
            console.info('onPrepared is ' + e.duration)
          })
          .onSeeking((e) = > {
            console.info('onSeeking is ' + e.time)
          })
          .onSeeked((e) = > {
            console.info('onSeeked is ' + e.time)
          })
          .onUpdate((e) = > {
            console.info('onUpdate is ' + e.time)
          })

        Flex({direction: this.tipDirection, justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center, alignContent: FlexAlign.Center}){
          Row() {
            Button('src').onClick(() = > {
              // this.videoSrc = $rawfile('video2.mp4') // 切換視頻源
            }).margin(5)
            Button('previewUri').onClick(() = > {
              // this.previewUri = $r('app.media.poster2') // 切換視頻預覽海報
            }).margin(5)
            Button('controls').onClick(() = > {
              this.showControls = !this.showControls // 切換是否顯示視頻控制欄
            }).margin(5)
          }

          Row() {
            Button('start').onClick(() = > {
              this.controller.start() // 開始播放
            }).margin(5)
            Button('pause').onClick(() = > {
              this.controller.pause() // 暫停播放
            }).margin(5)
            Button('stop').onClick(() = > {
              this.controller.stop() // 結束播放
            }).margin(5)
            Button('setTime').onClick(() = > {
              this.controller.setCurrentTime(10, SeekMode.Accurate) // 精準跳轉到視頻的10s位置
            }).margin(5)
          }
          Row() {
            Button('rate 0.75').onClick(() = > {
              this.curRate = PlaybackSpeed.Speed_Forward_0_75_X // 0.75倍速播放
            }).margin(5)
            Button('rate 1').onClick(() = > {
              this.curRate = PlaybackSpeed.Speed_Forward_1_00_X // 原倍速播放
            }).margin(5)
            Button('rate 2').onClick(() = > {
              this.curRate = PlaybackSpeed.Speed_Forward_2_00_X // 2倍速播放
            }).margin(5)
          }
        }
        .width(this.tipWidth).height(this.tipHeight)
      }

  }

  eventHubFunc() {
    this.context.eventHub.on('onConfigurationUpdate', (data) = > {
       console.log(JSON.stringify(data))
       let config = data as Configuration
       this.screenDirection = config.direction

       this.configureParamsByScreenDirection()

    });
  }


  configureParamsByScreenDirection(){
    if(this.screenDirection == 0){
      this.videoWidth = '100%'
      this.videoHeight = '70%'
      this.tipWidth = '100%'
      this.tipHeight = '30%'
      this.componentDirection = FlexDirection.Column

    } else {
      this.videoWidth = '60%'
      this.videoHeight = '100%'
      this.tipWidth = '40%'
      this.tipHeight = '100%'
      this.componentDirection = FlexDirection.Row

    }

  }

}

審核編輯 黃宇

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

    關注

    57

    文章

    2361

    瀏覽量

    42878
  • HarmonyOS
    +關注

    關注

    79

    文章

    1977

    瀏覽量

    30251
  • 鴻蒙OS
    +關注

    關注

    0

    文章

    188

    瀏覽量

    4421
收藏 人收藏

    評論

    相關推薦

    HDC2024華為發布鴻蒙原生智能:AI與OS深度融合,開啟全新的AI時代

    6月21日,華為開發者大會2024(HDC.2024)召開。 HarmonyOS NEXT將AI與OS深度融合,構筑全新鴻蒙原生智能框架。大會現場,華為常務董事、終端BG董事長、智能汽車解決方案BU
    的頭像 發表于 06-24 09:28 ?626次閱讀
    HDC2024華為發布<b class='flag-5'>鴻蒙</b>原生智能:AI與<b class='flag-5'>OS</b>深度融合,開啟全新的AI時代

    鴻蒙OS開發:【一次開發,多端部署】應用(資源使用)

    在頁面開發過程中,經常需要用到顏色、字體、間距、圖片等資源,在不同的設備或配置中,這些資源的值可能不同。
    的頭像 發表于 05-21 15:43 ?1024次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>OS</b><b class='flag-5'>開發</b>:【一次<b class='flag-5'>開發</b>,多端部署】應用(資源使用)

    HarmonyOS實戰開發-如何通過BlendMode屬性來實現掛件和圖片的混合

    ||---BlendModeView.ets // 視圖層-應用主頁面 模塊依賴 本實例依賴common模塊來實現日志的打印、資源 的調用、依賴動態路由模塊來實現頁面的動態加載。 最后 如果大家覺得這篇內容對學習鴻蒙開發有幫
    發表于 05-07 14:45

    鴻蒙OS崛起,鴻蒙應用開發工程師成市場新寵

    應用的形態也在發生著翻天覆地的變化。作為全球領先的移動操作系統和智能終端制造商,華為公司自主研發的鴻蒙OS應運而生,致力于構建一個統一的分布式操作系統,為各行各業的應用開發帶來全新的可能性。 一、
    發表于 04-29 17:32

    HarmonyOS開發實例:【圖片編輯應用】

    通過動態設置元素樣式的方式,實現幾種常見的圖片操作,包括裁剪、旋轉、縮放和鏡像。
    的頭像 發表于 04-23 09:42 ?463次閱讀
    HarmonyOS<b class='flag-5'>開發</b><b class='flag-5'>實例</b>:【<b class='flag-5'>圖片</b>編輯應用】

    OpenHarmony開發實例:【鴻蒙.bin文件燒錄】

    如何使用HiBurn工具燒錄鴻蒙的.bin文件到Hi3861開發板。
    的頭像 發表于 04-14 09:54 ?436次閱讀
    OpenHarmony<b class='flag-5'>開發</b><b class='flag-5'>實例</b>:【<b class='flag-5'>鴻蒙</b>.bin文件燒錄】

    鴻蒙OS開發實例:【HarmonyHttpClient】網絡框架

    鴻蒙上使用的Http網絡框架,里面包含純Java實現的HttpNet,類似okhttp使用,支持同步和異步兩種請求方式;還有鴻蒙版retrofit,和Android版Retrofit相似的使用,解放雙手般優雅使用注解、自動解析json
    的頭像 發表于 04-12 16:58 ?845次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>OS</b><b class='flag-5'>開發</b><b class='flag-5'>實例</b>:【HarmonyHttpClient】網絡框架

    鴻蒙OS開發學習:【尺寸適配實現】

    鴻蒙開發中,尺寸適配是一個重要的概念,它可以幫助我們在不同屏幕尺寸的設備上正確顯示和布局我們的應用程序。本文將介紹如何在鴻蒙開發中實現尺寸適配的方法。
    的頭像 發表于 04-10 16:05 ?1771次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>OS</b><b class='flag-5'>開發</b>學習:【尺寸適配實現】

    鴻蒙OS開發實例:【組件化模式】

    組件化一直是移動端比較流行的開發方式,有著編譯運行快,業務邏輯分明,任務劃分清晰等優點,針對Android端的組件化;與Android端的組件化相比,HarmonyOS的組件化可以說實現起來就頗費
    的頭像 發表于 04-07 17:44 ?660次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>OS</b><b class='flag-5'>開發</b><b class='flag-5'>實例</b>:【組件化模式】

    鴻蒙OS開發實例:【應用事件打點】

    傳統的日志系統里匯聚了整個設備上所有程序運行的過程流水日志,難以識別其中的關鍵信息。因此,應用開發者需要一種數據打點機制,用來評估如訪問數、日活、用戶操作習慣以及影響用戶使用的關鍵因素等關鍵信息
    的頭像 發表于 04-07 17:13 ?495次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>OS</b><b class='flag-5'>開發</b><b class='flag-5'>實例</b>:【應用事件打點】

    鴻蒙APP開發實戰:【Api9】拍照、拍視頻;選擇圖片、視頻、文件工具類

    鴻蒙開發過程中,經常會進行系統調用,拍照、拍視頻、選擇圖庫圖片、選擇圖庫視頻、選擇文件。今天就給大家分享一個工具類。
    的頭像 發表于 03-26 16:27 ?798次閱讀
    <b class='flag-5'>鴻蒙</b>APP<b class='flag-5'>開發</b>實戰:【Api9】拍照、拍視頻;選擇<b class='flag-5'>圖片</b>、視頻、文件工具類

    使用 Taro 開發鴻蒙原生應用 —— 快速上手,鴻蒙應用開發指南

    隨著鴻蒙系統的不斷完善,許多應用廠商都希望將自己的應用移植到鴻蒙平臺上。最近,Taro 發布了 v4.0.0-beta.x 版本,支持使用 Taro 快速開發鴻蒙原生應用,也可將現有的
    的頭像 發表于 02-02 16:09 ?889次閱讀
    使用 Taro <b class='flag-5'>開發</b><b class='flag-5'>鴻蒙</b>原生應用 —— 快速上手,<b class='flag-5'>鴻蒙</b>應用<b class='flag-5'>開發</b>指南

    鴻蒙開發教學-圖片的引用

    該接口通過圖片數據源獲取圖片,支持本地圖片和網絡圖片的渲染展示。其中,src是圖片的數據源。
    的頭像 發表于 02-01 17:36 ?711次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>開發</b>教學-<b class='flag-5'>圖片</b>的引用

    鴻蒙OS和開源鴻蒙什么關系?

    內核,其他功能都以模塊的形式存在。 ? ? 華為用的是鴻蒙OS 我們都知道,華為手機的鴻蒙OS是可以運行安卓軟件的,是因為系統中有安卓兼容層,所以可以簡單這么理解:
    的頭像 發表于 01-30 15:44 ?1157次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>OS</b>和開源<b class='flag-5'>鴻蒙</b>什么關系?

    免費學習鴻蒙(HarmonyOS)開發,一些地址分享

    國內一流高校。通過鴻蒙班的設立,高校可以為學生提供專業的鴻蒙OS學習環境和豐富的實踐機會,培養出更多的鴻蒙開發人才,為
    發表于 01-12 20:48
    主站蜘蛛池模板: 夜夜嘿视频免费看| 综合aⅴ| 加勒比一本大道香蕉在线视频| 天天干天天拍天天射| 天天干天天操天天玩| 人人艹在线观看| 国产精品福利午夜一级毛片| 国产成人夜间影院在线观看| 性性欧美| 欧美国产日本高清不卡| 伊人狠狠丁香婷婷综合色| 五月婷婷丁香在线观看| 色网站在线视频| 美国一级毛片片aa久久综合| 国产激情片| 午夜影院美女| 国产综合免费视频| 开心丁香婷婷深爱五月| 男女互插小说| 天天色影| 久久综合九色婷婷97| aaa一级| 男女性高爱麻豆| 欧美三级日韩三级| 久草免费在线播放| 最色网在线观看| 黄页网站视频免费 视频| 超级乱淫片67194免费看| 最近2018中文字幕免费视频| 色男人在线| 黄页在线播放网址| 五月天婷婷网址| 人人九九精| 亚洲爽爽网站| 明日花绮罗在线观看| 9299yy看片淫黄大片在线| 精品久久天干天天天按摩| 在线观看免费视频一区| 亚洲成色www久久网站| 奇米77| av2014天堂网|