android大漩涡旋转效果(极光星空)

news/2025/3/14 19:29:43/

先放张效果图,gif录制把效果都显示成卡顿样子,其实不然

其实这是项目中的一个需求啦,我想着也写出来自己做个记录。

先来简单看下这个效果

1,背后有一个一直旋转的类似极光星空的效果,每个圆之间的距离逐渐增大,每个圆上有固定的两个黄色弧线(可变的)

2,往看上层view,两个转向不同的花轮,其实这是两个图片,加上一个旋转动画的效果(中间是app的icon)

3,不断的添加图片,做成一个漩涡样式的动画,刚开始做的时候想的是在哪里见过垃圾回收好像是这种动画

先贴下1的代码

   private int defaultRadius = 100;//默认的半径 最开始的一个圆的半径private int circleSpace = 10;//每个圆的间隔private void init() {defaultRadius = ScreenUtil.dip2px(mContext, 100);
//        c²=a²+b²if (mPaint == null) {mScreenHeight = ScreenUtil.getScreenHeight(mContext);mScreenWidth = ScreenUtil.getScreenWidth(mContext);int cf = mScreenWidth * mScreenWidth + mScreenHeight * mScreenHeight;mSqrt = Math.sqrt(cf);mCircleCount = (int) Math.abs((mSqrt - defaultRadius * 2) / (circleSpace * 2));mPaint = new Paint();mPaint.setAntiAlias(true);mPaint.setColor(Color.parseColor("#D2D2D2"));mPaint.setStyle(Paint.Style.STROKE);mPaint.setStrokeWidth(2);}}

init其实是做了一些初始化和计算的操作,有一个默认的第一圆的变径大小,因为中间有一个icon的存在,就不需要从很小的圆开始画起了,以及每个圆之间固定的间隔,这个间隔后面再讲。

计算的是我这个一个屏幕画多少个圆就足够了?为了避免资源浪费,还是需要想到处理一下的,也比较简单,通过简单的三角函数,求出对角线距离,对角线距离减掉默认圆的直径再除固定间隔,会得到一个我们要画的圆的数量。

@Overrideprotected void onDraw(Canvas canvas) {defaultRadius = ScreenUtil.dip2px(mContext, 100);circleSpace = 10;try {if (acrList == null || acrList.size() <= 0) {saveArc();invalidate();return;}for (int i = 0; i < acrList.size(); i++) {defaultRadius = defaultRadius + circleSpace + i * 5;if (defaultRadius >= mSqrt) {break;}mPaint.setStrokeWidth(2);mPaint.setColor(Color.parseColor("#D2D2D2"));canvas.drawCircle(mScreenWidth / 2, mScreenHeight / 2, defaultRadius, mPaint);mRectF = new RectF(mScreenWidth / 2 - defaultRadius, mScreenHeight / 2 - defaultRadius, mScreenWidth / 2 + defaultRadius, mScreenHeight / 2 + defaultRadius);mPaint.setColor(Color.parseColor("#FFCC33"));mPaint.setStrokeWidth(4);AcrBean acrBean = acrList.get(i);int start = acrBean.getStart();int start2 = acrBean.getStart2();canvas.drawArc(mRectF, start, acrBean.getEnd(), false, mPaint);canvas.drawArc(mRectF, start2, acrBean.getEnd2(), false, mPaint);if (start >= 360) {start = 0;}acrBean.setStart(start + 1);if (start2 >= 360) {start2 = 0;}acrBean.setStart2(start2 + 1);}if (!isStop) {invalidate();}} catch (Exception e) {}}private void saveArc() {for (int i = 0; i < mCircleCount; i++) {Random random = new Random();int start = random.nextInt(360);int end = 5 + (int) (Math.random() * 15);int end2 = 5 + (int) (Math.random() * 15);acrList.add(new AcrBean(start, end, start + 180, end2));}}class AcrBean {private int start;private int end;private int start2;private int end2;public AcrBean(int start, int end, int start2, int end2) {this.start = start;this.end = end;this.start2 = start2;this.end2 = end2;}public int getStart2() {return start2;}public void setStart2(int start2) {this.start2 = start2;}public int getEnd2() {return end2;}public void setEnd2(int end2) {this.end2 = end2;}public int getStart() {return start;}public void setStart(int start) {this.start = start;}public int getEnd() {return end;}public void setEnd(int end) {this.end = end;}}

ondraw中的具体操作;

初始化了一个 弧线最短长度为100dp,然后根据每次循环画圆的操作来扩展他的长度,上面提到的间隔也是在不断循环画圆的时候来增加间隔距离,这里为了保证弧线的起始点和终点距离跟同一个圆上的其他起始点距离一样,也做了额外操作;

 public void stopAnim() {isStop = true;invalidate();}public void startAnim() {isStop = false;invalidate();}

对外暴露的开始动画和结束动画的方法。

