上一篇

Android雪花特效 - 自定义View

看效果 (Gif质量有点差,凑合看吧 [哈哈])

核心思路 画的有点丑 请见谅

核心计算方法  分别计算三个点用path进行绘制

 private Path getPath(float x, float y, double sweep, float r, StarBean bean) {Path path = new Path();float l = bean.getL();float startX = (float) (x + r * Math.cos(sweep));float startY = (float) (y - r * Math.sin(sweep));float twoX = (float) (x - r * Math.cos(sweep));float twoY = (float) (y + r * Math.sin(sweep));float threeX = (float) (x - l * Math.sin(sweep));float threeY = (float) (y - l * Math.cos(sweep));path.moveTo(startX, startY);path.lineTo(twoX, twoY);path.lineTo(threeX, threeY);path.lineTo(startX, startY);path.close();LinearGradient linearGradient = new LinearGradient(threeX, threeY, x, y,new int[]{Color.TRANSPARENT, bean.getColor()},new float[]{0f, 1f},Shader.TileMode.CLAMP);paint.setShader(linearGradient);return path;}

速度思想

  1. 根据我们定义圆角半径来控制速度,这样才能让我们的流行看起来有远有近(具体计算查看StarBean)

流行滑翔弧长思想

  1. 可根据x或y轴的大小来计算弧长,这样看起来就会到达一个流行滑翔的过程效果(具体计算查看StarBean)

完整代码片段

StarView 类

