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

HarmonyOS時鐘服務卡片開發指南

開發 OpenHarmony
文章由鴻蒙社區產出,想要了解更多內容請前往:51CTO和華為官方戰略合作共建的鴻蒙技術社區https://harmonyos.51cto.com

[[406622]]

想了解更多內容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區

https://harmonyos.51cto.com

 服務卡片(以下簡稱“卡片”)是FA(Feature Ability)的一種界面展示形式,將FA(Feature Ability)的重要信息或操作前置到卡片,以達到服務直達,減少體驗層級目的。

卡片常用于嵌入到其他應用(當前只支持系統應用)中作為其界面的一部分顯示,并支持拉起頁面,發送消息等基礎的交互功能。

本期Codelab,我們就來為大家介紹如何在HarmonyOS上開發一個時鐘類服務卡片應用,該卡片開發使用Java開發語言,包含2×2、2×4兩種布局的顯示形態,我們先來看看它的顯示效果。

[[406623]]

下面我們將集中于卡片應用的創建、更新和刪除,卡片數據庫(用于存儲卡片信息)的創建和使用以及卡片數據服務的使用和更新。

在開始敲代碼之前,開發者們需要先下載安裝Huawei DevEco Studio,可參照官網的指南進行操作:

● Huawei DevEco Studio安裝指南:

https://developer.harmonyos.com/cn/docs/documentation/docguides/software_install0000001053582415

本Codelab主要在entry\src\main\java\目錄下完成配置聲明、頁面布局、功能邏輯代碼實現,整個工程的代碼結構如下:

【Codelab】時鐘服務卡片開發指南-鴻蒙HarmonyOS技術社區

● database文件夾

開發者需自行創建的文件夾,包含兩個java文件——Form和FormDatabase。其中Form為卡片對象,用于存儲卡片id,卡片名稱以及卡片規格。FormDatabase為卡片數據庫對象,用于創建卡片數據庫。

● slice文件夾

僅包含ClockCardSlice文件,為應用主頁面。

● utils文件夾

開發者需自行創建的文件夾,用于存放各類封裝好的工具,在本Codelab中,包含ComponentProviderUtils、DatabaseUtils、DateUtils和LogUtils。其中,ComponentProviderUtils提供獲取ComponentProvider對象的方法,用于更新卡片;DatabaseUtils提供對數據庫相關操作的方法;DateUtils提供日期相關操作的方法;LogUtils封裝日志工具類。

● MainAbility

主程序入口,由DevEco Studio生成,用于重寫創建、刪除卡片等方法。

● MyApplication

DevEco Studio生成,無需做任何變更。

● TimerAbility

一種Service Ability,需要開發者需自行創建,用于時鐘更新。

● layout文件夾

頁面布局文件夾,由于時鐘卡片Codelab涉及兩個尺寸:2×2和2×4,因此需要新建兩個.xml文件用于頁面布局。

● config.json

配置文件,用于卡片和Service Ability的聲明。

了解完工程代碼結構,下面讓我們來對重點步驟一一講解。

一、配置文件

在卡片應用開始開發前,我們需要在其配置文件config.json中進行以下幾項聲明,使系統能夠識別該應用為一款卡片應用,并使之與系統進行綁定。

