如何用程序員的方式,營造七夕氛圍感?

一個「冷」知識,又雙叒叕到一年七夕了!android

每一年此時,送禮指南滿天飛,選擇困難症都給逼出來了,疑了個惑,能搞定愛情的人,卻在送禮這件事兒上糾結萬分! 要我說,七夕這種有情人的浪漫佳節,最重要的是圖一個氛圍!今天給你們介紹一個適合程序員的七夕「氛圍感十足」的小禮物——藉助華爲圖像服務,開發個超有愛七夕動圖,它支持輸入特殊關鍵詞,觸發「七夕」特效;同時,畫面還可跟隨指尖觸碰產生動效……效果先睹爲快↓↓↓git

Demo效果

有對象的秀給對象看,單身的朋友也可先作個七夕氛圍組成員,方法到手,也許下次就用上啦。程序員

話很少說,開整!github

開發步驟

1. 關鍵字動畫播放

第一步:素材準備

首先找到一個合適的圖片,這裏咱們選擇了一張牛郎織女的圖片:json

而後將其中有動畫效果的部件從圖中取出來。咱們取出了雲朵,牛郎,織女,紅心四個元素。數組

第二步:集成準備

先按照下面的指導完成開發者註冊,建立應用,簽名配置: developer.huawei.com/consumer/cn…markdown

再按照以下方式進行代碼倉和編譯依賴的配置:app

  1. 在項目級「build.gradle」文件中配置:
buildscript {
    repositories {
        google()
        jcenter()
        // 配置HMS Core SDK的Maven倉地址。
        maven {url 'https://developer.huawei.com/repo/'}
    }
    dependencies {
        ...
        // 增長agcp插件配置。
        classpath 'com.huawei.agconnect:agcp:1.4.2.300'
    }
}

allprojects {
    repositories {
        google()
        jcenter()
        // 配置HMS Core SDK的Maven倉地址。
        maven {url 'https://developer.huawei.com/repo/'}
    }
}
複製代碼
  1. 在應用級「build.gradle」文件配置編譯依賴(當前最新版本1.0.3.301):
dependencies { 
implementation 'com.huawei.hms:image-render: 1.0.3.301' 
  implementation 'com.huawei.hms:image-render-fallback: 1.0.3.301'
}
複製代碼
  1. 配置權限

在「AndroidManifest.xml」文件中配置應用所需權限。框架

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
複製代碼

第三步:功能開發

  1. 界面設計

這裏用最簡單的界面,一個FrameLayout中配置輸入框和按鈕:dom

咱們將在這個FrameLayout中調試和展示動畫。

  1. 配置存儲權限申請

在MainActivity的onCreate()方法中,檢查是否擁有寫存儲的權限,若是缺乏,就調用requestPermission方法,對WRITE_EXTERNAL_STORAGE權限進行申請:

int permissionCheck = ContextCompat.checkSelfPermission(ImageKitRenderDemoActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
if (permissionCheck == PackageManager.PERMISSION_GRANTED) {
initData();
initImageRender();
} else {
ActivityCompat.requestPermissions(ImageKitRenderDemoActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, PERMISSION_REQUEST_CODE);
}
複製代碼

若是已有權限,或權限申請成功後,對Image渲染模塊進行初始化

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    if (requestCode == PERMISSION_REQUEST_CODE) {
        if (grantResults.length > 0
                && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // The permission is granted.
            initData();
            initImageRender();
        } else {
            // The permission is rejected.
            Log.w(TAG, "permission denied");
            Toast.makeText(ImageKitRenderDemoActivity.this, "Please grant the app the permission to read the SD card", Toast.LENGTH_SHORT).show();
        }
    }
}
複製代碼
  1. Image渲染模塊初始化

獲取渲染實例,初始化,並獲取渲染視圖。 這裏會指定動畫元素的目錄:

