效果

先来看下效果:

五角星gif图显示速度较实际慢,代码中可自定义闪烁的时长。

自定义View

自定义 ShiningStarView 的Kotlin代码:

import android.animation.ValueAnimator
import android.animation.ValueAnimator.AnimatorUpdateListener
import android.content.Context
import android.graphics.*
import android.util.AttributeSet
import android.view.View
import android.view.animation.Animation
import android.view.animation.LinearInterpolatorclass ShiningStarView @JvmOverloads constructor(context: Context,attrs: AttributeSet? = null,defStyleAttr: Int = 0
) : View(context, attrs, defStyleAttr), AnimatorUpdateListener {private val mStarRadius: Floatprivate val mStarPaint: Paintprivate var mStarPath: Path? = nullprivate var mAlphaValue = 255init {val a = context.obtainStyledAttributes(attrs, R.styleable.ShiningStarView)val mStarColor = a.getColor(R.styleable.ShiningStarView_starColor, Color.YELLOW)mStarRadius = a.getDimension(R.styleable.ShiningStarView_starRadius, 90f)a.recycle()mStarPaint = Paint(Paint.ANTI_ALIAS_FLAG)mStarPaint.color = mStarColormStarPaint.maskFilter = BlurMaskFilter(mStarRadius / 3, BlurMaskFilter.Blur.SOLID) //外发光效果val circleAlphaValueAnimator = ValueAnimator.ofInt(0, 255)circleAlphaValueAnimator.duration = 1000circleAlphaValueAnimator.repeatCount = Animation.INFINITEcircleAlphaValueAnimator.repeatMode = ValueAnimator.REVERSEcircleAlphaValueAnimator.interpolator = LinearInterpolator()circleAlphaValueAnimator.addUpdateListener(this)circleAlphaValueAnimator.start()}override fun onDraw(canvas: Canvas) {super.onDraw(canvas)canvas.save()mStarPaint.alpha = mAlphaValuecanvas.drawPath(mStarPath!!, mStarPaint)canvas.restore()}override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {super.onMeasure(widthMeasureSpec, heightMeasureSpec)var width = MeasureSpec.getSize(widthMeasureSpec)var height = MeasureSpec.getSize(heightMeasureSpec)val widthMode = MeasureSpec.getMode(widthMeasureSpec)val heightMode = MeasureSpec.getMode(widthMeasureSpec)if (widthMode == MeasureSpec.AT_MOST || widthMode == MeasureSpec.UNSPECIFIED) {width = mStarRadius.toInt() * 2}if (heightMode == MeasureSpec.AT_MOST || heightMode == MeasureSpec.UNSPECIFIED) {height = mStarRadius.toInt() * 2}mStarPath = calculateStarPath(mStarRadius)setMeasuredDimension(width, height)}private fun calculateStarPath(radius: Float): Path {val starPath = Path()//360度除以5个角, 比如5个角 每个角72度,利用cos 、sin计算位置 1度=π/180 以顶角尖作为坐标轴原点val outRadian = Math.PI / 180.0 * (90.0 - 360.0 / 5 / 2) //右角尖与x轴的弧度val pRadian = (1.0 - 0.5) * outRadian //钝角点与x轴的弧度val pRightRadian = 0.5 * outRadian //钝角点到原点与右角尖的弧度val centerLength = radius * Math.sin(Math.PI / 5) //右角尖到顶角间的中心点到原点的距离val pLength = centerLength / Math.cos(pRightRadian) //钝角点到原点距离val pX = pLength * Math.sin(pRadian)val pY = pLength * Math.cos(pRadian)starPath.moveTo(0f, 0f)for (i in 0..4) {val angle = Math.PI / 180 * 360 / 5 * i //每次旋转坐标轴角度 angle== π/180 * (360 / 5)val sinA = Math.sin(angle)val cosA = Math.cos(angle)val rX2 = (radius * sinA).toFloat()val rY2 = (-radius * cosA + radius).toFloat()val pX2 = (pX * cosA - (pY - radius) * sinA).toFloat()val pY2 = ((pY - radius) * cosA + pX * sinA + radius).toFloat()starPath.lineTo(rX2, rY2)starPath.lineTo(pX2, pY2)}starPath.close()val matrix = Matrix()//坐标系平移matrix.setTranslate(radius, 0f)starPath.transform(matrix)return starPath}override fun onAnimationUpdate(animation: ValueAnimator) {mAlphaValue = animation.animatedValue as Intinvalidate()}
}

自定义 ShiningStarView 的Java代码:

import android.animation.ValueAnimator;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.BlurMaskFilter;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Path;
import android.util.AttributeSet;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.LinearInterpolator;import androidx.annotation.Nullable;public class ShiningStarView extends View implements ValueAnimator.AnimatorUpdateListener {private final float mStarRadius;private final Paint mStarPaint;private Path mStarPath;private int mAlphaValue = 255;public ShiningStarView(Context context) {this(context, null);}public ShiningStarView(Context context, @Nullable AttributeSet attrs) {this(context, attrs, 0);}public ShiningStarView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {super(context,attrs,defStyleAttr);final TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ShiningStarView);int mStarColor = a.getColor(R.styleable.ShiningStarView_starColor, Color.YELLOW);mStarRadius = a.getDimension(R.styleable.ShiningStarView_starRadius, 90);a.recycle();mStarPaint = new Paint(Paint.ANTI_ALIAS_FLAG);mStarPaint.setColor(mStarColor);mStarPaint.setMaskFilter(new BlurMaskFilter(mStarRadius / 3, BlurMaskFilter.Blur.SOLID)); //外发光效果ValueAnimator circleAlphaValueAnimator = ValueAnimator.ofInt(0, 255);circleAlphaValueAnimator.setDuration(1000);circleAlphaValueAnimator.setRepeatCount(Animation.INFINITE);circleAlphaValueAnimator.setRepeatMode(ValueAnimator.REVERSE);circleAlphaValueAnimator.setInterpolator(new LinearInterpolator());circleAlphaValueAnimator.addUpdateListener(this);circleAlphaValueAnimator.start();}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);canvas.save();mStarPaint.setAlpha(mAlphaValue);canvas.drawPath(mStarPath, mStarPaint);canvas.restore();}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);int width = MeasureSpec.getSize(widthMeasureSpec);int height = MeasureSpec.getSize(heightMeasureSpec);int widthMode = MeasureSpec.getMode(widthMeasureSpec);int heightMode = MeasureSpec.getMode(widthMeasureSpec);if(widthMode == MeasureSpec.AT_MOST || widthMode == MeasureSpec.UNSPECIFIED) {width = (int) mStarRadius * 2;}if(heightMode == MeasureSpec.AT_MOST || heightMode == MeasureSpec.UNSPECIFIED) {height = (int) mStarRadius * 2;}mStarPath = calculateStarPath(mStarRadius);setMeasuredDimension(width, height);}private Path calculateStarPath(float radius){Path starPath = new Path();//360度除以5个角, 比如5个角 每个角72度,利用cos 、sin计算位置 1度=π/180 以顶角尖作为坐标轴原点double outRadian = Math.PI / 180.0 * (90.0 - 360.0 / 5 / 2); //右角尖与x轴的弧度double pRadian = (1.0 - 0.5) * outRadian; //钝角点与x轴的弧度double pRightRadian = 0.5 * outRadian; //钝角点到原点与右角尖的弧度double centerLength = radius * Math.sin(Math.PI / 5); //右角尖到顶角间的中心点到原点的距离double pLength = centerLength / Math.cos(pRightRadian); //钝角点到原点距离double pX = pLength * Math.sin(pRadian);double pY = pLength * Math.cos(pRadian);starPath.moveTo(0,0);for (int i = 0;i < 5;i++){double angle = Math.PI / 180 * 360 / 5 * i; //每次旋转坐标轴角度 angle== π/180 * (360 / 5)double sinA = Math.sin(angle);double cosA = Math.cos(angle);float rX2 = (float) (radius * sinA);float rY2 = (float) (-radius * cosA + radius);float pX2 = (float) (pX * cosA - (pY - radius) * sinA);float pY2 = (float) ((pY - radius) * cosA + pX*sinA + radius);starPath.lineTo(rX2,rY2);starPath.lineTo(pX2,pY2);}starPath.close();Matrix matrix = new Matrix();//坐标系平移matrix.setTranslate(radius,0);starPath.transform(matrix);return starPath;}@Overridepublic void onAnimationUpdate(ValueAnimator animation) {mAlphaValue = (int) animation.getAnimatedValue();invalidate();}
}

通过 BlurMaskFilter 实现外发光效果,坐标轴以顶角为原点进行数学计算,得到五角星的Path轨迹。根据弧度(1角度=π/180弧度)来计算边长,根据五角星的对称原理和直角三角形的原理,借助sin和cos等公式计算对应坐标。通过动画进行循环绘制,绘制不同的透明度实现闪闪发光效果。
自定义View的属性定义 attrs.xml 如下:

<resources><declare-styleable name="ShiningStarView"><attr name="starRadius" format="dimension"/><attr name="starColor" format="color"/></declare-styleable>
</resources>

其中通过 starRadius 属性定义五角星的半径(以此作为大小);通过 starColor 属性为五角星颜色。
在界面中定义如下:

    <com.example.customui.ShiningStarViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"app:starRadius="30dp"app:starColor="@color/yellow"/>

Android绘制五角星并实现星星闪耀发光效果相关推荐

  1. android绘制半圆弧线_android实现简单圆弧效果

    最近项目完成就开始搞一些有用没用的东西,以前面试的时候有人问我那种圆弧效果怎么做,还问我翻牌效果,我只看过,没有做过,现在有空了,而且想到可能会用到就做个简单的 圆弧很简单,自定义个View,创建个P ...

  2. 计算机画图星星怎么画,海龟编辑器五角星怎么画 绘制五角星就是这么简单

    海龟编辑器作为一款面向少儿的Python编辑器,它可以让孩子通过图形化的方式学习Python,很多用户在刚开始使用时不知道怎么绘制最基本的图形,小编将绘制五角星的方式通过两种方法进行讲解,想知道的赶快 ...

  3. android canvas光晕绘制_Android 绘制发光效果

    之前在看别人写自定义view作绘制的时候,看到别人家的view自带发光效果,看起来也是蛮炫酷的,于是自己也抽出时间来试用一下,这里做了一个模仿太阳的各种状态样式. 先上效果先上效果: 实现方式: pu ...

  4. android 控件发光_如何在android中的按钮周围制作动画/常量发光效果?

    的按钮有一个背景绘制的图像,我只是想拥有它周围的发光效果,使它有点与音乐播放 我已经搜查各地的多个线程共鸣,他们要么只是一个ImageView的,或在压制,或位图,所以不一定是我寻求 这里是我的按钮X ...

  5. qt 绘制五角星图形

    << qt5.9 c++开发指南 >> 第8章 三角函数是基本初等函数之一,是以角度(数学上最常用弧度制,下同)为自变量,角度对应任意角终边与单位圆交点坐标或其比值为因变量的函 ...

  6. android星星爆炸效果图,Android_Android仿开心消消乐大树星星无限循环效果,啥都不说先上效果图,这个是 - phpStudy...

    Android仿开心消消乐大树星星无限循环效果 啥都不说先上效果图,这个是我项目里的效果: 下面的是我抽取出来的 demo 适配啥的我基本上都做好了没做其他的 ok 下面 说一下思路把 首先 说一下原 ...

  7. 利用Canvas实现绘图功能(绘制五角星)

    文章目录 要求 过程 一.绘制五角星 二.生成随机数 三.利用循环,生成10个五角星 四.完整代码 存在的问题 要求 利用Canvas编程实现在屏幕上随机位置绘制10个随机大小(边长为20-100dp ...

  8. 【青少年编程】绘制五角星

    Scratch竞赛交流群已成立(适合6至18周岁的青少年),公众号后台回复[Scratch],即可进入. 如果加入了之前的社群不需要重复加入. 类比思维就是指把两个或者两类事物进行比较,并进行逻辑推理 ...

  9. Android绘制流程

    一.前言 1.1.C++界面库 MFC.WTL.DuiLib.QT.Skia.OpenGL. Android里面的画图分为2D和3D两种: 2D是由Skia 来实现的,3D部分是由OpenGL实现的. ...

最新文章

  1. java xml 节点换行_Winform中对xml文件进行保存时空白节点自动换行问题的解决
  2. java spring mysql配置_java相关:mysql+spring+mybatis实现数据库读写分离的代码配置
  3. Java 操作 HDFS
  4. C#2005中如何把unicode编码的数字转化为EBCDIC编码
  5. bootstrap快速入门_在5分钟内学习Bootstrap 4-快速入门指南
  6. How to Fix Git Push Time Consuming Issue in a Big Team?
  7. 纸巾,理由最充分的涨价
  8. fifo算法_前端进阶算法6:一看就懂的队列及配套算法题
  9. AIR3.0针对移动设备的高性能渲染方案
  10. 【C# RDLC】 RDLC报表的部署问题
  11. 清华大学计算机考研总结,2020考研清华大学计算机考研考试科目总结
  12. Hive Hsql 常用命令
  13. 系统集成项目管理师 高项论文 项目进度管理
  14. 主成分分析法步骤matlab,主成分分析法matlab实现程序
  15. Mac 中composer的安装
  16. HTML5-企业宣传6款免费源码尽在h5edu.cn
  17. 计算机硬件的组成、python的开发层面及语法介绍
  18. 判断素数的方法(孪生素数)
  19. 校招基本告一段落,总结一下
  20. VS2010工程文件

热门文章

  1. React学习-event.preventDefault()方法的简单介绍
  2. PS制作德罗斯特效应效果
  3. [转载自网络http://www.qnwz.net/zawen/40804.html]来生想做哪国人?
  4. QT版:QQ面板抽屉效果实现
  5. fatal: 不是git 仓库(或者任何父目录):.git 解决办法
  6. 题目 1010: [编程入门]利润计算
  7. 在模拟器上玩儿魅族版的游戏(手机平台版本的游戏)
  8. 浏览器打印边距,默认/无边距,占满1页A4
  9. ubuntu Vscode打不开 提示error:unable to write program user data 且多数软件不能正常打开的一种可能性
  10. windows7+hmailserver+squirrelmail搭建邮件服务器