利用Android实现比较炫酷的自定义View

自定义View、多线程、网络,被认为是Android开发者必须牢固掌握的最基础的三大基本功,这篇文章主要给大家介绍了关于如何利用Android实现比较炫酷的自定义View的相关资料,需要的朋友可以参考下

一、背景

1.1、控件效果

要实现的自定义控件效果大致如下,实现过程中用到了比较多的自定义View的API,觉得比较有代表性,就分享出来也当做学习总结

项目代码已上传github

github.com/DaLeiGe/And

1.2、从功能上分析一下这个控件,大致有以下特点

  • 随机运动粒子从圆周向圆心运动,并与切线方向有正负30°的角度差,粒子透明度、半径、运动速度随机,运动超过一定距离或者时间消失
  • 背景圆有一个从内到外的渐变色
  • 计时模式下圆环有一个颜色渐变的顺时针rotate动画
  • 整个背景圆颜色随着扇形角度变化而变化
  • 指针颜色变化
  • 数字变化是上下切换动画

1.3、从结构上分析

这个控件可以拆分为两个部分,由背景圆+数字控件两个部分构成的组合控件,之所以把数字控件单独拆分出来,也是为了方便做数字上下跳动的动画,毕竟通过控制drawText的位置实现动画感觉不方便,直接通过View的属性动画更好实现

二、 背景圆实现

2.1、实现粒子运动

使用AnimPoint.java表示运动粒子,它具有x,y坐标,半径,角度,运动速度,透明度等属性,通过这些属性就可以画出一个静态的粒子

 public class AnimPoint implements Cloneable { /** * 粒子原点x坐标 */ private float mX; /** * 粒子原点y坐标 */ private float mY; /** * 粒子半径 */ private float radius; /** * 粒子初始位置的角度 */ private double anger; /** * 一帧移动的速度 */ private float velocity; /** * 总共移动的帧数 */ private int num = 0; /** * 透明度 0~255 */ private int alpha = 153; /** * 随机偏移角度 */ private double randomAnger = 0; } 

粒子的初始位置位于随机角度的圆周,且一个粒子具有随机的半径,透明度,速度等,通过init()方法,实现初始化粒子如下

 public void init(Random random, float viewRadius) { anger = Math.toRadians(random.nextInt(360)); velocity = random.nextFloat() * 2F; radius = random.nextInt(6) + 5; mX = (float) (viewRadius * Math.cos(anger)); mY = (float) (viewRadius * Math.sin(anger)); //随机偏移角度-30°~30° randomAnger = Math.toRadians(30 - random.nextInt(60)); alpha = 153 + random.nextInt(102); } 

想让粒子运动起来,使用update更新粒子的这些坐标属性就能实现,比如粒子现在坐标在(5,5),通过update()改变粒子的坐标到(6,6),结合属性动画不停地调用update()则就能不停的改变x,y的坐标,实现粒子运动,然后当粒子移动超过一定距离,或者调用update超过一定次数,再重新调用init()让粒子重新从圆周上开始下一个生命周期运动

 public void updatePoint(Random random, float viewRadius) { //每一帧偏移的像素大小 float distance = 1F; double moveAnger = anger + randomAnger; mX = (float) (mX - distance * Math.cos(moveAnger) * velocity); mY = (float) (mY - distance * Math.sin(moveAnger) * velocity); //模拟半径逐渐变小 radius = radius - 0.02F * velocity; num++; //如果到了最大值 则重新给运动粒子一个轨迹属性 int maxDistance = 180; int maxNum = 400; if (velocity * num > maxDistance || num > maxNum) { num = 0; init(random, viewRadius); } } 

在View中大致实现如下

 /** * 初始化动画 */ private void initAnim() { //绘制运动的粒子 AnimPoint mAnimPoint = new AnimPoint(); for (int i = 0; i  { for (AnimPoint point : mPointList) { //通过属性动画不停的计算下粒子的下一个坐标 point.updatePoint(mRandom, mRadius); } invalidate(); }); mPointsAnimator.start(); } @Override protected void onDraw(final Canvas canvas) { super.onDraw(canvas); canvas.save(); canvas.translate(mCenterX, mCenterY); //画运动粒子 for (AnimPoint animPoint : mPointList) { mPointPaint.setAlpha(animPoint.getAlpha()); canvas.drawCircle(animPoint.getmX(), animPoint.getmY(), animPoint.getRadius(), mPointPaint); }

以上就是利用Android实现比较炫酷的自定义View的详细内容,更多请关注0133技术站其它相关文章!

赞(0) 打赏
未经允许不得转载:0133技术站首页 » 移动