package com.ilz.rocketapplication.handaccount.view;import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.LinearGradient;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Shader;
import android.util.AttributeSet;
import android.widget.RelativeLayout;import com.ilz.rocketapplication.handaccount.bean.StarBean;
import com.ilz.rocketapplication.handaccount.utils.ColorUtils;
import com.ilz.rocketapplication.handaccount.utils.Tools;import java.util.ArrayList;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;public class StarView extends RelativeLayout {private static final String TAG = "StarView";private Paint paint;private Paint paintHead;private Paint paintHeadLight;private Paint paintHeadLight2;private int bw = Tools.getWindowsWidth();private int bh = Tools.getWindowsHeight();private double sweep = 340;//角度private int count = 100;private double pointCount = 100;private List<StarBean> list = new ArrayList<>();private Timer timer;private boolean isStart = false;private Timer playTimer;private int s = 0;
//    private int currentColor = ColorUtils.getRandomColor();public StarView(Context context) {this(context, null);}public StarView(Context context, AttributeSet attrs) {this(context, attrs, 0);}public StarView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);init();}private void init() {paint = new Paint();paint.setColor(Color.RED);paint.setAntiAlias(true);paint.setStyle(Paint.Style.FILL);LinearGradient linearGradient = new LinearGradient(0f, 0f, 0f, 1000,new int[]{Color.TRANSPARENT, Color.RED},new float[]{0f, 1f},Shader.TileMode.CLAMP);paint.setShader(linearGradient);paintHead = new Paint();paintHead.setStyle(Paint.Style.FILL);paintHead.setAntiAlias(true);paintHead.setColor(Color.WHITE);paintHeadLight = new Paint();paintHeadLight.setStyle(Paint.Style.FILL);paintHeadLight.setAntiAlias(true);paintHeadLight.setColor(Color.argb(100, 255, 255, 255));paintHeadLight2 = new Paint();paintHeadLight2.setStyle(Paint.Style.FILL);paintHeadLight2.setAntiAlias(true);paintHeadLight2.setColor(Color.argb(30, 255, 255, 255));initStar();initPoint();start();//播放组合initPlay();}private void initPlay() {playTimer = new Timer();s = 0;playTimer.schedule(new TimerTask() {@Overridepublic void run() {s++;if (s != 0 && s % 2 == 0) {int color = ColorUtils.getRandomColor();for (int i = 0; i < list.size(); i++) {if (!list.get(i).isPoint()){list.get(i).setColor(color);}}}if (s >= 1000) {//防止数据过大s = 0;}}}, 0, 1000);}private void initStar() {int color = ColorUtils.getRandomColor();for (int i = 0; i < count; i++) {StarBean bean = getStarBean();bean.setColor(color);list.add(bean);}}public StarBean getStarBean() {StarBean bean = new StarBean();
//        setBeanXY(bean);bean.setX((float) (Math.random() * bw));bean.setY((float) (Math.random() * bh));bean.setR((float) (Math.random() * 3 + 0.3f));return bean;}public void initPoint(){for (int i = 0; i < pointCount; i++) {StarBean bean = getStarBean();bean.setPoint(true);bean.setColor(Color.WHITE);bean.setR((float) (Math.random() * 1.5 + 0.1f));list.add(bean);}}private void setBeanXY(StarBean bean){if (Math.random() >= 0.5) {bean.setX(0);bean.setY((float) (Math.random() * bh));} else {bean.setX((float) (Math.random() * bw));bean.setY(0);}}public void addStar(int count) {for (int i = 0; i < count; i++) {StarBean bean = getStarBean();list.add(bean);}}public void addStar(int count, int color) {for (int i = 0; i < count; i++) {StarBean bean = getStarBean();bean.setColor(color);list.add(bean);}}public void start() {if (timer == null) {timer = new Timer();}timer.schedule(new TimerTask() {@Overridepublic void run() {for (int i = 0; i < list.size(); i++) {list.get(i).setX(list.get(i).getX() + list.get(i).getvX());list.get(i).setY(list.get(i).getY() + list.get(i).getvY());if (list.get(i).getX() < 0|| list.get(i).getX() > (bw + Math.sin(sweep) * list.get(i).getL())|| list.get(i).getY() > (bh + Math.cos(sweep) * list.get(i).getL())|| list.get(i).getY() < 0) {setBeanXY(list.get(i));
//                        list.get(i).setX((float) (Math.random() * bw));
//                        list.get(i).setY((float) (Math.random() * bh));}}postInvalidate();}}, 0, 15);}public void stop() {if (timer != null) {timer.cancel();timer = null;}if (playTimer != null) {playTimer.cancel();playTimer = null;}}private Path getPath(float x, float y, double sweep, float r, StarBean bean) {Path path = new Path();float l = bean.getL();float startX = (float) (x + r * Math.cos(sweep));float startY = (float) (y - r * Math.sin(sweep));float twoX = (float) (x - r * Math.cos(sweep));float twoY = (float) (y + r * Math.sin(sweep));float threeX = (float) (x - l * Math.sin(sweep));float threeY = (float) (y - l * Math.cos(sweep));path.moveTo(startX, startY);path.lineTo(twoX, twoY);path.lineTo(threeX, threeY);path.lineTo(startX, startY);path.close();LinearGradient linearGradient = new LinearGradient(threeX, threeY, x, y,new int[]{Color.TRANSPARENT, bean.getColor()},new float[]{0f, 1f},Shader.TileMode.CLAMP);paint.setShader(linearGradient);return path;}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);canvas.drawColor(Color.BLACK);//        path.moveTo(startX, startY);
//        path.lineTo((mStartSize - mEndSize) / 2, Height);
//        path.lineTo(((mStartSize - mEndSize) / 2 + mEndSize), Height);
//        path.lineTo(mStartSize, 0f);
//        path.lineTo(startX, startY);for (int i = 0; i < list.size(); i++) {StarBean bean = list.get(i);if (!bean.isPoint()) {Path path = getPath(bean.getX(), bean.getY(), sweep, bean.getR(), bean);canvas.drawPath(path, paint);canvas.drawCircle(bean.getX(), bean.getY(), bean.getHeadRLight2(), paintHeadLight2);canvas.drawCircle(bean.getX(), bean.getY(), bean.getHeadRLight(), paintHeadLight);canvas.drawCircle(bean.getX(), bean.getY(), bean.getHeadR(), paintHead);} else {canvas.drawCircle(bean.getX(), bean.getY(), bean.getR(), paintHead);}}}
}

