前言

众所周知,微信聊天中我们输入一些关键词会有表情雨下落,比如输入「生日快乐」「么么哒」会有相应的蛋糕、亲吻的表情雨下落,今天就来完成这个表情雨下落的效果。下面话不多说了,来一起看看详细的介绍吧

效果图

先来看下效果,真·狗头雨·落!

实现代码

确认表情的模型,定义属性

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 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();

}

布局文件

android:layout_width="match_parent"

android:layout_height="match_parent">

android:id="@+id/testView"

android:layout_width="match_parent"

android:layout_height="match_parent" />

android:id="@+id/btn_dog"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignParentBottom="true"

android:text="真·狗头雨·落!" />

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="蛋糕雨" />

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);

}

});

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

java实现物体下落效果_android仿微信表情雨下落效果的实现方法相关推荐

  1. android 仿微信表情雨下落!

    众所周知,微信聊天中我们输入一些关键词会有表情雨下落,比如输入「生日快乐」「么么哒」会有相应的蛋糕.亲吻的表情雨下落,今天就来完成这个表情雨下落的效果.    先来看下效果,真·狗头雨·落! 确认表情 ...

  2. android 按钮回弹效果,Android仿IOS回弹效果 支持任何控件

    本文实例为大家分享了Android仿IOS回弹效果的具体代码,供大家参考,具体内容如下 效果图: 导入依赖: dependencies { // ... compile 'me.everything: ...

  3. java如何实现qq分组_Android仿QQ好友列表分组实现增删改及持久化

    Android自带的控件ExpandableListView实现了分组列表功能,本案例在此基础上进行优化,为此控件添加增删改分组及子项的功能,以及列表数据的持久化. Demo实现效果: GroupLi ...

  4. android开发歌词滑动效果_Android 歌词同步滚动效果

    歌词是播放器类App必不可少的组件,而一般的歌词组件都需要做到歌词的显示与播放进度同步.我们知道,歌词是如下所示的文件: lrc [ti:原来爱情这么伤] [ar:梁咏琪] [al:给自己的情歌] [ ...

  5. 安卓java 模拟点击类_Android模拟用户点击的实现方法

    前言 Android模拟用户点击.在自动化测试中可使用的工具. 可以利用adb命令,也可以使用Android SDK中的monkeyrunner工具. win7-64 gitbash 使用adb命令 ...

  6. 支付宝首页搜索栏淡出效果HTML,仿支付宝首页效果实现

    但是我跟参考资料中作者关于整个页面的设计逻辑不一致, 但是实现的效果一样, 也算是多一种实现方式, 希望跟大家一起共同学习. 先上效果 效果图.gif 整个界面的结构图 结构图.png 关于整个页面布 ...

  7. java实现物体下落效果_手撸一个物体下落的控件,实现雪花飘落效果

    效果图: 圣诞登录页.gif 参考文章: Android自定义View--从零开始实现雪花飘落效果 感谢原文作者,不仅实现了效果,并且写得非常详细,还做了优化.笔者参考原文作者的源码,做了一点修改,实 ...

  8. java实现钢琴颜色改变_Android 拨号盘按键音修改为钢琴音效果实现

    1. 准备好对应的音源文件. 这里以ogg格式的音频文件为例.从数字0-9,* # 总共需要12个ogg音源文件.放在raw文件夹下备用. 2. 修改代码逻辑,主要在Dialer模块的DialpadF ...

  9. [纪录]仿IOS滚轮效果(竖直滑动选择器)

    今天想做一个类似这样的一个效果,可是UI的模板是参考IOS做的,于是就各种百度各种搜,最后让我找到了一个仿IOS滚轮的一个Demo,稍微研究了一下,发上来,大家一起学习,以后也方便我查看,就不用再去百 ...

  10. android仿微信图片上传进度,Android开发之模仿微信打开网页的进度条效果(高仿)...

    一,为什么说是真正的高仿? 阐述这个问题前,先说下之前网上的,各位可以复制这段字,去百度一下  "仿微信打开网页的进度条效果",你会看到有很多类似的文章,不过他们有个共同点,就是实 ...

最新文章

  1. mysql同时满足升序和降序_MySQL性能优化(三):索引
  2. Visual Studio 2017 针对移动开发的新特性介绍
  3. 就你这个求婚态度,能嫁给你才怪!
  4. Struts2的控制器(Controller)的工作流程图
  5. linux awk入门,awk入门应用
  6. Spring Cloud笔记-eureka及openfeign基本使用
  7. 统一元数据,数据湖Catalog让大数据存算分离不再是问题
  8. 方维分享系统,品牌无法设置分类关联
  9. 利用pushState开发无刷页面切换
  10. 华硕Z77系列主板怎么进行超频设置?
  11. 中国新一代超级安全核燃料材料入堆辐照试验开始
  12. Oracle中如何记录访问数据库的登录信息?
  13. 经典 Fuzzer 工具 AFL 模糊测试指南
  14. Web---HTML标签总结
  15. 微信小程序实现转盘抽奖
  16. 小桥加加的英语学习博客
  17. 宏观经济学-试卷1-安徽大学
  18. Markdomn学习
  19. 红外循迹模块TCRT5000 驱动
  20. ipad pro python xcode_从命令行启动Xcode模拟器

热门文章

  1. 北大先修课 计算机,北大先修课
  2. java mp3合并_java合并MP3文件
  3. 微信圣诞头像来了,快给你的头像带上圣诞帽吧
  4. 类型多样的游戏模型3d模型素材,速来收藏
  5. 中国城市轨道交通与设备产业十四五建设规划与运营模式咨询报告2022-2028年
  6. KVM切换器如何选购
  7. 什么是计算机网络AP,AP与AC的区别是什么,拓扑网络知识。
  8. Mybatis之错误:Invalid bound statement (not found)
  9. 相机技术--摄像机720p、1080p、2mp、3mp、5mp;VGA, QHD, FHD, 2K,4K对应的分辨率分别是什么
  10. quartus中与modelsim进行联合仿真出现错误error:(vopt-13130)failed to find design unit****