在卡片所在的"abilities"中需要配置“formsEnabled": true和"visible": true,使之能被識別為卡片。同時需要配置forms模塊的細節,代碼如下:

  1. "abilities": [ 
  2.   { 
  3.    .... 
  4.     "formsEnabled"true,//表示該Ability支持服務卡片顯示 
  5.     "visible"true
  6.     "forms": [  
  7.       {  
  8.         "landscapeLayouts": [  
  9.         "$layout:form_image_with_info_date_card_2_2",  
  10.         "$layout:form_image_with_info_date_card_2_4"  
  11.         ], //表示卡片外觀規格對應的橫向布局文件,僅當卡片類型為Java卡片時,需要配置該標簽 
  12.         "isDefault"true, //該卡片為默認卡片 
  13.         "scheduledUpdateTime""10:30",  
  14.         "defaultDimension""2*2", //卡片的默認外觀規格,這里是2*2 
  15.         "name""DateCard", //卡片的類名 
  16.         "description""This is a service widget", //卡片的描述 
  17.         "colorMode""auto",  
  18.         "type""Java", //表示卡片的類型,這是一個java卡片 
  19.         "supportDimensions": [  
  20.           "2*2",  
  21.           "2*4"  
  22.         ], //表示卡片支持的外觀規格,這里是2*2和2*4 
  23.         "portraitLayouts": [  
  24.           "$layout:form_image_with_info_date_card_2_2",  
  25.           "$layout:form_image_with_info_date_card_2_4"  
  26.         ], //表示卡片外觀規格對應的豎向布局文件,僅當卡片類型為Java卡片時,需要配置該標簽 
  27.         "updateEnabled"true, //表示支持周期性刷新,可以在定時刷新 
  28.         "updateDuration": 1, //表示卡片定時刷新的更新周期,單位為30分鐘,這里為30分鐘刷新一次 
  29.         "formVisibleNotify"true  
  30.         }  
  31.       ] 

有關forms模塊相關屬性說明,開發者可自行參見官網資料。

● Java卡片開發指導

https://developer.harmonyos.com/cn/docs/documentation/docguides/abilityservicewidgetproviderjava0000001104082220

二、卡片布局

本篇Codelab為卡片應用設計了2×2和2×4兩種布局風格,效果如下圖:

【Codelab】時鐘服務卡片開發指南-鴻蒙HarmonyOS技術社區
【Codelab】時鐘服務卡片開發指南-鴻蒙HarmonyOS技術社區

其中,2×2布局分為四行,展示的內容從上到下分別為日期、時間說明內容、時間具體信息、星期,整體由DependentLayout布局內嵌套四個DirectionalLayout構成,每個DirectionalLayout內均使用Text組件進行展示,部分代碼示例如下:

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <DependentLayout 
  3.     xmlns:ohos="http://schemas.huawei.com/res/ohos" 
  4.     ohos:height="match_parent" 
  5.     ohos:width="match_parent" 
  6.     ohos:background_element="#6A9F99" 
  7.     ohos:remote="true"
  8. <!--DirectionalLayout布局-->  
  9.     <DirectionalLayout 
  10.         ohos:height="match_content" 
  11.         ohos:width="match_parent" 
  12.         ohos:orientation="vertical"
  13. <!--日期Text組件-->          
  14.         <Text...> 
  15.     </DirectionalLayout> 
  16. <!--DirectionalLayout布局-->  
  17.     <DirectionalLayout 
  18.         ohos:id="$+id:title" 
  19.         ohos:height="match_content" 
  20.         ohos:width="match_parent" 
  21.         ohos:alignment="horizontal_center" 
  22.         ohos:orientation="horizontal" 
  23.         ohos:top_margin="35fp"
  24. <!--時間說明內容(HOUR、MIN、SEC)Text組件-->  
  25.         <Text...> 
  26.         <Text...> 
  27.         <Text...> 
  28.     </DirectionalLayout> 
  29. <!--DirectionalLayout布局-->  
  30.     <DirectionalLayout 
  31.         ohos:id="$+id:time" 
  32.         ohos:height="match_content" 
  33.         ohos:width="match_parent" 
  34.         ohos:alignment="horizontal_center" 
  35.         ohos:below="$id:title" 
  36.         ohos:orientation="horizontal" 
  37.         ohos:top_margin="0.5fp"
  38. <!--時間具體信息Text組件-->  
  39.         <Text...> 
  40.         <Text...> 
  41.         <Text...> 
  42.         <Text...> 
  43.         <Text...> 
  44.     </DirectionalLayout> 
  45.  <!--DirectionalLayout布局-->  
  46.     <DirectionalLayout 
  47.         ohos:height="match_content" 
  48.         ohos:width="match_parent" 
  49.         ohos:alignment="center" 
  50.         ohos:below="$id:time" 
  51.         ohos:margin="20fp" 
  52.         ohos:orientation="horizontal"
  53. <!--星期Text組件-->  
  54.         <Text...> 
  55.         <Text...> 
  56.         <Text...> 
  57.         <Text...> 
  58.         <Text...> 
  59.         <Text...> 
  60.         <Text...> 
  61.     </DirectionalLayout> 
  62. </DependentLayout> 

2×4布局分為三行,將日期與星期合為一行,時間說明內容、時間具體信息各單列一行,整體由DependentLayout布局嵌套一個DependentLayout和兩個DirectionalLayout構成。

其中DependentLayout布局中由一個Text組件和一個DirectionalLayout組成,DirectionalLayout中又嵌套七個Text組件。其余兩個DirectionalLayout內均使用Text組件進行展示,部分代碼示例如下:

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <DependentLayout 
  3.     xmlns:ohos="http://schemas.huawei.com/res/ohos" 
  4.     ohos:height="match_parent" 
  5.     ohos:width="match_parent" 
  6.     ohos:background_element="#6A9F99" 
  7.     ohos:remote="true"
  8. <!--DependentLayout布局--> 
  9.     <DependentLayout 
  10.         ohos:height="match_content" 
  11.         ohos:width="match_parent" 
  12.         ohos:orientation="horizontal"
  13. <!--日期Text組件-->    
  14.         <Text...> 
  15. <!--DirectionalLayout布局-->  
  16.         <DirectionalLayout 
  17.             ohos:height="match_content" 
  18.             ohos:width="match_content" 
  19.             ohos:align_parent_right="true" 
  20.             ohos:orientation="horizontal" 
  21.             ohos:top_margin="10fp"
  22. <!--星期Text組件-->              
  23.             <Text...> 
  24.             <Text...> 
  25.             <Text...> 
  26.             <Text...> 
  27.             <Text...> 
  28.             <Text...> 
  29.             <Text...> 
  30.         </DirectionalLayout> 
  31.     </DependentLayout> 
  32. <!--DirectionalLayout布局-->      
  33.     <DirectionalLayout 
  34.         ohos:id="$+id:title" 
  35.         ohos:height="match_content" 
  36.         ohos:width="match_parent" 
  37.         ohos:alignment="horizontal_center" 
  38.         ohos:orientation="horizontal" 
  39.         ohos:top_margin="35fp"
  40. <!--時間說明內容(HOUR、MIN、SEC)Text組件-->   
  41.         <Text...> 
  42.         <Text...> 
  43.         <Text...> 
  44.     </DirectionalLayout> 
  45. <!--DirectionalLayout布局-->   
  46.     <DirectionalLayout 
  47.         ohos:id="$+id:time" 
  48.         ohos:height="match_content" 
  49.         ohos:width="match_parent" 
  50.         ohos:alignment="horizontal_center" 
  51.         ohos:below="$id:title" 
  52.         ohos:orientation="horizontal"
  53. <!--時間具體信息Text組件-->  
  54.         <Text...> 
  55.         <Text...> 
  56.         <Text...> 
  57.         <Text...> 
  58.         <Text...> 
  59.     </DirectionalLayout> 
  60. </DependentLayout> 

三、卡片數據庫及卡片數據服務的創建

卡片數據庫的創建

本篇Codelab使用對象關系映射數據庫來對卡片ID,卡片名字等信息進行存儲。因此,我們需要創建一個數據庫(FormDatabase)和一張表(Form)。

其中,對象關系映射 (ORM) 數據庫類對應于關系數據庫,在本Codelab中即FormDatabase.java,用于存儲“Form”表,版本號為 “1”。

在使用 ORM 數據庫之前,需要創建一個繼承自OrmDatabase的數據庫類,并使用 @Database 對其進行注釋。示例代碼如下:

  1. @Database
  2.         entities = {Form.class}, 
  3.         version = 1) 
  4. public abstract class FormDatabase extends OrmDatabase { } 

關于OrmDatabase相關開發信息,開發者可以自行參考官網資料。

● OrmDatabase

https://developer.harmonyos.com/cn/docs/documentation/docreferences/ormdatabase0000001054838766

此外,我們定義一個對象關系映射 (ORM) 數據庫中的實體類Form.java,對應數據庫內的表名為“form”,包含了卡片id(formId),卡片名稱(formName) 和卡片規格(dimension)三個字段。在ORM數據庫中操作實體之前,需要創建一個繼承自OrmObject的實體類,并用@Entity注解。示例代碼如下:

  1. @Entity(tableName = "form"
  2. public class Form extends OrmObject { 
  3.     @PrimaryKey() 
  4.     private Long formId; 
  5.     private String formName; 
  6.     private Integer dimension; 
  7.  
  8.     public Form(Long formId, String formName, Integer dimension) { 
  9.         this.formId = formId;//卡片id 
  10.         this.formName = formName;//卡片名稱 
  11.         this.dimension = dimension;//卡片規格 
  12.     } 
  13.  
  14.     public Form() { } 
  15.  
  16.     public Integer getDimension() { 
  17.         return dimension; 
  18.     } 
  19.  
  20.     public void setDimension(Integer dimension) { 
  21.         this.dimension = dimension; 
  22.     } 
  23.  
  24.     public Long getFormId() { 
  25.         return formId; 
  26.     } 
  27.  
  28.     public void setFormId(Long formId) { 
  29.         this.formId = formId; 
  30.     } 
  31.  
  32.     public String getFormName() { 
  33.         return formName; 
  34.     } 
  35.  
  36.     public void setFormName(String formName) { 
  37.         this.formName = formName; 
  38.     } 

關于OrmObject相關開發信息,開發者可以自行參考官網資料。

● OrmObject

https://developer.harmonyos.com/cn/docs/documentation/docreferences/ormobject0000001054120141

卡片數據服務的創建

由于我們開發的時鐘服務卡片需要每隔一秒進行刷新,為了方便處理時鐘卡片刷新的定時任務,我們需要在目錄下右鍵new>Ability>Empty Service Ability,創建了一個名為TimerAbility的Service Ability,作為卡片更新定時器,以每秒一次的頻率更新:

  1. @Override 
  2.     public void onStart(Intent intent) { 
  3.         HiLog.info(LABEL_LOG, "TimerAbility::onStart"); 
  4.         connect = helper.getOrmContext("FormDatabase""FormDatabase.db", FormDatabase.class); 
  5.         startTimer(); 
  6.         super.onStart(intent); 
  7.     } 
  8.     // 卡片更新定時器,每秒更新一次 
  9.     private void startTimer() { 
  10.         Timer timer = new Timer(); 
  11.         timer.schedule( 
  12.                 new TimerTask() { 
  13.                     @Override 
  14.                     public void run() { 
  15.                         updateForms(); 
  16.                     } 
  17.                 }, 
  18.                 0, 
  19.                 SEND_PERIOD); 
  20.     } 

同時,TimerAbility還承擔著卡片更新的功能,我們將在下面詳細介紹。

四、時鐘卡片應用的創建、更新及刪除

在正式進入時鐘FA卡片的創建、更新及刪除的開發之前,我們先來了解關于卡片開發的一些基本概念。

服務卡片整體框架主要包含三部分:卡片使用方、卡片管理服務和卡片提供方。

卡片使用方: 顯示卡片內容的宿主應用,控制卡片在宿主中展示的位置。

卡片管理服務: 用于管理系統中所添加卡片的常駐代理服務,包括卡片對象的管理與使用,以及卡片周期性刷新等。

卡片提供方: 提供卡片顯示內容的HarmonyOS服務/HarmonyOS應用,控制卡片的顯示內容、控件布局以及控件點擊事件。開發者開發卡片即為卡片提供方。

說明

卡片使用方和提供方不要求常駐運行,在需要添加/刪除/請求更新卡片時,卡片管理服務會拉起卡片提供方獲取卡片信息。

卡片創建

當卡片使用方請求獲取卡片時,卡片提供方會被拉起并調用onCreateForm回調函數,intent中會帶有卡片ID,卡片名稱和卡片外觀規格信息,分別通過AbilitySlice.PARAM_FORM_IDENTITY_KEY、AbilitySlice.PARAM_FORM_NAME_KEY和AbilitySlice.PARAM_FORM_DIMENSION_KEY獲取,并根據卡片的名稱以及外觀規格獲取對應的xml布局并構造卡片對象,完成卡片信息的創建。

在MainAbility中有如下示例代碼:

  1. @Override  
  2. protected ProviderFormInfo onCreateForm(Intent intent) {  
  3.     if (intent == null) {  
  4.         return new ProviderFormInfo();  
  5.     }  
  6.      // 獲取卡片ID  
  7.     formId = INVALID_FORM_ID;  
  8.     if (intent.hasParameter(AbilitySlice.PARAM_FORM_IDENTITY_KEY)) {  
  9.         formId = intent.getLongParam(AbilitySlice.PARAM_FORM_IDENTITY_KEY, INVALID_FORM_ID);  
  10.     } else {  
  11.         return new ProviderFormInfo();  
  12.     }  
  13.     // 獲取卡片名稱  
  14.     String formName = EMPTY_STRING;  
  15.     if (intent.hasParameter(AbilitySlice.PARAM_FORM_NAME_KEY)) {  
  16.         formName = intent.getStringParam(AbilitySlice.PARAM_FORM_NAME_KEY);  
  17.     }  
  18.     // 獲取卡片規格  
  19.     int dimension = DEFAULT_DIMENSION_2X2;  
  20.     if (intent.hasParameter(AbilitySlice.PARAM_FORM_DIMENSION_KEY)) {  
  21.         dimension = intent.getIntParam(AbilitySlice.PARAM_FORM_DIMENSION_KEY, DEFAULT_DIMENSION_2X2);  
  22.     }  
  23.     int layoutId = ResourceTable.Layout_form_image_with_info_date_card_2_2;  
  24.     if (dimension == DEFAULT_DIMENSION_2X4) {  
  25.         layoutId = ResourceTable.Layout_form_image_with_info_date_card_2_4;  
  26.     }  
  27.     formInfo = new ProviderFormInfo(layoutId, this);  
  28.     // 存儲卡片信息  
  29.     Form form = new Form(formId, formName, dimension);  
  30.     ComponentProvider componentProvider = ComponentProviderUtils.getComponentProvider(form, this);  
  31.     formInfo.mergeActions(componentProvider);  
  32.     if (connect == null) {  
  33.         connect =  
  34.                 helper.getOrmContext("FormDatabase""FormDatabase.db", FormDatabase.class);  
  35.     }  
  36.     try {  
  37.         DatabaseUtils.insertForm(form, connect);  
  38.     } catch (Exception e) {  
  39.         DatabaseUtils.deleteFormData(form.getFormId(), connect);  
  40.     }  
  41.     return formInfo;  

卡片的更新

服務卡片刷新機制分為兩種,第一種是定時/定點更新,即在config.json中配置了定時/定點更新之后,卡片管理服務會定期拉起服務卡片刷新數據。第二種是主動更新,即開發者根據需要主動調用updateForm方法更新卡片。在本Codelab中,我們選擇的是第二種方式。

我們在之前創建的TimerAbility.java中調用updateForm方法,從數據表Form中獲取卡片信息,更新時分秒:

  1. private void updateForms() {  
  2.     // 從數據庫中獲取卡片信息  
  3.     OrmPredicates ormPredicates = new OrmPredicates(Form.class);  
  4.     List<Form> formList = connect.query(ormPredicates);  
  5.     // 更新時分秒  
  6.     if (formList.size() > 0) {  
  7.   for (Form form : formList) {  
  8.        // 遍歷卡片列表更新卡片  
  9.       ComponentProvider componentProvider = ComponentProviderUtils.getComponentProvider(form, this);  
  10.       try {  
  11.     Long updateFormId = form.getFormId();  
  12.     updateForm(updateFormId, componentProvider);  
  13.       } catch (FormException e) {  
  14.         // 刪除不存在的卡片  
  15.         DatabaseUtils.deleteFormData(form.getFormId(), connect);  
  16.         HiLog.error(LABEL_LOG, "onUpdateForm updateForm error");  
  17.       }  
  18.    }  
  19.      }  

同時,組件同步展示時間更新。我們封裝ComponentProviderUtils這個類,在卡片更新時候,通過調用updateForm方法,傳入參數formId和componentProvider,以達到日期、時間和星期實時更新的效果,部分代碼和效果如下:

【Codelab】時鐘服務卡片開發指南-鴻蒙HarmonyOS技術社區
  1. public static ComponentProvider getComponentProvider(Form form, Context context) {  
  2.     int layoutId = ResourceTable.Layout_form_image_with_info_date_card_2_2;  
  3.     if (form.getDimension() == DIM_VERSION) {  
  4.   layoutId = ResourceTable.Layout_form_image_with_info_date_card_2_4;  
  5.     }  
  6.     ComponentProvider componentProvider = new ComponentProvider(layoutId, context);  
  7.     setComponentProviderValue(componentProvider);  
  8.     return componentProvider;  
  9. }  
  10. // 為時鐘各個組件賦值  
  11. private static void setComponentProviderValue(ComponentProvider componentProvider) {  
  12.     Calendar now = Calendar.getInstance();  
  13.     int hour = now.get(Calendar.HOUR_OF_DAY);  
  14.     int min = now.get(Calendar.MINUTE);  
  15.     int second = now.get(Calendar.SECOND);  
  16.     String hourString = int2String(hour);  
  17.     String minString = int2String(min);  
  18.     String secondString = int2String(second);  
  19.     componentProvider.setText(ResourceTable.Id_date, DateUtils.getCurrentDate("yyyy-MM-dd"));  
  20.     componentProvider.setText(ResourceTable.Id_hour, hourString);  
  21.     componentProvider.setText(ResourceTable.Id_min, minString);  
  22.     componentProvider.setText(ResourceTable.Id_sec, secondString);  
  23.  
  24.     // 獲取當前星期  
  25.     int weekDayId = getWeekDayId();  
  26.     componentProvider.setTextColor(weekDayId, nowWeekColor);  
  27.     // 將前一天的星期改回原色  
  28.     int lastWeekId = getLastWeekDayId();  
  29.     componentProvider.setTextColor(lastWeekId, primaryWeekColor);  

卡片刪除

當卡片被刪除時,需要重寫onDeleteForm方法,我們將在MainAbility中根據卡片id刪除卡片實例數據:

  1. @Override  
  2. protected void onDeleteForm(long formId) {  
  3.     super.onDeleteForm(formId);  
  4.     // 刪除數據庫中的卡片信息  
  5.     DatabaseUtils.deleteFormData(formId, connect); 

至此,我們完成了時鐘卡片應用的開發,構建了一個2×2和2×4的卡片樣式。

想了解更多內容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區

https://harmonyos.51cto.com

 

責任編輯:jianghua 來源: 鴻蒙社區
相關推薦

2021-06-24 14:41:16

鴻蒙HarmonyOS應用

2011-07-25 16:21:22

Sencha touc

2021-03-01 09:48:24

鴻蒙HarmonyOS應用開發

2021-02-24 15:22:47

鴻蒙HarmonyOS應用開發

2022-08-02 08:01:09

開發插件Chrome前端技術

2021-04-16 09:28:18

鴻蒙HarmonyOS應用

2021-02-04 13:06:38

鴻蒙HarmonyOS應用開發

2021-01-13 09:40:31

鴻蒙HarmonyOS開發

2012-03-26 09:27:40

谷歌安卓開發谷歌安卓

2011-06-09 18:24:36

QT Wince

2023-05-15 18:44:07

前端開發

2021-08-23 10:12:41

鴻蒙HarmonyOS應用

2009-06-24 16:30:21

JSF組件模型

2021-02-04 09:45:19

鴻蒙HarmonyOS應用開發

2021-02-26 14:15:27

鴻蒙HarmonyOS應用開發

2021-01-18 09:52:20

鴻蒙HarmonyOS開發

2021-06-28 14:48:03

鴻蒙HarmonyOS應用

2015-11-12 16:14:52

Python開發實踐

2019-10-31 08:00:00

機器學習人工智能AI

2015-12-16 10:30:18

前端開發指南
點贊
收藏

51CTO技術棧公眾號

亚洲精品在线观看91| 精精国产xxxx视频在线野外 | 国产午夜亚洲精品午夜鲁丝片| 国产精品久久久久久久久久99| 中文字幕精品亚洲| 日本伊人久久| 岛国精品视频在线播放| 亚洲国产精品123| 亚洲精品久久久久久无码色欲四季 | 无码人妻精品一区二区三区蜜桃91 | 日韩经典一区二区三区| 污色网站在线观看| 9999热视频在线观看| 欧美高清在线一区| 国产日韩一区二区| 在线免费观看av片| 国产亚洲高清视频| 成人97在线观看视频| 国产熟妇久久777777| 清纯唯美激情亚洲| 欧美日韩国产在线播放网站| 人人妻人人添人人爽欧美一区| 国产三区在线观看| 久久久91精品国产一区二区精品 | 午夜精品爽啪视频| 91手机视频在线| 国产在线小视频| 成人午夜私人影院| 国产欧美日韩综合精品| 免费看一级视频| 亚洲激情久久| 国产亚洲精品久久久| 精品一区二区视频在线观看| 日本黄色成人| 欧美在线不卡一区| 欧美日韩在线不卡视频| wwww亚洲| 亚洲一二三区在线观看| 欧洲精品视频在线| 黄页视频在线播放| 国产精品色眯眯| 欧美一区二区高清在线观看| 天天操天天干天天爱| 国产成人综合在线观看| 91久久精品国产91久久| 91麻豆成人精品国产| 美女视频黄免费的久久| 人人爽久久涩噜噜噜网站| 可以在线观看av的网站| 在线亚洲自拍| 欧美诱惑福利视频| 久草国产精品视频| 国产日韩欧美一区二区三区在线观看| 欧美成人合集magnet| 裸体武打性艳史| 亚洲国产不卡| 欧美风情在线观看| 久久机热这里只有精品| 欧美久久成人| 久久久久在线观看| 91精品国产高潮对白| 在线观看视频免费一区二区三区| 欧美大片在线看| 亚洲国产综合久久| 久久久999| 国产精品福利久久久| 中文无码精品一区二区三区| 欧美aaaaaa午夜精品| 成人黄色av网站| 国产sm主人调教女m视频| 国产盗摄一区二区三区| 国产精品区二区三区日本| 偷拍精品一区二区三区| 久久精品欧美日韩精品| 亚洲电影一二三区| 91精选在线| 天天影视色香欲综合网老头| 116极品美女午夜一级| 精品国模一区二区三区| 欧美日韩国产免费一区二区| 亚洲色图欧美自拍| 国产精品99久久免费观看| 日韩国产在线看| 色欲AV无码精品一区二区久久 | 亚洲欧洲国产精品一区| 亚洲福利影片在线| 精品人妻中文无码av在线| 91影院成人| 97视频在线观看视频免费视频 | 国产精品白丝久久av网站| 欧美成人女星排名| 亚洲区自拍偷拍| 久久久久国产精品| 91av视频在线观看| 中文字幕一区二区人妻痴汉电车| 国产精品一区三区| 欧美在线激情| 18av在线视频| 色综合天天综合狠狠| 91丝袜超薄交口足| 亚洲大片精品免费| 九九久久国产精品| 国产成人a v| 成人一区在线观看| 视频一区二区三区在线观看| 国产经典三级在线| 欧美日韩中文字幕精品| 国产精品果冻传媒| 97久久夜色精品国产| 91国在线精品国内播放 | 日本va欧美va欧美va精品| 亚洲一区二区三区成人在线视频精品| 日韩电影网址| 一区二区三区四区蜜桃| 国产wwwxx| 天堂俺去俺来也www久久婷婷| 久热精品视频在线免费观看 | 日本不卡一区二区| 国产伦精品一区二区三区照片 | 波多野结衣在线观看一区二区三区 | 久久大胆人体| 欧美日韩精品一区二区三区四区 | 嫩草研究院在线观看| 亚洲男人的天堂网| 午夜在线观看av| 欧美日韩xxxx| 性色av一区二区三区在线观看| 国产999久久久| 国产精品视频你懂的| 欧美色图色综合| 懂色av一区二区| 久久成人亚洲精品| 一区二区不卡视频在线观看| 国产日本欧美一区二区| 红桃av在线播放| 久久久亚洲欧洲日产| 久色乳综合思思在线视频| 中文在线字幕av| 国产免费观看久久| 能看的毛片网站| 亚洲区小说区图片区qvod按摩| 久久久久久69| 刘亦菲毛片一区二区三区| 亚洲伦理在线精品| 亚洲妇女无套内射精| 91国语精品自产拍| 亚洲一区二区久久久久久久| 菠萝蜜视频国产在线播放| 欧美精品成人一区二区三区四区| 欧美 日韩 成人| 美女视频网站黄色亚洲| 影音先锋欧美在线| 2020国产精品小视频| 日韩视频免费观看| 国产福利视频导航| 亚洲一区二区四区蜜桃| www.四虎在线| 亚洲一区二区三区高清不卡| 久久精品成人一区二区三区蜜臀| 国产一二三在线| 精品偷拍各种wc美女嘘嘘| 国产精品久久久久久久久久久久久久久久久 | 国产一级视频在线播放| zzijzzij亚洲日本少妇熟睡| 精品无码国模私拍视频| 偷拍一区二区| 国产精品日韩久久久久| 黄网页在线观看| 日韩你懂的在线观看| 日韩精品在线免费看| 久久久久久久久久久电影| 色婷婷成人在线| 欧美在线高清| 精品久久中出| 亚洲精品国产嫩草在线观看| 久久久精品久久久久| 国产成人自拍一区| 色老汉一区二区三区| 青青青视频在线免费观看| 国产成人综合在线观看| avav在线看| 亚洲精品一区二区妖精| 精选一区二区三区四区五区| 亚洲成人一区在线观看| 欧美成人一区二区三区电影| 色鬼7777久久| 在线不卡免费欧美| 国偷自拍第113页| 国产精品久久久久久久久晋中 | 成人黄色小视频| 91成人理论电影| 中文字幕资源网在线观看免费| 日韩中文字在线| 午夜视频免费看| 制服丝袜成人动漫| 午夜婷婷在线观看| 亚洲精选视频在线| 欧美做受高潮6| 成人午夜av电影| 欧美成人福利在线观看| 在线不卡视频| 樱空桃在线播放| 久久99久久人婷婷精品综合 | 91亚洲自偷观看高清| 国产一区二区高清不卡| 日韩三级一区| 日韩免费在线观看视频| 啪啪免费视频一区| 中文字幕日韩在线观看| 天天干天天干天天干| 欧美伦理视频网站| 亚洲成人av影片| 亚洲成人av资源| 精品国产视频在线观看| 欧美极品美女视频| 亚洲观看黄色网| 国产精品一区二区果冻传媒| 亚洲综合色在线观看| 在线综合亚洲| 国产精品专区在线| 欧美理论在线| av不卡在线免费观看| 欧美码中文字幕在线| 久久青青草综合| 大奶在线精品| 波多野结衣精品久久| 国产剧情一区二区在线观看| 国产精品日韩欧美综合| 日韩精品三区| 日本欧美爱爱爱| 深夜在线视频| 91精品国产色综合久久不卡98口| 性欧美1819sex性高清大胸| 精品国产一区久久久| 77777影视视频在线观看| 亚洲天堂av在线免费观看| 亚州av在线播放| 日韩精品日韩在线观看| 少妇人妻偷人精品一区二区| 精品国产露脸精彩对白| 黑人精品一区二区| 亚洲精品一线二线三线| 亚洲老妇色熟女老太| 精品国产乱码久久久久久久| 蜜臀久久99精品久久久| 欧美精品一区二区三区高清aⅴ | 香蕉久久久久久| 国产免费久久av| 先锋影音网一区二区| 91亚洲精品在线观看| 8848成人影院| 国产伦精品一区二区三| 欧美日韩一区二区三区四区不卡| 精品高清视频| 亚洲美女久久| 日本一区二区高清视频| 成人嫩草影院| 黄色网zhan| 国产精品草草| 精品人妻一区二区三区四区在线| 国产一区二区精品| 男人天堂成人在线| 久久国产欧美日韩精品| 古装做爰无遮挡三级聊斋艳谭| 国产盗摄女厕一区二区三区| wwwxx日本| 久久一二三国产| 日本猛少妇色xxxxx免费网站| 国产精品白丝在线| 欧美成人精品欧美一级| 性久久久久久久久| 中文字幕精品无码一区二区| 欧美综合一区二区三区| 国产乱色精品成人免费视频| 日韩欧美一区二区视频| 国产又爽又黄网站亚洲视频123| 亚洲视频第一页| 精品国产99久久久久久| 68精品久久久久久欧美 | 久久黄色影院| 成人亚洲免费视频| 94色蜜桃网一区二区三区| 一级黄色片网址| 亚洲激情中文1区| 国产又大又粗又爽| 欧美一级欧美三级| 全部免费毛片在线播放网站| www.美女亚洲精品| sm在线播放| 国产精品中文字幕在线| 国内精品偷拍| 尤物一区二区三区| 99精品国产福利在线观看免费 | 久久综合久久综合九色| 亚洲综合图片一区| 午夜国产精品一区| 91激情在线观看| 亚洲美女中文字幕| jizz性欧美| 国产精品美女久久| 国产精品黄网站| 欧美日韩亚洲国产成人| 美女久久一区| 特级特黄刘亦菲aaa级| 国产精品久久久久久久岛一牛影视 | 91久久久久久久久久久久久久| 午夜精品久久久久久久久久久| 亚洲视频在线免费播放| 日韩精品免费电影| 韩国日本一区| 成人黄色大片在线免费观看| 国产成人精品免费视| 国产自产在线视频| 国产综合色在线视频区| 一卡二卡三卡四卡| 亚洲国产精品一区二区尤物区| 夜夜狠狠擅视频| 亚洲午夜av电影| 亚洲天堂av在线| 国产精品视频免费一区| 亚洲精品国产偷自在线观看| 男人添女人下面免费视频| 国产日韩欧美a| 圆产精品久久久久久久久久久| 欧美一二三区在线观看| 欧美黄色激情| 国产精品视频中文字幕91| 亚洲素人在线| www在线观看免费| 成人精品免费看| 久久久精品99| 欧美一区二区三区白人| 黄色av免费在线| 成人中文字幕在线观看| 99久久www免费| 高潮一区二区三区| 国产精品免费aⅴ片在线观看| 波多野结衣黄色| 一本一本久久a久久精品牛牛影视 一本色道久久综合亚洲精品小说 一本色道久久综合狠狠躁篇怎么玩 | 激情懂色av一区av二区av| 成人久久久精品国产乱码一区二区 | 国产探花视频在线| 精品视频色一区| 岛国视频免费在线观看| 国产精品普通话| 青草国产精品| 久久久久久久久久一区| 日韩一区有码在线| 国产三级午夜理伦三级| 蜜臀久久99精品久久久无需会员 | 成人性色生活片免费看爆迷你毛片| 青娱乐免费在线视频| 精品黑人一区二区三区久久| 国产蜜臀一区二区打屁股调教| 国产精品久久久久av福利动漫| 亚洲精品孕妇| 欧美亚一区二区三区| 91精品福利视频| 求av网址在线观看| 999在线免费观看视频| 亚洲第一伊人| 亚洲熟妇一区二区三区| 欧亚一区二区三区| 国产在线观看免费麻豆| 国产成人亚洲欧美| 一区二区三区福利| 午夜时刻免费入口| 欧美日韩成人一区| 欧美人与性动交α欧美精品济南到 | 国产九色在线| 成人精品久久久| 伊人久久亚洲影院| 日本少妇高潮喷水xxxxxxx| 欧美日韩情趣电影| 欧洲黄色一区| 欧美精品久久久| 久久er99精品| 久青草免费视频| 国产一区二区三区直播精品电影| 韩国理伦片久久电影网| 国产成人永久免费视频| 久久久综合激的五月天| 免费在线观看91| 中文字幕在线视频久| 亚洲图片小说在线| 高清日韩电视剧大全免费| 免费的毛片视频| 美乳少妇欧美精品| 国产欧美一区二区三区精品观看 | 黄色激情视频在线观看| 亚洲午夜av电影| 成人看片黄a免费看视频| 37pao成人国产永久免费视频| 亚洲欧美影音先锋| 三级黄视频在线观看| 国产自摸综合网| 六月天综合网| 麻豆亚洲av熟女国产一区二| 国产一区二区三区在线播放免费观看| 久久久久九九精品影院|