Tools类

    /*** 获取屏幕的宽度*/public static int getWindowsWidth() {WindowManager wm = (WindowManager) (MyApplication.getInstance().getSystemService(Context.WINDOW_SERVICE));DisplayMetrics dm = new DisplayMetrics();wm.getDefaultDisplay().getMetrics(dm);int mScreenWidth = dm.widthPixels;return mScreenWidth;}/*** 获取屏幕的高度*/public static int getWindowsHeight() {WindowManager wm = (WindowManager) (MyApplication.getInstance().getSystemService(Context.WINDOW_SERVICE));DisplayMetrics dm = new DisplayMetrics();wm.getDefaultDisplay().getMetrics(dm);int mScreenHeigh = dm.heightPixels;return mScreenHeigh;}

StarBean类

package com.ilz.rocketapplication.handaccount.bean;import com.ilz.rocketapplication.handaccount.utils.ColorUtils;public class StarBean {private float x;private float y;private float r;private int color = ColorUtils.getRandomColor();private float l;private float headR;private float headRLight;private float headRLight2;private float vX;private float vY;private boolean isPoint = false;public float getL() {l = r * 10 + getX() * 0.3f;return l;}public int getColor() {return color;}public void setColor(int color) {this.color = color;}public float getHeadR() {return headR;}public float getHeadRLight() {return headRLight;}public float getHeadRLight2() {return headRLight2;}public float getvX() {return vX;}public float getvY() {return vY;}public float getX() {return x;}public void setX(float x) {this.x = x;}public float getY() {return y;}public void setY(float y) {this.y = y;}public float getR() {return r;}public void setR(float r) {this.r = r;vX = r * 1.5f;vY = r * 2f;headR = r + r * 0.3f;headRLight = r + r * 2f;headRLight2 = headRLight + headRLight * 0.6f;}public boolean isPoint() {return isPoint;}public void setPoint(boolean point) {isPoint = point;}
}

ColorUtils类

package com.ilz.rocketapplication.handaccount.utils;import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.GradientDrawable;import com.ilz.rocketapplication.handaccount.MyApplication;public class ColorUtils {public static int getRandomColor() {StringBuffer buffer = new StringBuffer();buffer.append("#");for (int i = 0; i < 6; i++) {buffer.append(arr[(int) (Math.random() * arr.length)]);}return Color.parseColor(buffer.toString());}private static String[] arr = new String[]{"0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"};public static Drawable getRandomDrawable() {GradientDrawable drawable = new GradientDrawable();drawable.setOrientation(GradientDrawable.Orientation.TR_BL);drawable.setCornerRadius(Tools.dip2px(MyApplication.getInstance(), 10));drawable.setColors(new int[]{getRandomColor(),getRandomColor(),getRandomColor(),getRandomColor(),});return drawable;}public static Drawable getRandomDrawable(float radiusDp) {GradientDrawable drawable = new GradientDrawable();drawable.setOrientation(GradientDrawable.Orientation.TR_BL);drawable.setCornerRadius(Tools.dip2px(MyApplication.getInstance(), radiusDp));drawable.setColors(new int[]{getRandomColor(),getRandomColor(),getRandomColor(),getRandomColor(),});return drawable;}}

非常感谢你看完这篇文章,不足之处一起完善哦

一起加油

如果给你带来小小的提升那就...

你懂我...

喜欢的点个赞呀

喜欢的点个赞呀

喜欢的点个赞呀