ImageRender.getInstance(context, new ImageRender.RenderCallBack() {
        // 獲取場景動效服務實例成功回調,返回場景動效服務實例
        @Override
        public void onSuccess(ImageRenderImpl imageRender) {
            imageRenderAPI = imageRender;
            if (imageRenderAPI != null) {
                int initResult = imageRenderAPI.doInit(sourcePath, Utils.getAuthJson());
                Log.i(TAG, "DoInit result == " + initResult);
                if (initResult == 0) {
                    // Obtain the rendered view.
                    RenderView renderView = imageRenderAPI.getRenderView();
                    if (renderView.getResultCode() == ResultCode.SUCCEED) {
                        View view = renderView.getView();
                        if (null != view) {
                            // Add the rendered view to the layout.
                            contentView.addView(view);
                            hashCode = String.valueOf(view.hashCode());
                        } else {
                            Log.w(TAG, "GetRenderView fail, view is null");
                        }
            }
        }
        // 獲取場景動效服務實例失敗回調,返回錯誤碼
        @Override
        public void onFailure(int errorCode) {
        ...
        }
    });
複製代碼
  1. 配置關鍵字播放動畫

還記得前面留下的輸入框和按鈕嗎?咱們使用關鍵字「Love」來進行動畫播放。只須要經過imageRenderAPI.playAnimation()便可觸發:

wordInput = findViewById(R.id.textinput);
enterBtn = findViewById(R.id.enter);
enterBtn.setOnClickListener(v -> {
    String inputContent = wordInput.getText().toString();
    if (inputContent.contentEquals("Love")) {
        if (null != imageRenderAPI) {
            imageRenderAPI. playAnimation();;
            wordInput.setVisibility(View.GONE);
            enterBtn.setVisibility(View.GONE);
        }
    } else {
        Toast.makeText(this,"再想一想?",Toast.LENGTH_SHORT).show();
    }
});
複製代碼
  1. 配置動畫

框架搭好了,如今來到動畫的部分。Image Kit提供了5種基礎動效和9種高級動效,能夠知足絕大部分場景的使用要求。 在這裏咱們使用到了透明度動畫,位移動畫,縮放動畫,以及下落動效。

Image Kit的動畫配置均在manifest.xml文件中完成。可不要和AndroidManifest.xml文件搞混了哦。

首先配置虛擬屏寬及背景圖片。配置虛擬屏寬以後,系統會根據不一樣的分辨率對動畫進行縮放,使效果保持一致。

<Root screenWidth="1080">
<Image src="background.png"/>
複製代碼

咱們但願牛郎織女可以逐漸靠近直至相會,此時加入牛郎織女兩個元素,分別配置動線,此時使用到位移動畫的特效:

<Image x="1000" y="1450" src="man.png">
       <PositionAnimation repeat="1">
           <Position x="0" y="0" time="0"/>
           <Position x="-450" y="-100" time="4000"/>
       </PositionAnimation>
    </Image>
    <Image x="-600" y="800" src="woman.png">
        <PositionAnimation repeat="1">
            <Position x="0" y="0" time="0"/>
            <Position x="700" y="300" time="4000"/>
        </PositionAnimation>
    </Image>
複製代碼

這樣牛郎織女將從屏幕兩側向中間靠近,直至相會。

相會以後在中心將出現跳動的紅心,這裏用到了透明度動畫及縮放動畫的疊加特效:

<Image x="520" y="1350"  src="heart.png" visibility="#show1">
        <AlphaAnimation delay="4000" repeat="1">
            <Alpha a="255" time="0"/>
            <Alpha a="0" time="3000"/>
        </AlphaAnimation>
        <SizeAnimation delay="4000" repeat="1">
            <Size w="127" h="95" time="0"/>
            <Size w="508" h="380" time="3000"/>
        </SizeAnimation>
    </Image>
複製代碼

到如今,關鍵元素已經有了,但是看起來仍是有點乾巴,要找點什麼點綴一下。 天上的雲朵也能夠動起來,讓它在小範圍裏動一下更靈動一些:

<Image x="150" y="200" src="cloud.png">
        <PositionAnimation repeat="0">
            <Position x="0" y="0" time="0"/>
            <Position x="-50" y="0" time="3000"/>
            <Position x="0" y="0" time="6000"/>
        </PositionAnimation>
    </Image>
複製代碼

想再羅曼蒂克一些,撒一些花瓣,這裏用到的就是下落動效:

<DropPhysicalView gravityX="3" gravityY="10" airDensity="1000" delay="8800" visibility="#show2">
        <ItemGroup x="0" y="0" width="#screen_width" height="#screen_height">
            <Alpha x="0" y="#screen_height-1000" width="#screen_width" height="#screen_height" value="20"/>
            <Item count="20" src="follow.png">
                <Velocity isRandom="true" velocityX="0" velocityY="5"/>
                <Position isRandom="true"/>
                <AngleVelocity isRandom="true" angleVelocity="5"/>
                <Weight isRandom="true" value="0.5"/>
            </Item>
        </ItemGroup>
    </DropPhysicalView>
複製代碼
  1. 到這裏已經大功告成。最後能夠再將動畫保留下來
// 開始錄製
int resultCode = imageRenderAPI.startRecord(json, new IStreamCallBack () {
    // 在錄製成功回調中,將視頻或GIF字節數組保存成mp4或GIF文件
    @Override
    void onRecordSuccess(HashMap<String, Object> map) {
        ...
        String recordType = (String) hashMap.get("recordType");
        byte[] videoBytes = (byte[]) hashMap.get("videoBytes");
        byte[] gifBytes = (byte[]) hashMap.get("gifBytes");
        try {
            if (recordType.equals("1")) {
                if (videoBytes != null) {
                    // 保存mp4文件
                    saveFile(videoBytes, mp4Path);
                }
            } else if (recordType.equals("2")) {
                ...
            } else if (recordType.equals("3")) {
                ...
            }
        } catch (IOException e) {
            ...
        }
        ...
    }

    // 錄製失敗回調
    @Override
    void onRecordFailure(HashMap<String, Object> map) {
        ...
    }

    // 錄製進度回調,progress取值範圍爲0-100
    @Override
    void onProgress(int progress) {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                textProgress.setText("當前錄製進度:" + progress + "%");
            }
        });
    }
});

複製代碼

以上就獲得最終效果啦~

除了動效以外,Image Kit還提供了濾鏡功能,能夠給圖片添上浪漫的色彩,貼紙花字的功能,也能夠給用戶的圖片增長愛情的元素。

瞭解更多>>

訪問華爲圖像服務官網

訪問華爲開發者聯盟官網

獲取開發指導文檔

華爲移動服務開源倉庫地址:GitHubGitee

關注咱們,第一時間瞭解** HMS Core **最新技術資訊~

相關文章
相關標籤/搜索