下面看下动态添加view并做动画的一个操作吧

 private void initData() {for (int i = 0; i < 20; i++) {imagePathList.add("");}}private void addViewStartAnim(int position) {if (isStopAnim) {return;}if (position >= imagePathList.size()) {addViewStartAnim(0);return;}View view = LayoutInflater.from(mContext).inflate(R.layout.layout_add_photo_item, null);int width = ScreenUtil.dip2px(mContext, 300);RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(width, width);layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT);view.setLayoutParams(layoutParams);ImageView ivPhoto = view.findViewById(R.id.iv_photo);ivPhoto.setImageResource(R.mipmap.ic_launcher);Animation animation = AnimationUtils.loadAnimation(mContext, R.anim.compose_photo_rotation_scale);animation.setAnimationListener(new AnimListener());addRlAnimView(view);animation.setFillAfter(true);view.startAnimation(animation);position++;int pos = position;mHandler.postDelayed(() -> addViewStartAnim(pos), 500);}public void addRlAnimView(View view) {mRlAnim.addView(view);}
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"><scaleandroid:duration="5000"android:fromXScale="1"android:fromYScale="1"android:interpolator="@android:anim/decelerate_interpolator"android:pivotX="50%"android:pivotY="50%"android:toXScale="0"android:toYScale="0"/><rotateandroid:duration="5000"android:fromDegrees="0"android:interpolator="@android:anim/decelerate_interpolator"android:pivotX="50%"android:pivotY="50%"android:toDegrees="720"/><alphaandroid:duration="500"android:fromAlpha="0"android:toAlpha="1"/>
</set>

这里也一点不复制,通过打气筒创建布局,我给布局中的图片加了一个旋转缩放的动画,旋转点为他的父view的中心点,这样子就能看成他是一个漩涡状态了!自己看着感觉还挺炫酷的。

整体效果真的是一点都不卡的!!是gif录制的问题

有兴趣的可以参考下demo

https://download.csdn.net/download/l_junpeng/10946278


http://www.ppmy.cn/news/649622.html

相关文章

苹果手机怎么拍星空_手机怎么拍星空

1、安卓手机篇 打开手机相机,然后进入专业模式。 我们将感光度(ISO)调到1600,快门速度(s)调到30秒左右,对焦(AF)选择手动模式(MF),然后点击屏幕上无限远的地方对焦。 如果手机支持专业的RAW格式的话,可以在相机设置,然后分辨率中打开。这样拍摄的照片成像有保证。 如果想…

webgl绘制太阳系行星动画

webgl模拟太阳系 demo: minicode——太阳系 文章同时发布于&#xff1a;我的个人网站。 这次做的MiniCode&#xff0c;是用webgl模拟太阳系的动画&#xff0c;绘制了太阳系和绕太阳旋转的八颗行星。各个部分的绘制方法我简要概述下。 1. 背景星空 这部分本来打算采用绘制天…

苹果手机怎么拍星空_手机怎么拍摄星空?5分钟教你如何拍出璀璨星空

宇宙是个神秘的地方,在很小的时候小编就喜欢看着天文杂志,拿着天文望远镜在那遥望美丽的星空。许多小伙伴问小编,说手机能拍摄出很美的星空吗?小编的回答:当然!既然你们都问了这个问题,小编如果不教,就显得有些不近人情了。 下面我们就一起来看看如何拍摄我们头顶的璀璨…

special effects - 星空宇宙背景特效

星空宇宙背景特效 一. 效果图二. 实现代码 一. 效果图 二. 实现代码 <!DOCTYPE html> <html><head><meta http-equiv"Content-Type" content"text/html; charsetutf-8"><title>星空宇宙背景特效</title><style>…

美轮美奂宇宙星空制作神器Spacescape

本文章由cartzhang编写&#xff0c;转载请注明出处。 所有权利保留。 文章链接&#xff1a;http://blog.csdn.net/cartzhang/article/details/46444569 作者&#xff1a;cartzhang 一、 简介 Spacescape 宇宙星空工具就是创建宇宙天空盒的工具&#xff0c;天空盒有星星和星…

用零知识证明连接多链宇宙

目录 一、前言 二、Bridges和Zero Knowledge Proofs 三、Succinct Verification of Proof of Consensus (Succinct Labs)

php代码授权和更新

数据表 应用表、 授权时长表、 应用版本表、 用户表 用户会员等级表 应用授权表、 应用订单表、 充值订单表、 提现表、 更新记录表、 下载记录表、 普通授权代码 基本信息 接口位置&#xff1a;/api/check/auth 参数提交方式为 POST\GET 参数1 $app 为客户端系统在授权系统…

【从零开始学习JAVA | 第二十五篇】泛型

目录 前言&#xff1a; 泛型&#xff1a; 额外拓展&#xff1a; 总结&#xff1a; 前言&#xff1a; 本文将详细介绍之前我们在JAVA 中一直在讲的泛型&#xff0c;各位感兴趣的同学可以点击进来观看。 泛型&#xff1a; 泛型是一种编程概念&#xff0c;它允许在定义类、接…