Android流星雨效果---史上最炫,浪漫,值得陪你女朋友一起看~ [捂脸]相关推荐

  1. Android开发者福音-史上最快模拟器genymotion

    Android开发者福音-史上最快模拟器genymotion 2014年3月17日 这个模拟器是我在新公司第一天上班的时候,公司同事推荐给我的,这么好的东西,我自然不忘跟大家分享一下.我们都知道Ecl ...

  2. 微信服务通知消息找回_微信好友删除了怎么找回?史上最快的找回方法,确定不看下么?...

    微信好友删除了怎么找回?史上最快的找回方法,确定不看下么? 微信好友删除了怎么找回?随着现在微信使用的越来越频繁,导致手机通讯录的功能已经退化,可以说现在一个人可能会没有对方的手机号,但是一定不会没有 ...

  3. Android 自定义控件打造史上最简单的侧滑菜单

    侧滑菜单在很多应用中都会见到,最近QQ5.0侧滑还玩了点花样~~对于侧滑菜单,一般大家都会自定义ViewGroup,然后隐藏菜单栏,当手指滑动时,通过Scroller或者不断的改变leftMargin ...

  4. android经典机型,魅族史上的经典机型大盘点 魅族 17 值得期待吗?

    好产品从来不怕晚,魅族 17 系列作为魅族首款 5G 旗舰产品,将会在 4 月底压轴出场,据爆料称这次新品将会采用 " 中杯.大杯到超大杯 " 的产品线划分,更引发了大家对魅族 1 ...

  5. android 床头闹钟,史上最强"叫床"闹钟!让你再也睡不着啦~~(支持 Android)

    不论是夏天吹冷气还是冬天自然凉,都让人舍不得离开最舒服的床,每天总是在不断挣扎中醒来,以前没有手机闹钟的时候,铃铃叫的闹钟一定要设个三四五六个才起的来,后来我们有了手机贪睡功能,可以无限的 repea ...

  6. android功耗iphone,史上最强续航的iPhone实力究竟如何?我们做了一次对比测试

    史上最强续航的iPhone实力究竟如何?我们做了一次对比测试 2020-05-13 19:45:11 4点赞 0收藏 0评论 在流言里存在了3年之久的iPhone SE2(iPhone SE2020) ...

  7. 史上最详细店铺运营方案,新手必看!

    新手朋友最犯愁的就是店铺刚起步,没有多少流量,转化又很低,有没有太多资金开直通车.今天,给大家整理了一份比较详细的运营方案,希望可以给你参考. 整改方案主要包括7个方面,接下来我会分别为大家讲解. 史 ...

  8. 头条Android面试题,史上最全的Android面试题集锦(五)

    6.屏幕适配 6.1.基本概念 屏幕尺寸 含义:手机对角线的物理尺寸 单位:英寸(inch),1英寸=2.54cm Android手机常见的尺寸有5寸.5.5寸.6寸,6.5寸等等 屏幕分辨率 含义: ...

  9. 手机1像素线粗_小米1亿像素手机配置全曝光:史上最炫酷呼吸灯!

    小米官方已经定于11月5日发布首款1亿像素拍照手机--小米CC9 Pro. 据悉,小米CC9 Pro采用了一亿像素五摄四闪全焦段的配置,支持双光学防抖.10倍混合光学变焦.50倍数字变焦,拍照对标友商 ...

最新文章

  1. 工业机器人运动规划方法简述
  2. HBase - 数据写入流程解析
  3. CaaS环境下实践经验总结(二):监控系统部署
  4. 14-4-5 17 MySQL 主主同步
  5. elasticSearch6源码分析(10)SettingsModule
  6. 产品经理的必经之路:搭建属于自己的成长模型
  7. 元素水平垂直居中的几种常用方法
  8. JetBrains —— JetBrains系列IDE优化配置(提高启动和运行速度)
  9. python爬虫06 | 你的第一个爬虫,爬取当当网 Top 500 本五星好评书籍
  10. java barrier_Java并发类CyclicBarrier方法详解
  11. Java类加载器 以及类加载器的委托模型
  12. Grafana中文版本 1
  13. VS2015 property manager
  14. .net的XML对象序列化VS WCF中xml序列化问题
  15. uchome登陆机制分析(三)
  16. php函数改变图片大小,php实现修改图片大小的方法
  17. iOS 通过商品短链接跳转京东商品详情页
  18. GGSN与SGSN简介
  19. 全面介绍144芯超高密度光纤配线箱!
  20. 五、需求分析建模之数据库建模

热门文章

  1. 智慧城市 宠物管理系统的重要性 --“遛狗不牵绳-违法”
  2. Microchip最新推出的ATMEGA4809-XPRO开发板简介
  3. 不带搜索框,数据同步请求,产品按字母分组组件
  4. zabbix应用之详细的拓扑图标签--链路流量
  5. HTML学习日记-第二篇
  6. day03_雷神_文件操作
  7. Qt-Q_OBJECT宏及控件提升导致的类重定义问题
  8. 家谱树 (并查集拓扑排序)
  9. window本地运行hadoop 测试用例 failed to create symlink
  10. 【WPF】用100行C#代码实现扫雷