自定义view—小圆围绕大圆旋转


在Android开发中,自定义View是一项重要的技能,它允许开发者根据需求创建独特的视觉效果和交互。本示例“自定义view—小圆围绕大圆旋转”是一个基础的动画实现,展示了如何让一个小圆沿着大圆的边缘进行360度旋转。这个过程涉及到了Android的图形绘制和动画系统。 我们需要创建一个新的自定义View类,继承自`View`或`ViewGroup`。在这个例子中,可能会命名为`CircleAroundView`。在该类中,我们需要重写`onDraw()`方法,这是自定义View绘制图形的核心。在这个方法内,我们将使用`Canvas`对象来绘制大圆和小圆。大圆作为背景,小圆则需要动态移动并显示旋转效果。 ```java public class CircleAroundView extends View { private Paint bigCirclePaint; private Paint smallCirclePaint; private float centerX; // 大圆中心X坐标 private float centerY; // 大圆中心Y坐标 private float smallCircleRadius; // 小圆半径 public CircleAroundView(Context context) { super(context); init(); } public CircleAroundView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); init(); } public CircleAroundView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } private void init() { bigCirclePaint = new Paint(Paint.ANTI_ALIAS_FLAG); bigCirclePaint.setColor(Color.WHITE); bigCirclePaint.setStyle(Paint.Style.STROKE); bigCirclePaint.setStrokeWidth(5f); smallCirclePaint = new Paint(Paint.ANTI_ALIAS_FLAG); smallCirclePaint.setColor(Color.RED); smallCirclePaint.setStyle(Paint.Style.FILL); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); centerX = w / 2f; centerY = h / 2f; smallCircleRadius = Math.min(w, h) / 6f; // 小圆半径设定为视图宽度或高度的1/6 } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawCircle(centerX, centerY, bigCircleRadius, bigCirclePaint); // 绘制大圆 canvas.drawCircle(centerX + calculateRotationOffset(), centerY, smallCircleRadius, smallCirclePaint); // 绘制小圆 } // 计算小圆相对于大圆中心的偏移量 private float calculateRotationOffset() { // 这里会涉及到动画的计算,例如使用Animation或者ValueAnimator来更新角度 } } ``` 为了实现小圆围绕大圆的旋转效果,我们可以利用`ValueAnimator`或`ObjectAnimator`来改变小圆的旋转角度。`ValueAnimator`会随着时间的推移不断调用`onAnimationFrame`方法,我们在这里更新小圆的位置: ```java private ValueAnimator rotationAnimator; private void startRotationAnimation() { rotationAnimator = ValueAnimator.ofFloat(0f, 360f); rotationAnimator.setDuration(5000); // 动画持续时间 rotationAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { float rotationAngle = (float) animation.getAnimatedValue(); // 当前旋转角度 invalidate(); // 触发重绘 } }); rotationAnimator.start(); } @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); startRotationAnimation(); // 在添加到窗口时启动动画 } @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); rotationAnimator.cancel(); // 从窗口移除时取消动画 } ``` 这个示例中的"围绕旋转"标签暗示了动画的原理是基于角度变化。通过持续更新小圆的旋转角度,并在每次`onDraw()`调用时重新绘制,我们可以看到小圆沿着大圆的边缘平滑移动,从而实现了360度旋转的效果。 至于`CircleAroundPro`这个文件名,可能代表这是一个更高级或优化过的版本,可能包含了额外的功能,如更复杂的动画效果、性能优化或者支持用户交互等。 这个示例展示了Android自定义View的基本原理和动画系统的运用,是理解Android图形绘制和动画实现的良好起点。通过深入学习和实践,开发者可以创建出更加复杂且富有创意的用户界面。

























































































































- 1
- 2
- 3
- 4
- 5
- 6
- 11


- 粉丝: 10
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 基于python编写的appium自动化框架,采用PO模式,并集成了日志以及测试报告通过邮件发送的功能.zip
- 基于Python的ATM和购物商城的联合应用,商品结算调用ATM接口.zip
- 基于Python并调用百度智能云API所实现的简单人脸对比.zip
- 基于Python编写的中国城市轨道交通数据可视化分析项目。应用技术:网络编程、多线程、文件操作、数据库编程、GUI界面、数据分析。Python课程设计、大作业、实验、实践.zip
- 基于python的bilibili网页登录二维码输出到控制台的小工具.zip
- 基于python的discuz!论坛签到脚本.zip
- 基于python的django框架写的学生信息管理系统.zip
- 基于Python的Django模型,利用Bootstrap3前端框架,实现常用的基本功能,如增删改查、批量删除以及分页等,数据库使用Django自带的轻量级SQLite.zip
- 基于python的dtw算法,实现实时语音识别。.zip
- 基于Python的flask框架的疫情可视化网站.zip
- 基于python的linux系统资源监控,包括磁盘,cpu,内存,进程监控。通过钉钉群发送告警.zip
- 基于Python的NuitkaGUI.zip
- 基于python的PLUMED的可视化界面开发.zip
- 基于Python的flask网络爬虫web项目.zip
- 基于Python的numpy实现的简易深度学习框架,包括自动求导、优化器、layer等的实现。.zip
- 基于python的socket的Udp链接,模拟路灯.zip


