java实现物体下落效果_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 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仿微信表情雨下落效果的实现方法相关推荐
- android 仿微信表情雨下落!
众所周知,微信聊天中我们输入一些关键词会有表情雨下落,比如输入「生日快乐」「么么哒」会有相应的蛋糕.亲吻的表情雨下落,今天就来完成这个表情雨下落的效果. 先来看下效果,真·狗头雨·落! 确认表情 ...
- android 按钮回弹效果,Android仿IOS回弹效果 支持任何控件
本文实例为大家分享了Android仿IOS回弹效果的具体代码,供大家参考,具体内容如下 效果图: 导入依赖: dependencies { // ... compile 'me.everything: ...
- java如何实现qq分组_Android仿QQ好友列表分组实现增删改及持久化
Android自带的控件ExpandableListView实现了分组列表功能,本案例在此基础上进行优化,为此控件添加增删改分组及子项的功能,以及列表数据的持久化. Demo实现效果: GroupLi ...
- android开发歌词滑动效果_Android 歌词同步滚动效果
歌词是播放器类App必不可少的组件,而一般的歌词组件都需要做到歌词的显示与播放进度同步.我们知道,歌词是如下所示的文件: lrc [ti:原来爱情这么伤] [ar:梁咏琪] [al:给自己的情歌] [ ...
- 安卓java 模拟点击类_Android模拟用户点击的实现方法
前言 Android模拟用户点击.在自动化测试中可使用的工具. 可以利用adb命令,也可以使用Android SDK中的monkeyrunner工具. win7-64 gitbash 使用adb命令 ...
- 支付宝首页搜索栏淡出效果HTML,仿支付宝首页效果实现
但是我跟参考资料中作者关于整个页面的设计逻辑不一致, 但是实现的效果一样, 也算是多一种实现方式, 希望跟大家一起共同学习. 先上效果 效果图.gif 整个界面的结构图 结构图.png 关于整个页面布 ...
- java实现物体下落效果_手撸一个物体下落的控件,实现雪花飘落效果
效果图: 圣诞登录页.gif 参考文章: Android自定义View--从零开始实现雪花飘落效果 感谢原文作者,不仅实现了效果,并且写得非常详细,还做了优化.笔者参考原文作者的源码,做了一点修改,实 ...
- java实现钢琴颜色改变_Android 拨号盘按键音修改为钢琴音效果实现
1. 准备好对应的音源文件. 这里以ogg格式的音频文件为例.从数字0-9,* # 总共需要12个ogg音源文件.放在raw文件夹下备用. 2. 修改代码逻辑,主要在Dialer模块的DialpadF ...
- [纪录]仿IOS滚轮效果(竖直滑动选择器)
今天想做一个类似这样的一个效果,可是UI的模板是参考IOS做的,于是就各种百度各种搜,最后让我找到了一个仿IOS滚轮的一个Demo,稍微研究了一下,发上来,大家一起学习,以后也方便我查看,就不用再去百 ...
- android仿微信图片上传进度,Android开发之模仿微信打开网页的进度条效果(高仿)...
一,为什么说是真正的高仿? 阐述这个问题前,先说下之前网上的,各位可以复制这段字,去百度一下 "仿微信打开网页的进度条效果",你会看到有很多类似的文章,不过他们有个共同点,就是实 ...
最新文章
- mysql同时满足升序和降序_MySQL性能优化(三):索引
- Visual Studio 2017 针对移动开发的新特性介绍
- 就你这个求婚态度,能嫁给你才怪!
- Struts2的控制器(Controller)的工作流程图
- linux awk入门,awk入门应用
- Spring Cloud笔记-eureka及openfeign基本使用
- 统一元数据,数据湖Catalog让大数据存算分离不再是问题
- 方维分享系统,品牌无法设置分类关联
- 利用pushState开发无刷页面切换
- 华硕Z77系列主板怎么进行超频设置?
- 中国新一代超级安全核燃料材料入堆辐照试验开始
- Oracle中如何记录访问数据库的登录信息?
- 经典 Fuzzer 工具 AFL 模糊测试指南
- Web---HTML标签总结
- 微信小程序实现转盘抽奖
- 小桥加加的英语学习博客
- 宏观经济学-试卷1-安徽大学
- Markdomn学习
- 红外循迹模块TCRT5000 驱动
- ipad pro python xcode_从命令行启动Xcode模拟器
热门文章
- 北大先修课 计算机,北大先修课
- java mp3合并_java合并MP3文件
- 微信圣诞头像来了,快给你的头像带上圣诞帽吧
- 类型多样的游戏模型3d模型素材,速来收藏
- 中国城市轨道交通与设备产业十四五建设规划与运营模式咨询报告2022-2028年
- KVM切换器如何选购
- 什么是计算机网络AP,AP与AC的区别是什么,拓扑网络知识。
- Mybatis之错误:Invalid bound statement (not found)
- 相机技术--摄像机720p、1080p、2mp、3mp、5mp;VGA, QHD, FHD, 2K,4K对应的分辨率分别是什么
- quartus中与modelsim进行联合仿真出现错误error:(vopt-13130)failed to find design unit****