学习自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学习相关推荐

  1. android 自定义加载动画效果,Android自定义View实现loading动画加载效果

    项目开发中对Loading的处理是比较常见的,安卓系统提供的不太美观,引入第三发又太麻烦,这时候自己定义View来实现这个效果,并且进行封装抽取给项目提供统一的loading样式是最好的解决方式了. ...

  2. Android 自定义相机Demo 入门学习

    Android 自定义相机Demo 本文是参考网上一些自定义相机示例,再结合自己对相机的功能需求写的,基本上包含了很多基本功能,比如相机对焦.闪光灯,以及在手机预览界面上绘制自己想要绘制的图案. 话不 ...

  3. android组件什么时候加载到r文件,Android自定义加载loading view动画组件

    我写写使用步骤 自定义view(CircleProgress )的代码 package com.hysmarthotel.view; import com.hysmarthotel.roomcontr ...

  4. Android 自定义View以及ValueAnimator学习

    2019独角兽企业重金招聘Python工程师标准>>> 看了ApiDemo里面的BoucingBall,觉得挺好的,所以特地学习了一下,将代码注释后贴到这里,以便以后学习. clas ...

  5. Android 自定义View 时钟效果

    Android 自定义时钟浅析 最有趣,最好玩的东西,一定是高度灵活的东西,今天我们以自定义View的方式来实现一个表盘样式的时钟,并自动设置为当前时间,因为感觉网上的直接能运行的代码很少,思路也很麻 ...

  6. 守望先锋加载loading在Android上的实现

    目录 目录 前言 正文 效果 相关资源 实现过程及原理 尾声 前言 最近玩守望屁股,看到它的加载loading效果不错,于是便想把它实现到Android上.经过实践,这个小项目已初步完成,全部内容只有 ...

  7. android 自定义loading,Android自定义动画-StarLoadingView

    今天来分享第二个自定义loading的动画,起了个名字叫 蹦跶的星星 ,还是老规矩先介绍,后上图. 实现效果在最后,GIF有点大,手机流量慎重. 介绍 首先声明做这个动画的初衷是为了学习和分享,所以从 ...

  8. android自定义View学习(一)----创建一个视图类

    创建一个视图类 精心设计的自定义视图与其他精心设计的类非常相似.它使用易于使用的界面封装了一组特定的功能,它可以高效地使用CPU和内存,等等.不过,作为一个设计良好的班级,自定义视图应该: 符合And ...

  9. 守望先锋服务器修改,守望先锋开发者访谈:关于自定义的服务器

    守望先锋开发者访谈:关于自定义的服务器_更多守望先锋蓝贴_更多守望先锋新改动_更多守望先锋资讯,请关注17173守望先锋专区~ 最新一期的开发者访谈又出炉了!说到开发者访谈,是守望的游戏总监Jeff ...

最新文章

  1. 使用 SQL Server 2012 Analysis Services Tabular Mode 表格建模 图文教程
  2. UNIX网络编程之旅-配置unp.h头文件环境
  3. mysql ndb 测试_.部署MYSQL集群 --测试
  4. 世界围棋人机大战、顶峰对决第二战:围棋世界冠军Lee Sedol(李世石,围棋职业九段)对战Google DeepMind AlphaGo围棋程序,AlphaGo再次胜出!
  5. CodeForces - 1354F Summoning Minions(最大费用最大流)
  6. 数据挖掘初次接触!学习代码
  7. 信息学奥赛一本通(1224:最大子矩阵)
  8. 一元两次方程组c语言,一元二次方程求解程序完整代码
  9. 虚拟环境virtualenv
  10. python数据处理(招聘信息薪资字段的处理)
  11. NLP-文本摘要:“文本摘要”综述(Text Summarization)
  12. 解决vue和vue-template-compiler版本不一致问题
  13. Xftp 或Xshell 要继续使用此程序,您必须应用最新的更新或使用新版本
  14. 数据结构基本代码汇总
  15. 一个适合在校生宝藏编程学习网站
  16. LinuxIP白名单设置
  17. css中的div容器笔记
  18. 利用python open-cv aimageio完成avi png mp4 gif间的转换
  19. 信息系统开发与管理【三】之 系统开发方法概述
  20. 安全帽识别与火焰识别系统功能应用

热门文章

  1. 2018 开学第一课
  2. 周 7 福利日:中奖名单公布
  3. ggplot2——饼图篇
  4. history 路由 vs hash 路由 vs location.href 实现跳转
  5. 腾讯云IM REST API V4接口统一请求方法 PHP
  6. 小熊、九阳、苏泊尔,小家电玩家们乱了阵脚?
  7. redis expire key 过期不删除
  8. 华为LACP链路聚合配置
  9. 13个Python小游戏,可以上班摸鱼玩了一天
  10. FPGA通过PCIe读写DDR4仿真IP核