一個「冷」知識,又雙叒叕到一年七夕了!android
每一年此時,送禮指南滿天飛,選擇困難症都給逼出來了,疑了個惑,能搞定愛情的人,卻在送禮這件事兒上糾結萬分! 要我說,七夕這種有情人的浪漫佳節,最重要的是圖一個氛圍!今天給你們介紹一個適合程序員的七夕「氛圍感十足」的小禮物——藉助華爲圖像服務,開發個超有愛七夕動圖,它支持輸入特殊關鍵詞,觸發「七夕」特效;同時,畫面還可跟隨指尖觸碰產生動效……效果先睹爲快↓↓↓git
有對象的秀給對象看,單身的朋友也可先作個七夕氛圍組成員,方法到手,也許下次就用上啦。程序員
話很少說,開整!github
首先找到一個合適的圖片,這裏咱們選擇了一張牛郎織女的圖片:json
而後將其中有動畫效果的部件從圖中取出來。咱們取出了雲朵,牛郎,織女,紅心四個元素。數組
先按照下面的指導完成開發者註冊,建立應用,簽名配置: developer.huawei.com/consumer/cn…markdown
再按照以下方式進行代碼倉和編譯依賴的配置:app
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/'}
}
}
複製代碼
dependencies {
implementation 'com.huawei.hms:image-render: 1.0.3.301'
implementation 'com.huawei.hms:image-render-fallback: 1.0.3.301'
}
複製代碼
在「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"/>
複製代碼
這裏用最簡單的界面,一個FrameLayout中配置輸入框和按鈕:dom
咱們將在這個FrameLayout中調試和展示動畫。
在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();
}
}
}
複製代碼
獲取渲染實例,初始化,並獲取渲染視圖。 這裏會指定動畫元素的目錄:
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) {
...
}
});
複製代碼
還記得前面留下的輸入框和按鈕嗎?咱們使用關鍵字「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();
}
});
複製代碼
框架搭好了,如今來到動畫的部分。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>
複製代碼
// 開始錄製
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還提供了濾鏡功能,能夠給圖片添上浪漫的色彩,貼紙花字的功能,也能夠給用戶的圖片增長愛情的元素。
瞭解更多>>
訪問華爲圖像服務官網
獲取開發指導文檔
關注咱們,第一時間瞭解** HMS Core **最新技術資訊~