android仿微信表情雨下落!
眾所周知,微信聊天中我們輸入一些關鍵詞會有表情雨下落,比如輸入「生日快樂」「麼麼噠」會有相應的蛋糕、親吻的表情雨下落,今天就來完成這個表情雨下落的效果。
先來看下效果,真·狗頭雨·落!
確認表情的模型,定義屬性
public class ItemEmoje {
//座標
public int x;
public int y;
// 橫向偏移
public int offsetX;
//縱向偏移
public int offsetY;
//縮放
public float scale;
//圖片資源
public Bitmap bitmap;
}
自定義RainView 表情下落檢視,初始化變數。
public class RainView extends View {
private Paint paint;
//圖片處理
private Matrix matrix;
private Random random;
//判斷是否執行的,預設沒有
private boolean isRun;
//表情包集合
private List<ItemEmoje> bitmapList;
//表情圖片
private int imgResId = R.mipmap.dog;
public RainView(Context context) {
this(context, null);
}
public RainView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public RainView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
paint = new Paint();
paint.setAntiAlias(true);
paint.setFilterBitmap(true);
paint.setDither(true);
matrix = new Matrix();
random = new Random();
bitmapList = new ArrayList<>();
}
}
初始化表情雨資料,確認每個表情的起始位置,下落過程中橫向、縱向的偏移,以及縮放大小。
private void initData() {
for (int i = 0; i < 20; i++) {
ItemEmoje itemEmoje = new ItemEmoje();
itemEmoje.bitmap = BitmapFactory.decodeResource(getResources(), imgResId);
//起始橫座標在[100,getWidth()-100) 之間
itemEmoje.x = random.nextInt(getWidth() - 200) + 100;
//起始縱座標在(-getHeight(),0] 之間,即一開始位於螢幕上方以外
itemEmoje.y = -random.nextInt(getHeight());
//橫向偏移[-2,2) ,即左右搖擺區間
itemEmoje.offsetX = random.nextInt(4) - 2;
//縱向固定下落12
itemEmoje.offsetY = 12;
//縮放比例[0.8,1.2) 之間
itemEmoje.scale = (float) (random.nextInt(40) + 80) / 100f;
bitmapList.add(itemEmoje);
}
}
下落過程通過 onDraw進行繪製,不斷的計算橫縱座標,達到下落效果。
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (isRun) {
//用於判斷表情下落結束,結束即不再進行重繪
boolean isInScreen = false;
for (int i = 0; i < bitmapList.size(); i++) {
matrix.reset();
//縮放
matrix.setScale(bitmapList.get(i).scale, bitmapList.get(i).scale);
//下落過程座標
bitmapList.get(i).x = bitmapList.get(i).x + bitmapList.get(i).offsetX;
bitmapList.get(i).y = bitmapList.get(i).y + bitmapList.get(i).offsetY;
if (bitmapList.get(i).y <= getHeight()) {//當表情仍在檢視內,則繼續重繪
isInScreen = true;
}
//位移
matrix.postTranslate(bitmapList.get(i).x, bitmapList.get(i).y);
canvas.drawBitmap(bitmapList.get(i).bitmap, matrix, paint);
}
if (isInScreen) {
postInvalidate();
}else {
release();
}
}
}
/**
*釋放資源
*/
private void release(){
if(bitmapList != null && bitmapList.size()>0){
for(ItemEmoje itemEmoje : bitmapList){
if(!itemEmoje.bitmap.isRecycled()){
itemEmoje.bitmap.recycle();
}
}
bitmapList.clear();
}
}
提供start() 方法觸發。
public void start(boolean isRun) {
this.isRun = isRun;
initData();
postInvalidate();
}
佈局檔案
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.rain.RainView
android:id="@+id/testView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<Button
android:id="@+id/btn_dog"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:text="真·狗頭雨·落!" />
<Button
android:id="@+id/btn_cake"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_marginLeft="10dp"
android:layout_toRightOf="@+id/btn_dog"
android:text="蛋糕雨" />
</RelativeLayout>
activity 點選事件觸發
btnCake.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//蛋糕圖片
rainView.setImgResId(R.mipmap.cake);
rainView.start(true);
}
});
btnDog.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//狗頭圖片
rainView.setImgResId(R.mipmap.dog);
rainView.start(true);
}
});
github地址:https://github.com/taixiang/rain_emoji
歡迎關注我的部落格:https://www.manjiexiang.cn/
更多精彩歡迎關注微訊號:春風十里不如認識你
一起學習,一起進步,有問題隨時聯絡,一起解決!!!
相關文章
- Android 仿微信, QQ 裁剪Android
- vue 高仿微信即時 IM 聊天|仿微信 vue+h5 版|仿微信介面VueH5
- Android 仿釘釘、微信 群聊組合頭像Android
- react-native 金幣綵帶雨下落動畫React動畫
- Android側滑返回分析和實現(不高仿微信)Android
- Android 仿微信的圖片選擇器ImageSelector的使用Android
- Android 仿微信/支付寶 字型大小 調整控制元件Android控制元件
- 微信小程式 表情小作坊 — 輕鬆定製表情包微信小程式
- MUKeyboard(仿微信鍵盤)
- Flutter 仿微信/微博九宮格Flutter
- nuxt.js仿微信App通訊聊天|vue+nuxt聊天|仿微信介面UXJSAPPVue
- electron+vue 仿微信客戶端聊天|electron 仿微信介面|electron 聊天例項Vue客戶端
- 微信表情符號寫入案件判決符號
- Svelte3-Chat:基於svelte+svelteKit+sass仿微信聊天例項|svelte仿微信
- Android仿微信圖片編輯——塗鴉框架Doodle(多功能畫板)Android框架
- 微信小程式仿微信, QQ 向左滑動刪除操作。微信小程式
- flutter 圖片檢視,仿微信Flutter
- 微信小程式-仿QQ音樂微信小程式
- 仿微信iOS相簿選擇 MTImagePickeriOS
- 【Android 動畫】動畫詳解之仿微信檢視大圖效果(四)Android動畫
- Android仿微信文章懸浮窗效果Android
- 小程式元件-仿微信通訊錄元件
- flutter仿微信底部圖示漸變Flutter
- 揭祕微信直銷高仿包包
- 東莞高仿包批發微信
- 運營級仿微信仿陌陌仿快手app原始碼出售轉讓APP原始碼
- Android 微信支付 微信是否安裝判斷Android
- Android高仿qq閱讀/微信讀書/掌閱高亮選擇文字效果Android
- 分享一個仿微信模擬器,可以快速模擬微信對話,微信紅包等。
- Android Studio微信頁面Android
- android微信分享、微信支付的一些坑Android
- 仿微信評論控制元件封裝控制元件封裝
- 基於Flutter的仿微信聊天應用Flutter
- 關於AS(Android studio)新增recyclerview控制元件後的進一步仿微信介面AndroidView控制元件
- Android 動畫實戰-仿微博雷達功能Android動畫
- 微信迎來8.0大更新 增加了表情包特效功能特效
- 仿頭條、微信大圖預覽檢視
- HarmonyOS 5.0應用開發——仿微信聊天介面