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

鴻蒙開源第三方組件—游戲框架JustWeEngine

開發(fā) 項(xiàng)目管理
JustWeEngine是托管在Gitee 的一個(gè)開源的Ohos原生開發(fā)框架,可以讓Ohos的開發(fā)人員非常便捷,無需切換語言和編譯器的制作Ohos原生游戲。

[[414844]]

想了解更多內(nèi)容,請(qǐng)?jiān)L問:

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

JustWeEngine

本項(xiàng)目是基于開源項(xiàng)目JustWeEngine進(jìn)行ohos化的移植和開發(fā)的,可以通過項(xiàng)目標(biāo)簽以及github地址(https://github.com/lfkdsk/JustWeEngine )追蹤到原項(xiàng)目版本

項(xiàng)目介紹

  • 項(xiàng)目名稱:JustWeEngine
  • 所屬系列:ohos的第三方組件適配移植
  • 功能:JustWeEngine是托管在Gitee 的一個(gè)開源的Ohos原生開發(fā)框架,可以讓Ohos的開發(fā)人員非常便捷,無需切換語言和編譯器的制作Ohos原生游戲
  • 項(xiàng)目移植狀態(tài):完成
  • 調(diào)用差異:無
  • 原項(xiàng)目基線版本:v1.13
  • 編程語言:Java

效果展示

安裝教程

方法1.

  1. 編譯har包JustWeEngine.har。
  2. 啟動(dòng) DevEco Studio,將編譯的har包,導(dǎo)入工程目錄“entry->libs”下。
  3. 在moudle級(jí)別下的build.gradle文件中添加依賴,在dependences標(biāo)簽中增加對(duì)libs目錄下har包的引用。
  1. dependencies { 
  2.     implementation fileTree(dir: 'libs', include: ['*.jar''*.har']) 
  3.     …… 

      4.在導(dǎo)入的har包上點(diǎn)擊右鍵,選擇“Add as Library”對(duì)包進(jìn)行引用,選擇需要引用的模塊,并點(diǎn)擊“OK”即引用成功。

方法2.

1.在工程的build.gradle的allprojects中,添加HAR所在的Maven倉地址(等maven發(fā)布后進(jìn)行修改)

  1. repositories { 
  2.     maven { 
  3.         url 'https://s01.oss.sonatype.org/content/repositories/releases/'  
  4.     } 

2.在應(yīng)用模塊的build.gradle的dependencies閉包中,添加如下代碼:(等maven發(fā)布后進(jìn)行修改)

  1. dependencies { 
  2.     implementation 'io.github.dzsf:just-we-engine:1.0.1' 

使用說明

1.基礎(chǔ)功能

  • 1.1繼承引擎核心類
  • 1.2繪制文字
  • 1.3繪制圖片
  • 1.4使用精靈
  • 1.5使用按鈕

2.動(dòng)畫系統(tǒng)

  • 2.1綁定在BaseSub物品及精靈基類上的動(dòng)畫類
  • 2.2綁定在Button上的動(dòng)畫類

3.物體分組碰撞檢測和死亡判定

4.屏幕掃描模式

5.工具類

6.音頻系統(tǒng)

  • 6.1播放短音效
  • 6.2播放音頻
  • 6.3通過短音效編曲

進(jìn)階應(yīng)用

7.使用網(wǎng)絡(luò)

8.使用狀態(tài)機(jī)精靈

9.CrashHandler崩潰守護(hù)

10.使用藍(lán)牙

  • 10.1開啟、關(guān)閉服務(wù)
  • 10.2掃描設(shè)備
  • 10.3發(fā)送消息

11.SQLite數(shù)據(jù)庫

  • 11.1創(chuàng)建表
  • 11.2增刪查改

基礎(chǔ)功能

繼承引擎核心類:

由于框架全部使用SurfaceView進(jìn)行繪制,不使用諸如Button、Layout等原生控件,所以應(yīng)該首先新建類繼承引擎核心類Engine,負(fù)責(zé)游戲的流程,注釋中已有明確的標(biāo)明功能。

  1. public class MainAbility extends Engine implements Runnable, Component.TouchEventListener, Component.DrawTask { 
  2.     // 一般在構(gòu)造函數(shù)完成變量的初始化 
  3.     public MainAbility() { 
  4.          
  5.     } 
  6.  
  7.     public void onStart(Intent intent) { 
  8.         // 調(diào)用初始化方法 
  9.         init(); 
  10.     } 
  11.      
  12.     // 載入一些UI參數(shù)和設(shè)置屏幕放向,默認(rèn)背景色,設(shè)定屏幕的掃描方式等 
  13.     public void init() { 
  14.         // 初始化UI默認(rèn)參數(shù),必須調(diào)用該方法,其中有一些用于多機(jī)型適配的參數(shù)需要初始化 
  15.         UIdefaultData.init(this); 
  16.     } 
  17.  
  18.     // 通常用于精靈,背景,圖片等物體的設(shè)置和載入 
  19.     public void load() { 
  20.  
  21.     } 
  22.  
  23.     // draw 和 update 在線程中進(jìn)行不斷的循環(huán)刷新 
  24.     // draw 負(fù)責(zé)繪制 update 負(fù)責(zé)更新數(shù)據(jù)和對(duì)象信息 
  25.     public void draw() { 
  26.  
  27.     } 
  28.  
  29.     public void update() { 
  30.  
  31.     } 
  32.      
  33.     // 將touch 事件傳回 功能和所設(shè)定的屏幕掃描方式有關(guān) 
  34.     public void touch(TouchEvent event) { 
  35.  
  36.     } 
  37.      
  38.     // 將碰撞事件傳回 傳回精靈和物品的基類  
  39.     // 用于處理碰撞事件 默認(rèn)使用矩形碰撞 
  40.     public void collision(BaseSub baseSub) { 
  41.  
  42.     } 

繪制文字:

使用GamePrinter進(jìn)行文字繪制,除此以外還有多種方法繪制:

  1. @Override 
  2.   public void draw() { 
  3.       Canvas canvas = getCanvas(); 
  4.       GameTextPrinter printer = new GameTextPrinter(canvas); 
  5.       printer.drawText("哈哈哈", 100, 100); 
  6.   } 
  7.    

繪制圖片:

建議圖片存放在Resources中:

  1. GameTexture texture = new GameTexture(this); 
  2.     texture.loadFromAsset("resources/base/graphic/shoot.png"
  3.     texture.draw(canvas, 100, 100); 

另外也可使用loadFromAssetStripFrame從一個(gè)大的圖片中取出對(duì)應(yīng)位置的圖片。

  1. /** 
  2.     * get bitmap from a big bitmap 
  3.     * 
  4.     * @param filename 
  5.     * @param x 
  6.     * @param y 
  7.     * @param width 
  8.     * @param height 
  9.     * @return 
  10.     */ 
  11.    public boolean loadFromAssetStripFrame(String filename, 
  12.                                           int x, int y, 
  13.                                           int width, int height) 

PicUtils中提供了在Bitmap處理中很有用的各種特效和壓縮方法,大家可以一試。

使用精靈:

使用精靈可以使用BaseSprite也可以繼承該類使用,BaseSprite封裝了很多方法供各種動(dòng)畫使用,這些功能很多都是需要結(jié)合動(dòng)畫系統(tǒng)來使用的,動(dòng)畫系統(tǒng)會(huì)在后面介紹。

新建精靈:

1.簡單初始化:

  1. sprite = new BaseSprite(this); 

2.初始化連續(xù)幀動(dòng)畫:

連續(xù)幀的初始化需要連續(xù)的幀圖片。

  1. GameTexture texture = new GameTexture(this); 
  2. texture.loadFromAsset("resources/base/graphic/flare.png"); 
  3. // 長寬以及列數(shù) 
  4. sprite = new BaseSprite(this, 96, 96, 8); 
  5. sprite.setTexture(texture); 
  6. sprite.setPosition(100, 100); 
  7. sprite.setDipScale(100, 100); 
  8. // 幀切換動(dòng)畫是關(guān)鍵 
  9. sprite.addAnimation(new FrameAnimation(0, 63, 1)); 
  10. addToSpriteGroup(sprite); 

3.使用從大圖取出的多幀圖片:

  1. // 新建圖片資源(此圖為上圖的大圖) 
  2.         GameTexture texture = new GameTexture(this); 
  3.         texture.loadFromAsset("resources/base/graphic/shoot.png"); 
  4.         // 初始化設(shè)定模式和長寬 
  5.         ship = new BaseSprite(this, 100, 124, FrameType.COMMON); 
  6.         // 設(shè)定資源 
  7.         ship.setTexture(texture); 
  8.         // 從大圖中取出兩幀 
  9.         ship.addRectFrame(0, 100, 100, 124); 
  10.         ship.addRectFrame(167, 361, 100, 124); 
  11.         ship.addAnimation(new FrameAnimation(0, 1, 1)); 

4.一些重要的其他設(shè)定:

  1. // 圖片資源 
  2.       ship.setTexture(texture); 
  3.       // 大圖取幀模式 
  4.       ship.addRectFrame(0, 100, 100, 124); 
  5.       // 設(shè)定位置 
  6.       ship.setPosition(x, y); 
  7.       // 設(shè)置dp大小 
  8.     ship.setDipScale(96, 96); 
  9.     // 設(shè)定dp位置 
  10.  ship.setDipPosition(x, y); 
  11.  // 設(shè)定透明度 
  12.  ship.setAlpha(...); 
  13.  // 只有將精靈添加到SpriteGroup中框架才會(huì)自行繪制,否則需要手動(dòng)調(diào)用 
  14.  addToSpriteGroup(ship); 
  15.  ... 
  16.   

使用按鈕:

使用的按鈕可以繼承BaseButton進(jìn)行拓展,也可以直接使用TextureButton和TextButton進(jìn)行使用。

Button設(shè)定功能的方式和原生一樣,通過設(shè)定接口回調(diào)的方式進(jìn)行:

  1. button.setOnClickListener(new OnClickListener() { 
  2.           @Override 
  3.           public void onClick() { 
  4.               Log.e("button""onClick"); 
  5.           } 
  6.         }); 
  7.          

TextureButton:

  1. TextureButton button; 
  2.      // 初始化并設(shè)定名字 
  3.      button = new TextureButton(this, "logo"); 
  4.   texture = new GameTexture(this); 
  5.      texture.loadFromAsset("resources/base/graphic/logo.jpg"); 
  6.      // 添加圖片資源 
  7.      button.setTexture(texture); 
  8.      // button的接口回調(diào),不是View的那個(gè)接口 
  9.      button.setOnClickListener(new OnClickListener() { 
  10.          @Override 
  11.          public void onClick() { 
  12.              Log.e("button""onClick"); 
  13.          } 
  14.        }); 
  15.      button.setPosition(200, 300); 
  16.      button.setDipScale(100, 150); 
  17.      // 添加到ButtonGroup進(jìn)行繪制和處理 
  18.      addToButtonGroup(button); 

結(jié)合PicUtil中的各種Bitmap處理方法可以很容易的做出各種樣式的Button。

TextButton:

TextButton button;

  1. TextButton button;   
  2.     button = new TextButton(this, "logo"); 
  3.     button.setText("劉豐愷"); 
  4.     addToButtonGroup(button); 
  5.     // 余略見源碼 
  6.  ... 

動(dòng)畫系統(tǒng)

目前的動(dòng)畫系統(tǒng)可以使用已經(jīng)封裝好的繼承了BaseAnimation的動(dòng)畫,也可以繼承BaseAnim進(jìn)行自我定義動(dòng)畫類進(jìn)行使用。

綁定在BaseSub物品及精靈基類上的動(dòng)畫類

AnimType中保存了Animation的應(yīng)用類型。

綁定動(dòng)畫分為兩類,ListAnimation和FixedAnimation,ListAnimation將動(dòng)畫存儲(chǔ)到固定的一個(gè)List中,用于重復(fù)更新的動(dòng)畫,

而FixedAnimation存儲(chǔ)在Map中,使用名字進(jìn)行調(diào)用,用于點(diǎn)擊或者非自動(dòng)更新的動(dòng)畫。

比如前面精靈類動(dòng)畫的就是添加到ListAnimation。

下面的這種寫法就是FixedAnimation,這個(gè)動(dòng)畫是飛機(jī)入場,因?yàn)橹皇褂昧艘淮危允褂昧薋ixedAnimation。

  1. ship.addfixedAnimation("start"
  2.                new MoveAnimation(UIdefaultData.centerInHorizontalX -   ship.getWidthWithScale() / 2, 
  3.                        UIdefaultData.screenHeight - 2 * ship.getHeightWidthScale(), new Float2(10, 10))); 
  4.             

綁定在Button上的動(dòng)畫類

BaseButtonAnimation是BaseButton的動(dòng)畫類繼承了BaseAnim的動(dòng)畫基類,通過提供Button的狀態(tài),設(shè)定Button的動(dòng)畫。

為Button設(shè)定放縮動(dòng)畫:

  1. // 設(shè)定中心放縮 
  2.    button.setZoomCenter(true); 
  3.    // 三個(gè)參數(shù) 初始值/放大值/幀數(shù) 
  4.    button.setAnimation(new ZoomCenterButtonAnim(10, 30, 3)); 

為Button設(shè)定顏色動(dòng)畫:

  1. // 初始顏色 / 按下顏色 
  2. button.setAnimation( 
  3.       new ColorAnimation(UIdefaultData.colorAccent, 
  4.       UIdefaultData.colorPressed)); 

物體分組碰撞檢測和死亡判定

使用設(shè)置ID和Name進(jìn)行物體分組,通過物體分組,框架核心類會(huì)對(duì)對(duì)象進(jìn)行分類處理。

  1. final int SHIP = 0; 
  2.     ship.setName("SHIP"); 
  3.     ship.setIdentifier(SHIP); 

只要使用了addToSpriteGroup(sprite)的精靈對(duì)象就會(huì)自動(dòng)進(jìn)行碰撞檢測,而對(duì)碰撞檢測的結(jié)果會(huì)從

collision中進(jìn)行發(fā)回。

  1. @Override 
  2.   public void collision(BaseSub baseSub) { 
  3.     // 獲取與之碰撞的對(duì)象 
  4.       BaseSprite other = (BaseSprite) baseSub.getOffender(); 
  5.       // 獲取ID分組處理 
  6.       if (baseSub.getIdentifier() == BULLET && 
  7.               other.getIdentifier() == ENEMY) { 
  8.           // 設(shè)定死亡 
  9.           other.setAlive(false); 
  10.           // 回收 
  11.           removeFromSpriteGroup(other); 
  12.           addToRecycleGroup(other); 
  13.       } 
  14.   } 
  15.    

其中g(shù)etOffender()獲得與之碰撞的對(duì)象,通過getIdentifier()獲取設(shè)定的對(duì)象分組,實(shí)行邏輯判斷。

開啟Debug模式會(huì)看見碰撞線。

屏幕掃描模式

屏幕掃描模式是用來優(yōu)先響應(yīng)屏幕點(diǎn)擊、Button點(diǎn)擊、和多點(diǎn)觸控而設(shè)的,放置在不同情況下都能優(yōu)化屏幕的刷新。

  1. // 檢測單一移動(dòng) 
  2. SINGLE, 
  3. // 檢測Button 
  4.  BUTTON, 
  5.  // 多點(diǎn)檢測 
  6.  FULL
  7.  // 單擊+Button 
  8.  SINGLE_BUTTON 

并且通過如下方式進(jìn)行設(shè)置:

  1. super.setTouchMode(TouchMode.BUTTON); 

工具類

  • NetUtils 網(wǎng)絡(luò)狀態(tài)工具類
  • PicUtils 圖片處理工具類
  • ServiceUtils 服務(wù)工具類
  • ImageHelper 圖型處理類
  • DisplayUtils 數(shù)據(jù)轉(zhuǎn)換類
  • SpUtils Sp簡化工具類(可存儲(chǔ)list和map)
  • ValidatorsUtils 正則表達(dá)式處理類

音頻系統(tǒng)

播放短音效

播放短音效,首先初始化SoundManager用以加載音效。

  1. // 接收實(shí)例和Manager的尺寸 
  2.    SoundManager manager = new SoundManager(this, 5); 
  3.    // 從assets加載音頻 同時(shí)加載路徑也會(huì)作為音效名進(jìn)行存儲(chǔ) 
  4. manager.addSound("resource/rawfile/open.mid"); 
  5. // 通過加載名進(jìn)行播放 
  6. manager.play("resource/rawfile/open.mid"); 

完成以上步驟就可以播放了,當(dāng)然盡量只向其中放置較短的音效,如背景音樂的長音頻,請(qǐng)見播放音頻。

  1. public void removeSound(String musicName) // 移除 
  2. public void play(String musicName, float volume) // 播放 + 音量 
  3. public boolean containSoundID(int soundID) // 判斷音頻是否存在 
  4. public int getSoundID(String soundName)  // 獲取ID 
  5. ... 

播放音頻

播放音頻適合例如背景音樂一樣的音樂。

  1. // 傳入兩個(gè)參數(shù) 上下文和文件名 
  2.     MusicPlayer player = new MusicPlayer(this, "resources/rawfile/open.mp3"); 
  3.     player.play(); 

以上的就能實(shí)現(xiàn)播放了,下面還有一些其他的方法。

  1. public void dispose() // 清理 
  2.     public void setLooping(boolean isLooping) // 是否循環(huán) 
  3.     public void setVolume(float volume) // 設(shè)定音量 
  4.     ... 

 通過短音效編曲

從SoundManager中導(dǎo)入多段音頻,快速播放達(dá)成音效的效果。

  1. SoundManager manager = new SoundManager(this, 5); 
  2.   manager.addSound("resources/rawfile/media/1.mid"); 
  3.   manager.addSound("resources/rawfile/media/2.mid"); 
  4.   SoundPlayer player = new SoundPlayer(manager, 500, 16); 
  5.   player.addSound("resources/rawfile/media/1.mid"); 
  6.   player.addSound("resources/rawfile/media/2.mid"); 
  7.   ...  

使用player.play();進(jìn)行播放。

使用網(wǎng)絡(luò)

網(wǎng)絡(luò)的使用可參考JustWe-WebServer中的介紹。

按照介紹操作就可以通過:

  1. server.apply("/lfk", new OnWebStringResult() { 
  2.     @Override 
  3.     public String OnResult() { 
  4.         return "======="
  5.     } 
  6. }); 
  7.  
  8. server.apply("/main", new OnWebFileResult() { 
  9.     @Override 
  10.     public File returnFile() { 
  11.         return new File(WebServerDefault.WebServerFiles+"/"+"welcome.html"); 
  12.     } 
  13. }); 

這樣的簡單方式綁定路由,而get/post數(shù)據(jù)可以直接使用http協(xié)議的get和post進(jìn)行。

使用狀態(tài)機(jī)精靈

  1. // 為狀態(tài)機(jī)添加一個(gè)任務(wù) 
  2. sprite.addState(new StateFinder() { 
  3.     @Override 
  4.     public boolean isContent(BaseSub baseSub) { 
  5.         return Math.abs(zom.s_position.x - baseSub.s_position.x) > 50; 
  6.     } 
  7. }, new FrameAnimation(0, 63, 1)); 

可以通過上述的addState方法為狀態(tài)機(jī)精靈添加一個(gè)任務(wù),只有當(dāng)?shù)谝粋€(gè)參數(shù)接口回調(diào)的返回值為真的時(shí)候,

才會(huì)去運(yùn)行第二個(gè)參數(shù)提供的指令,如果返回為假則會(huì)運(yùn)行第二項(xiàng)狀態(tài)的判斷。

狀態(tài)的優(yōu)先級(jí)由加入順序提供。

CrashHandler崩潰守護(hù)

CrashHandler用于處理游戲的意外崩潰事件,初始化推薦在Application中進(jìn)行。

CrashHandler可以自動(dòng)保存機(jī)型和異常日志,以便讓開發(fā)者找到問題所在。

  1. CrashHandler.getInstance().init(this); 

使用以上語句即可自動(dòng)保存錯(cuò)誤日志。

還可以:

  1. CrashHandler.getInstance().setRestartActivity(MainActivity.class); // 重啟的Activity 
  2.    // 添加崩潰回調(diào) 
  3.    CrashHandler.getInstance().addCrashListener(new AfterCrashListener() { 
  4.        @Override 
  5.        public void AfterCrash() {  // 設(shè)定保存項(xiàng)目 
  6.            ... 
  7.        } 
  8.    });     

使用藍(lán)牙

開啟、關(guān)閉服務(wù)

使用藍(lán)牙需要新建BlueToothServer對(duì)象,傳入上下文和MessageBack接口。

  1.       blueToothServer = new BlueToothServer(this, new OnMessageBack() { 
  2.           @Override 
  3.           public void getMessage(String msg) { 
  4.               Log.e("L", msg); 
  5.           } 
  6.  
  7.           @Override 
  8.           public void sendMessage(String msg) { 
  9.               Log.e("L", msg); 
  10.           } 
  11.  
  12.           @Override 
  13.           public void getDevice(ArrayList<String> msg) { 
  14.               Log.e("L", msg.size() + ""); 
  15.           } 
  16.       }); 
  17.  
  18. // 使用如下語句進(jìn)行初始化 
  19.       blueToothServer.init(); 

服務(wù)初始化之后如未打開藍(lán)牙,系統(tǒng)會(huì)自動(dòng)提示應(yīng)用要求藍(lán)牙開啟。

通過MessageBack接口可以接收到發(fā)送、接收、以及掃描設(shè)備信息,采取對(duì)應(yīng)操作就可以獲得數(shù)據(jù)。

關(guān)閉服務(wù)時(shí)請(qǐng)使用blueToothServer.unBindService();關(guān)閉服務(wù)。

掃描設(shè)備

使用blueToothServer.doDiscovery();進(jìn)行設(shè)備掃描,返回結(jié)果在OnMessageBack()接口的

getDevice()方法接收。

使用blueToothServer.ensureDiscoverable();允許被掃描。

使用blueToothServer.getPairedDevices();返回已配對(duì)的設(shè)備列表。

發(fā)送消息

在配對(duì)成功之后就可以使用blueToothServer.sendMessage(String msg);發(fā)送消息了。

同時(shí),消息的接收也可以從getMessage()接口中獲得。

SQLite數(shù)據(jù)庫

SQLite使用了IOC的模式。

創(chuàng)建表

新建的創(chuàng)建表需要繼承Node并且寫出注解類。

  1. // 表名 
  2. @TableName(tableName = "lfkdsk"
  3. public class User extends Node { 
  4.  
  5. // 主鍵自增 INTEGER型 
  6.    @LabelName(autoincrement = true
  7.            type = LabelName.Type.INTEGER
  8.            columnName = "name"
  9.            generatedId = true
  10.    private int name
  11.  
  12. // TEXT型 欄名為user_name 
  13.    @LabelName(type = LabelName.Type.TEXT, 
  14.            columnName = "user_name"
  15.    private String user_name; 
  16.  
  17. // 自增主鍵所以只需要提供其他信息 
  18.    public User(String user_name) { 
  19.        super(user_name); 
  20.        this.user_name = user_name; 
  21.    } 
  22.  
  23.    public User(int name, String user_name) { 
  24.        super(name, user_name); 
  25.        this.name = name
  26.        this.user_name = user_name; 
  27.    } 
  28.  
  29.    public int getName() { 
  30.        return name
  31.    } 
  32.  
  33.    public void setName(int name) { 
  34.        this.name = name
  35.    } 
  36.  
  37.    public String getUser_name() { 
  38.        return user_name; 
  39.    } 
  40.  
  41.    public void setUser_name(String user_name) { 
  42.        this.user_name = user_name; 
  43.    } 
  1. // 通過這種方式獲取數(shù)據(jù)庫   表名 
  2.     private DataBase dataBase = DataBase.initAndOpen("user"User.class); 

增刪查改

  1. // add 
  2.     database.insert(User user); 
  3.     // find 
  4.     database.get(int position); 
  5.     // delete 
  6.     database.delete(int position); 
  7.     // update 
  8.     database.update(User user); 
  9.     ... 

相關(guān)資料

項(xiàng)目地址:https://gitee.com/openneusoft/just-we-engine

IDE官方下載地址:https://developer.harmonyos.com/cn/develop/deveco-studio

想了解更多內(nèi)容,請(qǐng)?jiān)L問:

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

 

責(zé)任編輯:jianghua 來源: 鴻蒙社區(qū)
相關(guān)推薦

2021-03-10 15:03:40

鴻蒙HarmonyOS應(yīng)用

2021-04-29 14:32:24

鴻蒙HarmonyOS應(yīng)用

2021-03-24 09:30:49

鴻蒙HarmonyOS應(yīng)用

2021-08-26 16:07:46

鴻蒙HarmonyOS應(yīng)用

2021-03-01 14:00:11

鴻蒙HarmonyOS應(yīng)用

2021-03-03 09:42:26

鴻蒙HarmonyOS圖片裁剪

2021-04-20 15:06:42

鴻蒙HarmonyOS應(yīng)用

2021-08-30 17:55:58

鴻蒙HarmonyOS應(yīng)用

2021-07-06 18:21:31

鴻蒙HarmonyOS應(yīng)用

2021-08-05 15:06:30

鴻蒙HarmonyOS應(yīng)用

2021-04-08 14:57:52

鴻蒙HarmonyOS應(yīng)用

2021-01-27 10:04:46

鴻蒙HarmonyOS動(dòng)畫

2021-11-02 14:54:21

鴻蒙HarmonyOS應(yīng)用

2021-11-17 15:37:43

鴻蒙HarmonyOS應(yīng)用

2021-07-20 15:20:40

鴻蒙HarmonyOS應(yīng)用

2021-04-15 17:47:38

鴻蒙HarmonyOS應(yīng)用

2017-12-11 15:53:56

2021-03-12 16:35:33

鴻蒙HarmonyOS應(yīng)用

2015-11-05 16:44:37

第三方登陸android源碼

2021-08-10 15:23:08

鴻蒙HarmonyOS應(yīng)用
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

成人美女视频在线观看18| 国产精品久久久久无码av| 亚洲第一激情av| 精品国产乱码久久久久久蜜柚| 日本天堂网在线观看| 秋霞影视一区二区三区| 欧美性欧美巨大黑白大战| 在线观看亚洲视频啊啊啊啊| 亚洲va久久久噜噜噜无码久久| 亚洲大片av| 在线播放日韩精品| 熟妇女人妻丰满少妇中文字幕| 丰满的护士2在线观看高清| 91色在线porny| 国产精品男人的天堂| 999福利视频| 麻豆一区一区三区四区| 色综合色综合色综合| 免费看啪啪网站| 亚洲欧洲视频在线观看| 久久精品国产久精国产爱| 久久97久久97精品免视看| 在线免费观看日韩av| 综合欧美精品| 日本黄色一区二区| 无码人妻精品一区二区蜜桃百度| 青青国产在线| 国产丶欧美丶日本不卡视频| 国产不卡在线观看| 麻豆一区二区三区精品视频| 日韩综合一区| 亚洲欧美激情在线视频| 特种兵之深入敌后| 91九色综合| 欧美午夜视频一区二区| 国产又粗又爽又黄的视频| 欧美拍拍视频| 成人av在线观| 亚洲在线免费看| 日本视频网站在线观看| 欧美精品色网| 久久伊人精品天天| 精品一区二区三孕妇视频| 欧美91在线| 精品国内片67194| 欧美视频国产视频| 国产成人精品一区二区三区免费| 欧美性猛交xxxx免费看| 欧美精品卡一卡二| 老司机在线看片网av| 国产拍欧美日韩视频二区| 久久免费一区| 手机福利小视频在线播放| 国产美女娇喘av呻吟久久| 国产日韩欧美在线看| 波多野结衣大片| 久久激情视频| 国产91色在线| 岛国av中文字幕| 日韩精品一卡二卡三卡四卡无卡| 欧美精品videossex88| 中文字幕第69页| 五月激情综合| 久热精品视频在线观看| 婷婷社区五月天| 国产精品99久久| 久久亚洲电影天堂| www.99re7| 午夜国产精品视频免费体验区| 日韩专区中文字幕| 黄色一级大片在线免费观看| 色男人天堂综合再现| 日韩在线小视频| 91视频最新网址| 欧美成人69| 97精品免费视频| 九九精品免费视频| 毛片基地黄久久久久久天堂| 国产色综合天天综合网| 精品国产999久久久免费| 成人毛片在线观看| 欧美日韩一区在线观看视频| 阿v免费在线观看| 国产精品国产馆在线真实露脸 | 老司机aⅴ在线精品导航| 亚洲国产精品成人一区二区| 色欲av无码一区二区三区| 亚州男人的天堂| 91色porny蝌蚪| 色噜噜色狠狠狠狠狠综合色一| 91精品国产91久久久久游泳池| 中文字幕在线一区免费| 狠狠噜天天噜日日噜| 国产精品蜜芽在线观看| 欧美亚洲综合在线| 樱花草www在线| 久久香蕉网站| 在线视频免费一区二区| 亚洲熟女www一区二区三区| 激情六月综合| 国产精品久久久久久久久借妻 | 欧美日韩亚洲一区二| 成人在线观看黄| 久久久久黄色| 欧美一级久久久久久久大片| 成人做爰69片免费| 香蕉一区二区| 亚洲男人天堂2023| 亚洲一级生活片| 亚洲理伦在线| 国产精自产拍久久久久久蜜| 国产伦一区二区| 99精品欧美一区二区蜜桃免费| 欧美精品成人一区二区在线观看| 1024国产在线| 亚洲成a人v欧美综合天堂下载| 国产最新免费视频| 国产麻豆一区二区三区| 亚洲激情中文字幕| 蜜桃av免费在线观看| 欧美午夜不卡| 国产成人在线一区二区| 99国产在线播放| 国产成人福利片| 亚洲最大免费| 在线能看的av网址| 337p亚洲精品色噜噜狠狠| 黄色国产在线视频| 日韩精品中文字幕第1页| 欧美极品少妇xxxxⅹ裸体艺术| 五月天激情四射| 激情综合网最新| 色播亚洲婷婷| 182在线视频观看| 欧美久久高跟鞋激| av鲁丝一区鲁丝二区鲁丝三区| 欧美第十八页| 青青在线视频一区二区三区| 国产精品无码久久av| 91蜜桃在线免费视频| 日韩国产成人无码av毛片| 色成人免费网站| 亚洲的天堂在线中文字幕| 久久人妻无码aⅴ毛片a片app| 亚洲东热激情| 999视频在线观看| 超碰在线影院| 五月天视频一区| 一级黄色片毛片| 亚洲国产精品成人| 国产精品羞羞答答| 国产三级在线| 欧美色欧美亚洲高清在线视频| 成年人看片网站| 欧美高清一区| 99在线观看| 国产激情在线视频| 欧美日韩不卡在线| 日本一二三不卡视频| 久久精品二区三区| 蜜桃成人免费视频| 波多野结衣在线观看| 亚洲成人黄色在线观看| 青青草成人免费| 国产精品亚洲а∨天堂免在线| 亚洲国产精品一区二区第四页av| 欧美成人影院| 亚洲欧洲一区二区三区在线观看 | 亚洲国产日韩av| 美女流白浆视频| 综合激情一区| 91免费看片网站| 美女羞羞视频在线观看| 欧美日韩国产欧美日美国产精品| 国产真实乱人偷精品人妻| 亚洲永久网站| 茄子视频成人在线观看| 日本成人三级电影| 精品伊人久久97| 日韩久久久久久久久久| 中文字幕免费在线观看视频一区| 精品久久久久av| 欧洲杯半决赛直播| 国产原创欧美精品| a级在线观看| 日韩欧美国产电影| 成人午夜淫片100集| 久久久久9999亚洲精品| 牛夜精品久久久久久久| 欧美丰满老妇| 99久久精品久久久久久ai换脸| 色呦呦在线播放| 日韩丝袜美女视频| aaa人片在线| 国产欧美日韩中文久久| 免费一区二区三区在线观看| 五月精品视频| 99在线影院| 无遮挡在线观看| 播播国产欧美激情| 黄色小视频免费观看| 精品高清一区二区三区| 潮喷失禁大喷水aⅴ无码| 国产在线精品一区二区夜色| 精品国产三级a∨在线| 亚洲精品**不卡在线播he| 国产精品一区二区三区久久| 最新国产露脸在线观看| 国产视频一区在线| 一级全黄少妇性色生活片| 亚洲资源在线观看| 一起草在线视频| 国产一区二区成人久久免费影院 | 午夜精品福利在线观看| 国产视频网址在线| 欧美一区二区三区免费观看视频| 日韩免费视频一区二区视频在线观看| 中文文精品字幕一区二区| 日本少妇激三级做爰在线| 国产精品激情| 四虎一区二区| 精品三级av| 成人性生交大片免费看视频直播| 精精国产xxxx视频在线播放| www.日韩不卡电影av| 天堂中文网在线| 8v天堂国产在线一区二区| 成年免费在线观看| 青青草成人在线观看| 黄瓜视频免费观看在线观看www| 成人av影音| 国产精品亚洲视频在线观看| 欧美1—12sexvideos| 伊人久久免费视频| 姝姝窝人体www聚色窝| 欧美久久久久久久久中文字幕| 天天综合天天干| 综合av第一页| 天天干天天操天天拍| 99久久精品国产导航| 中文字幕12页| 日韩在线一区二区| 国产午夜福利视频在线观看| 欧美网站在线| 成人在线免费观看网址| 精品日韩免费| 麻豆精品传媒视频| 欧美做受69| 国产另类第一区| 日韩在线观看中文字幕| 国产激情久久久| 欧美黑人巨大xxxxx| 欧美激情免费视频| 爱情岛论坛亚洲品质自拍视频网站| 色偷偷av一区二区三区乱| 国产一级免费在线观看| 亚洲欧美日韩网| 性感美女视频一二三| 亚洲国产精彩中文乱码av| 五月婷婷狠狠干| 亚洲国产精品久久精品怡红院| 999av视频| 日韩精品一区国产麻豆| 99久久夜色精品国产亚洲| 制服丝袜一区二区三区| 91免费视频播放| 欧美一区二区三区视频在线| 一卡二卡三卡在线| 欧美日韩中文字幕一区| 中文字幕人妻互换av久久| 日本电影亚洲天堂一区| 国产精品国产精品国产| 欧美另类z0zxhd电影| 一区二区三区播放| 9191国产精品| 国内毛片毛片毛片毛片| 欧美成人vr18sexvr| 国产精品呻吟久久| 精品久久久久久久久久久久久久久久久 | 国产午夜亚洲精品理论片色戒 | 成人亚洲欧美| 青青a在线精品免费观看| www成人在线视频| 国产综合久久久久| 国产精品欧美一区二区三区不卡| 99国产视频| 欧美a一欧美| 一区二区三区四区免费视频| 天天射成人网| 黄色一级大片免费| 一级成人国产| 免费一级特黄录像| 麻豆精品国产传媒mv男同| 自拍偷拍激情视频| 97久久久精品综合88久久| 91久久免费视频| 亚洲视频在线一区观看| 精品少妇theporn| 一本大道久久精品懂色aⅴ| 中国女人真人一级毛片| 欧美日韩国产综合一区二区三区| 国产精品人人妻人人爽| 亚洲国产婷婷香蕉久久久久久| 青青草视频免费在线观看| 亚洲人午夜色婷婷| yellow91字幕网在线| 97精品伊人久久久大香线蕉| 最新日韩三级| 99高清视频有精品视频| 亚洲人和日本人hd| 亚洲一一在线| 黄色成人av网站| 中文字幕第80页| 国产成人午夜视频| 91成年人网站| 亚洲黄一区二区三区| 六月丁香婷婷综合| 51精品秘密在线观看| 四虎影视精品成人| 欧美精品做受xxx性少妇| 欧美日韩精品免费观看视完整| 51成人做爰www免费看网站| 日韩电影不卡一区| 中文字幕欧美日韩一区二区| 精品白丝av| 久久久精品麻豆| 久久久久99精品一区| 精品一级少妇久久久久久久| 欧美性极品少妇| 日本免费一区视频| 夜夜嗨av一区二区三区四区| 狠狠操一区二区三区| 91精品久久久久久久久| 性欧美lx╳lx╳| 久久在线中文字幕| 日韩高清不卡一区| 少妇精品一区二区三区| 亚洲一区二区视频在线观看| 中文字幕+乱码+中文字幕明步| 亚洲电影免费观看高清完整版在线观看| a黄色在线观看| 国产精品美女无圣光视频| 老司机aⅴ在线精品导航| 肉大捧一出免费观看网站在线播放 | 免费观看在线综合| 日本成人免费视频| 精品国产乱码久久久久酒店| 国产日韩欧美一区二区东京热| 在线电影欧美日韩一区二区私密| 在线观看男女av免费网址| 91成人免费看| 一区二区免费不卡在线| 三上悠亚在线一区二区| 久久久av毛片精品| 日韩大片免费在线观看| 亚洲国产美女精品久久久久∴| 中文字幕资源网在线观看| 国产狼人综合免费视频| 欧美一区电影| 老熟妇仑乱视频一区二区| 久久久久综合网| 成人毛片在线播放| 亚洲欧美日韩一区二区在线| av手机在线观看| 国产精品高清一区二区三区| 亚洲三级网站| 少妇精品一区二区| 欧美午夜宅男影院在线观看| 天天干天天摸天天操| 日韩美女毛茸茸| 欧美日韩精品一区二区视频| 波多野结衣天堂| 国产精品久久毛片av大全日韩| 97成人免费视频| 欧美成人免费在线观看| 中文字幕视频精品一区二区三区| xxxxxx在线观看| 成人中文字幕在线| www.国产毛片| 中文字幕日本精品| 高清在线一区二区| 18禁裸男晨勃露j毛免费观看| 91色乱码一区二区三区| 日韩乱码一区二区三区| 色久欧美在线视频观看| 国产亚洲高清一区| 精品少妇一区二区三区在线| 91麻豆精品一区二区三区| 黄色在线免费观看| 中文国产成人精品| 久久精品一级| 波多野结衣作品集| 1区2区3区国产精品| 精品人妻一区二区三区麻豆91 | 欧美三级在线看| 日韩在线资源| 精品免费一区二区三区蜜桃| 久久福利一区| 亚洲女人毛茸茸高潮| 欧美mv日韩mv国产|