安卓仿QQ红包领取详情界面动画
为了能清楚的看到这个效果,本人不惜几次花费重金给众群叼发放红包,来查看红包领取详情界面的动画效果,QQ效果如图:
图中我们可以看到,动画处的头像和文字是一起的,即同时并且是整体,注意,是整体进行缩放的,而且是随手指移动来变换大小的,如果我们按照普通的布局方法,ImageView+TextView的方式,用安卓自带的普通动画来实现是无法完成的,那好了,只能自定义View来实现了!
自定义view需要你对view的内部绘制机制有一定的了解,比如onMeasure,MeasureSpec.EXACTLY,MeasureSpec.AT_MOST,onDraw等等吧,我就不在详细讲解了,网上的介绍的文章非常多!如果你看过我之前的一篇文章:仿美团外卖,那么本篇理解起来会更加容易!
好啦,先看下本篇实现的效果图:
屡下思路,按之前仿美团外卖的动画实现思路,根据滑动监听对一个图片的缩放还是比较简单的,那又加了几行文字后该怎么办呢?上面说过,动画是整体的,所以图片和文字不能在两个View中实现,那就只能在一个view中喽,画完图片画文字呗,嗯,就是这样!
首先,为了更容易实现效果,最顶层头像所在红色区域以及头像需设置为固定高度,而宽度则可以设置固定值或match_parent!可能你会觉得如果宽高不一样,那头像是否会变形?答案是,如果你的自定义view里测量宽高并重绘时没做一些特殊操作,那变形是必然的!
先看一组代码:
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
measuredWidth = w;
measuredHeight = h;
//将bitmap按测量宽高设置,Math.min(measuredWidth, measuredHeight)取宽高最小值
scalebitmap = Bitmap.createScaledBitmap(bitmap,Math.min(measuredWidth, measuredHeight),Math.min(measuredWidth, measuredHeight),true);
}
通过onMeasure方法测量宽高后,在onSizeChanged可得到测量后的宽高值,
scalebitmap = Bitmap.createScaledBitmap(bitmap,Math.min(measuredWidth, measuredHeight),Math.min(measuredWidth, measuredHeight),true);
这句话的意思是将图片的原bitmap按测量出来的宽高重新生成一个bitmap用于重绘,而
Math.min(measuredWidth, measuredHeight)
表示宽高按测量宽高中的最小值计算,比如我们在xml中设置自定义view 的宽:android:layout_width=”200dp”, 高:android:layout_height=”80dp”,那么最终画出的图片大小为80x80dp,而整个view剩余的右侧部分就留给文字了(注意,最好将view的宽度设置为match_parent比较合适)!
再看onDraw部分代码:
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//画图片
canvas.scale(mCurrentProgress, mCurrentProgress,0, measuredHeight);
canvas.drawBitmap(scalebitmap, 0, 0, mPaint);
//Math.min(measuredWidth, measuredHeight)图片宽高
//画文字1,起始坐标 x:为图片宽度 y:50
mPaintText1.setTextSize(sizeText1*mCurrentProgress);
canvas.drawText(text1, Math.min(measuredWidth, measuredHeight), 50, mPaintText1);
//画文字2,起始坐标 x:为图片宽度 y:图片高度-50
mPaintText2.setTextSize(sizeText2*mCurrentProgress);
canvas.drawText(text2, Math.min(measuredWidth, measuredHeight), Math.min(measuredWidth, measuredHeight)-50, mPaintText2);
}
首先图片及文字的缩放程度是根据mCurrentProgress这个值来决定的,图片是否根据向canvas的scale方法传入缩放比例mCurrentProgress而文字是根据自己设置的画笔大小*比例值mCurrentProgress;我们整个布局的外层使用ScrollView不必再说,而mCurrentProgress则是根据监听scrollview滑动距离与头像所在区高度值相比得到的:
myScrollView.setScrollViewListener(new ScrollViewListener() {
@Override
public void onScrollChanged(MyScrollView scrollView, int x, int y,int oldx, int oldy) {
//1.0f相当于一个缩放系数,越大随手指缩放敏感度越低
if(y>0&&y<=height){
myView.setCurrentProgress(1-(float)(y*1.0f)/(float)height);
myView.postInvalidate();
}
}
});
其次需要注意的点:
1.画图片
canvas.scale(mCurrentProgress, mCurrentProgress,0, measuredHeight);
后两个参数表示设置一个缩放点(坐标),再进行缩放时以此点为中心!
2.画文字
文字1:
canvas.drawText(text1, Math.min(measuredWidth, measuredHeight), 50, mPaintText1);
中间两个参数表示画笔起点坐标,x为图片宽度,而y为50像素;
文字2:
canvas.drawText(text2, Math.min(measuredWidth, measuredHeight), Math.min(measuredWidth, measuredHeight)-50, mPaintText2);
x仍为图片宽度,而y为图片高度-50像素(注意图片的宽高相同的),很容易理解吧!
当手指在不停的在屏幕上移动时,就会不停的调用myView.setCurrentProgress传入progress,并调用postInvalidate()进行重绘,从而使view的大小跟随手指移动缩放!
另外,大家可能要说,如果在真实项目中,头像不可能是一张固定图片,如果动态获取,又该如何呢?其实很简单了,在自定义view的init方法中有如下代码:
bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.head);
因此,我们在绘制前将网络获取的图片的bitmap传进去不就可以了吗?
当然,本篇文章所使用的方法只是一个思路,肯定不是最好的,大家集思广益,多发散自己的思维,将自己的更好的实现方法分享出来,共同进步!
已知缺陷:在快速上滑或下滑离手后,view的缩放效果会出现误差,待重新触摸屏幕移动后正常。(qq界面有相似问题)
目前本人并未查找原因,小伙伴们,拿出你们的聪明才智,一起来解决问题吧!
ECdemo下载地址:http://download.csdn.net/detail/baiyuliang2013/9514509
安卓仿QQ红包领取详情界面动画的更多相关文章
- 动手分析安卓仿QQ联系人列表TreeView控件
因项目需要需要用到仿QQ联系人列表的控件样式,于是网上找到一个轮子(https://github.com/TealerProg/TreeView),工作完成现在简单分析一下这个源码. 一. 需要用 ...
- Android仿QQ窗口的抖动的动画效果
就是仿照QQ窗口的抖动效果,在项目的res下创建anim文件夹,再创建两个xml文件:cycle.xml . myanim.xml cycle.xml : <?xml version ...
- 仿QQ浏览器mac版官网主页 html+css3特效
这是一款超酷的CSS3动态背景动画特效,CSS3仿QQ浏览器官网彗星动画背景特效. 在线演示本地下载
- Android项目源码界面超级华丽的仿QQ最新版本
这是一个我们比较熟悉的一款应用,高仿专仿最新QQ应用源码,也是一个高仿QQ最新版本的项目,界面超级华丽,使用了大量的自定义控件,项目里实现了部分功能,例如WIFI-FTP(把手机变成FTP服务端,可以 ...
- 仿QQ空间动态界面分享
先看看效果: 用极少的代码实现了 动态详情 及 二级评论 的 数据获取与处理 和 UI显示与交互,并且高解耦.高复用.高灵活. 动态列表界面MomentListFragment支持 下拉刷新与上拉加载 ...
- 自定义 behavior - 完美仿 QQ 浏览器首页,美团商家详情页
使用CoordinatorLayout打造各种炫酷的效果 自定义Behavior -- 仿知乎,FloatActionButton隐藏与展示 NestedScrolling 机制深入解析 一步步带你读 ...
- 仿QQ大战—界面篇
之前在<仿QQ大战-服务器的搭建(ServerSocket)>中实现了服务器的搭建,以及一个简单地传递数据的实现,现在就是来实现类似与QQ聊天通信的功能.首先是界面的实现: 首先:服务器和 ...
- 高仿QQ即时聊天软件开发系列之二登录窗口界面
继上一篇高仿QQ即时聊天软件开发系列之一开端之后,开始做登录窗口 废话不多说,先看效果,只有界面 可能还有一些细节地方没有做,例如那个LOGO嘛,不要在意这些细节 GIF虽短,可是这做起来真难,好吧因 ...
- 高仿qq聊天界面
高仿qq聊天界面,给有需要的人,界面效果如下: 真心觉得做界面非常痛苦,给有需要的朋友. chat.xml <?xml version="1.0" encoding=&quo ...
随机推荐
- ●BZOJ 4710 [Jsoi2011]分特产
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4710 题解: 容斥,组合先看看这个方案数的计算:把 M 个相同的东西分给 N 个人,每个人可 ...
- UOJ #11. 【UTR #1】ydc的大树
题目描述: ydc有一棵n个结点的黑白相间的大树,从1到n编号. 这棵黑白树中有m个黑点,其它都是白点. 对于一个黑点我们定义他的好朋友为离他最远的黑点.如果有多个黑点离它最远那么都是它的好朋友.两点 ...
- HTTP Status Codes 查询表
Web项目中经常会出现各种状态码,今天看到一个博客,挺不错,记录下来.
- Gradle入门--基本配置
Gradle配置: Gradle构建脚本 build.gradle Gradle属性文件 gradle.properties Gradle设置文件 settings.gradle build.grad ...
- 15. 3Sum(中等)
Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all un ...
- jmeter分布式测试远程连接失败
jmeter分布式部署其实很简单.但今天测试的时候发现了一个坑,远程连接一直失败. 原因:服务器上部署了slave,而这台服务器上有多个网卡.举个例子:ip分别为:192.168.100.6,10.1 ...
- Win10 下Cmake编译配置 Opencv3.1 + Cuda7.5 + VS2013
折腾了三天终于配置成功了,在此写下编译配置的全部步骤和遇到的很多坑. 整体介绍: OpenCV 中 CUDA 实现的函数还不是太多,使用前要在OpenCV的官网上确认以下你想要的功能是否已经实现,否则 ...
- OpenResty 操作cookies
在or中简单的使用cookies 复杂的操作请使用 [lua_resty_cookies](https://github.com/cloudflare/lua-resty-cookie) 基本操作 获 ...
- iOS开源加密相册Agony的实现(二)
简介 虽然目前市面上有一些不错的加密相册App,但不是内置广告,就是对上传的张数有所限制.本文介绍了一个加密相册的制作过程,该加密相册将包括多密码(输入不同的密码即可访问不同的空间,可掩人耳目).Wi ...
- mongo 存储过程
摘要 本文主要介绍mongo存储过程,mongo 存储过程其实就是JS方法,然后通过eval 方法来执行,但是这个方法在3.0 depreate了,也就是在未来的版本,这个功能可能不提供了.从目前的j ...