Android自定义守望先锋loading学习
学习自http://blog.csdn.net/chen_zhang_yu/article/details/53396801#效果
只是学习了这个loading的创意,具体制作没有学,因为他是用surface view做的,我不会
不过也从他这里学到了drawPath的技巧,这里总结下
moveTo只移动
lineTo画直线
cubicTo和quadTo画曲线
arcTo画弧线
我的实现效果(很烂,因为透明度不知道为啥没实现好,我也懒得去弄了,因为项目没这需求,纯属兴趣爱好)
我的控制显隐是采用Handler+Value动画实现的
我的代码写的很烂,而且有严重的内存泄漏,如果想用到项目里去,还是用上面链接里的东西吧
全部代码
pojo
public class Hexagon {private int centerPointX; private int centerPointY; private float lenScale = 0; private int alpha = 0; private int len;//中心点到顶点距离 private int offsetX;//点到边的距离 private int[] vertexXArray = new int[6]; private int[] vertexYArray = new int[6]; public Hexagon(int centerPointX, int centerPointY, int len) {this.centerPointX = centerPointX; this.centerPointY = centerPointY; this.len = len; this.offsetX = (int) (len * 1.732 / 2); calculateVertex(); }//最上方顺时针开始 public void calculateVertex() {vertexXArray[0] = centerPointX; vertexXArray[1] = (int) (centerPointX + offsetX * lenScale); vertexXArray[2] = (int) (centerPointX + offsetX * lenScale); vertexXArray[3] = centerPointX; vertexXArray[4] = (int) (centerPointX - offsetX * lenScale); vertexXArray[5] = (int) (centerPointX - offsetX * lenScale); vertexYArray[0] = (int) (centerPointY + len * lenScale); vertexYArray[1] = (int) (centerPointY + len * lenScale / 2); vertexYArray[2] = (int) (centerPointY - len * lenScale / 2); vertexYArray[3] = (int) (centerPointY - len * lenScale); vertexYArray[4] = (int) (centerPointY - len * lenScale / 2); vertexYArray[5] = (int) (centerPointY + len * lenScale / 2); }private Path getPath() {Path path = new Path(); for (int i = 0; i < 6; i ++) {if (i == 0) {path.moveTo(vertexXArray[i], vertexYArray[i]); } else {path.lineTo(vertexXArray[i], vertexYArray[i]); //我这里没有移到最初点,最后会自动闭合吗 }}path.close(); return path; }public void drawHexagon(Canvas canvas, Paint paint) {paint.setAlpha(alpha); canvas.drawPath(getPath(), paint); }public void setLenScale(float lenScale) {this.lenScale = lenScale; }public void setAlpha(int alpha) {this.alpha = alpha; } }
view
//守望先锋loading public class AssLoadingView extends View {public AssLoadingView(Context context, @Nullable AttributeSet attrs) {super(context, attrs); init(); }private int viewCenterX; private int viewCenterY; private int hexLen = 50; private int hexPadding = 0; private Hexagon[] hexagons = new Hexagon[7]; private Paint paint = new Paint(); private int i = 0; private ValueAnimator valueAnimator1; private ValueAnimator valueAnimator2; @SuppressLint("HandlerLeak")private android.os.Handler handler = new android.os.Handler() {@Override public void handleMessage(Message msg) {if (i % 14 <= 6) {valueAnimator1.start(); } else {valueAnimator2.start(); }this.sendEmptyMessageDelayed(0, 150); }}; private void init() {paint.setColor(Color.parseColor("#bec0c9")); viewCenterX = ScreenUtils.getScreenWidth(getContext()) / 2; viewCenterY = ScreenUtils.getScreenHeight(getContext()) / 2; int centerDistance = 2 * hexLen + hexPadding; int offsetX = centerDistance / 2; int offsetY = (int) (centerDistance * 1.732 / 2); hexagons[6] = new Hexagon(viewCenterX, viewCenterY, hexLen); int x = viewCenterX + offsetX; int y = viewCenterY + offsetY; hexagons[3] = new Hexagon(x, y, hexLen); x = viewCenterX + centerDistance; y = viewCenterY; hexagons[2] = new Hexagon(x, y, hexLen); x = viewCenterX + offsetX; y = viewCenterY - offsetY; hexagons[1] = new Hexagon(x, y, hexLen); x = viewCenterX - offsetX; y = viewCenterY - offsetY; hexagons[0] = new Hexagon(x, y, hexLen); x = viewCenterX - centerDistance; y = viewCenterY; hexagons[5] = new Hexagon(x, y, hexLen); x = viewCenterX - offsetX; y = viewCenterY + offsetY; hexagons[4] = new Hexagon(x, y, hexLen); valueAnimator1 = ValueAnimator.ofInt(0, 255); valueAnimator1.setDuration(120); valueAnimator1.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Override public void onAnimationUpdate(ValueAnimator animation) {int value = (int)animation.getAnimatedValue(); hexagons[i % 7].setLenScale((float)value / 255); hexagons[i % 7].setAlpha(value); invalidate(); }}); valueAnimator1.addListener(new Animator.AnimatorListener() {@Override public void onAnimationStart(Animator animation) {}@Override public void onAnimationEnd(Animator animation) {i ++; }@Override public void onAnimationCancel(Animator animation) {}@Override public void onAnimationRepeat(Animator animation) {}}); valueAnimator2 = ValueAnimator.ofInt(255, 0); valueAnimator2.setDuration(120); valueAnimator2.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Override public void onAnimationUpdate(ValueAnimator animation) {int value = (int)animation.getAnimatedValue(); hexagons[i % 7].setLenScale((float)value / 255); hexagons[i % 7].setAlpha(value); invalidate(); }}); valueAnimator2.addListener(new Animator.AnimatorListener() {@Override public void onAnimationStart(Animator animation) {}@Override public void onAnimationEnd(Animator animation) {i ++; }@Override public void onAnimationCancel(Animator animation) {}@Override public void onAnimationRepeat(Animator animation) {}}); handler.sendEmptyMessage(0); }@Override protected void onDraw(Canvas canvas) {super.onDraw(canvas); for (int i = 0; i < hexagons.length; i++) {hexagons[i].calculateVertex(); hexagons[i].drawHexagon(canvas, paint); }} }
Android自定义守望先锋loading学习相关推荐
- android 自定义加载动画效果,Android自定义View实现loading动画加载效果
项目开发中对Loading的处理是比较常见的,安卓系统提供的不太美观,引入第三发又太麻烦,这时候自己定义View来实现这个效果,并且进行封装抽取给项目提供统一的loading样式是最好的解决方式了. ...
- Android 自定义相机Demo 入门学习
Android 自定义相机Demo 本文是参考网上一些自定义相机示例,再结合自己对相机的功能需求写的,基本上包含了很多基本功能,比如相机对焦.闪光灯,以及在手机预览界面上绘制自己想要绘制的图案. 话不 ...
- android组件什么时候加载到r文件,Android自定义加载loading view动画组件
我写写使用步骤 自定义view(CircleProgress )的代码 package com.hysmarthotel.view; import com.hysmarthotel.roomcontr ...
- Android 自定义View以及ValueAnimator学习
2019独角兽企业重金招聘Python工程师标准>>> 看了ApiDemo里面的BoucingBall,觉得挺好的,所以特地学习了一下,将代码注释后贴到这里,以便以后学习. clas ...
- Android 自定义View 时钟效果
Android 自定义时钟浅析 最有趣,最好玩的东西,一定是高度灵活的东西,今天我们以自定义View的方式来实现一个表盘样式的时钟,并自动设置为当前时间,因为感觉网上的直接能运行的代码很少,思路也很麻 ...
- 守望先锋加载loading在Android上的实现
目录 目录 前言 正文 效果 相关资源 实现过程及原理 尾声 前言 最近玩守望屁股,看到它的加载loading效果不错,于是便想把它实现到Android上.经过实践,这个小项目已初步完成,全部内容只有 ...
- android 自定义loading,Android自定义动画-StarLoadingView
今天来分享第二个自定义loading的动画,起了个名字叫 蹦跶的星星 ,还是老规矩先介绍,后上图. 实现效果在最后,GIF有点大,手机流量慎重. 介绍 首先声明做这个动画的初衷是为了学习和分享,所以从 ...
- android自定义View学习(一)----创建一个视图类
创建一个视图类 精心设计的自定义视图与其他精心设计的类非常相似.它使用易于使用的界面封装了一组特定的功能,它可以高效地使用CPU和内存,等等.不过,作为一个设计良好的班级,自定义视图应该: 符合And ...
- 守望先锋服务器修改,守望先锋开发者访谈:关于自定义的服务器
守望先锋开发者访谈:关于自定义的服务器_更多守望先锋蓝贴_更多守望先锋新改动_更多守望先锋资讯,请关注17173守望先锋专区~ 最新一期的开发者访谈又出炉了!说到开发者访谈,是守望的游戏总监Jeff ...
最新文章
- 使用 SQL Server 2012 Analysis Services Tabular Mode 表格建模 图文教程
- UNIX网络编程之旅-配置unp.h头文件环境
- mysql ndb 测试_.部署MYSQL集群 --测试
- 世界围棋人机大战、顶峰对决第二战:围棋世界冠军Lee Sedol(李世石,围棋职业九段)对战Google DeepMind AlphaGo围棋程序,AlphaGo再次胜出!
- CodeForces - 1354F Summoning Minions(最大费用最大流)
- 数据挖掘初次接触!学习代码
- 信息学奥赛一本通(1224:最大子矩阵)
- 一元两次方程组c语言,一元二次方程求解程序完整代码
- 虚拟环境virtualenv
- python数据处理(招聘信息薪资字段的处理)
- NLP-文本摘要:“文本摘要”综述(Text Summarization)
- 解决vue和vue-template-compiler版本不一致问题
- Xftp 或Xshell 要继续使用此程序,您必须应用最新的更新或使用新版本
- 数据结构基本代码汇总
- 一个适合在校生宝藏编程学习网站
- LinuxIP白名单设置
- css中的div容器笔记
- 利用python open-cv aimageio完成avi png mp4 gif间的转换
- 信息系统开发与管理【三】之 系统开发方法概述
- 安全帽识别与火焰识别系统功能应用