分享一个类似星星眨眼的动画效果实现方式。这里涉及到两个类,看官可直接拿来用。

StarView.java

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.VectorDrawable;
import android.support.v4.content.ContextCompat;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import java.util.ArrayList;
import java.util.Random;public class StarView extends View {private Paint mPaint;private Bitmap mStarOn;private Bitmap mStarOff;private int mStarsNumber=10;private ArrayList<StarModel> mStarModelList = null;private int mCenterX, mCenterY;private boolean mAnimatorStatus=true;private Random mRandom;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);mPaint = new Paint();mPaint.setAntiAlias(true);mStarOn = getBitmapFromDrawable(getContext(),android.R.drawable.star_on);mStarOff = getBitmapFromDrawable(getContext(), android.R.drawable.star_off);}private Bitmap getBitmapFromDrawable(Context context, int drawableId) {Drawable drawable = ContextCompat.getDrawable(context, drawableId);if (drawable instanceof BitmapDrawable) {return ((BitmapDrawable) drawable).getBitmap();} else if (drawable instanceof VectorDrawable) {Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);Canvas canvas = new Canvas(bitmap);drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());drawable.draw(canvas);return bitmap;}return null;}/*** 设置星星图片* @param starOn* @param starOff*/public void setStar(int starOn,int starOff){mStarOn=getBitmapFromDrawable(getContext(),starOn);mStarOff=getBitmapFromDrawable(getContext(),starOff);}/*** 设置星星数量* @param number 参数值范围(1-100)* @return 0:设置成功 -1:设置失败*/public int setStarsNumber(int number){if(number<=0||number>100){return -1;}mStarsNumber=number;return 0;}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);mCenterX = getMeasuredWidth() / 2 - mStarOn.getWidth() / 2; // 90mCenterY = getMeasuredHeight() / 2 - mStarOn.getHeight() / 2; // 90}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);Log.i("StarView", "onDraw");if (mStarModelList == null) {return;}calculate(canvas);}//在这个方法里会随机地去改变星星的位置和图片类型,以达到眨眼效果protected void calculate(Canvas canvas){if(mRandom==null){mRandom= new Random();}float angle = 0;int i=0;float startX=0,startY=0;for (StarModel starModel : mStarModelList) {i++;if (i == 0) {angle = (float) ((10 + 270) * Math.PI / 180);startX = (float) Math.cos(angle) * mCenterX * mRandom.nextInt(3) * 0.1f;startY = (float) Math.sin(angle) * mCenterY * mRandom.nextInt(3) * 0.1f;} else if (i == 1) {angle = (float) ((30 + 270) * Math.PI / 180);startX = (float) Math.cos(angle) * mCenterX * mRandom.nextInt(2) * 0.1f;startY = (float) Math.sin(angle) * mCenterY * mRandom.nextInt(3) * 0.1f;} else if (i == 2) {angle = (float) ((40 + 270) * Math.PI / 180);startX = (float) Math.cos(angle) * mCenterX * 0.25f;startY = (float) Math.sin(angle) * mCenterY * 0.4f;} else if (i == 3) {angle = (float) ((60 + 270) * Math.PI / 180);startX = (float) Math.cos(angle) * mCenterX * 0.13f;startY = (float) Math.sin(angle) * mCenterY * 0.33f;} else if (i == 4) {angle = (float) ((50) * Math.PI / 180);startX = (float) Math.cos(angle) * mCenterX * 0.16f;startY = (float) Math.sin(angle) * mCenterY * 0.17f;} else if (i == 5) {angle = (float) ((80) * Math.PI / 180);startX = (float) Math.cos(angle) * mCenterX * 0.05f;startY = (float) Math.sin(angle) * mCenterY * 0.3f;} else if (i == 6) {angle = (float) ((145) * Math.PI / 180);startX = (float) Math.cos(angle) * mCenterX * 0.15f;startY = (float) Math.sin(angle) * mCenterY * 0.28f;} else if (i == 7) {angle = (float) ((205) * Math.PI / 180);startX = (float) Math.cos(angle) * mCenterX * 0.15f;startY = (float) Math.sin(angle) * mCenterY * 0.15f;} else if (i == 8) {angle = (float) ((215) * Math.PI / 180);startX = (float) Math.cos(angle) * mCenterX * mRandom.nextInt(3) * 0.1f;startY = (float) Math.sin(angle) * mCenterY * mRandom.nextInt(3) * 0.1f;} else if (i == 9) {angle = (float) ((225) * Math.PI / 180);startX = (float) Math.cos(angle) * mCenterX * 0.14f;startY = (float) Math.sin(angle) * mCenterY * 0.15f;}else {angle = (float) ((215) * Math.PI / 180);startX = (float) Math.cos(angle) * mCenterX * mRandom.nextInt(3) * 0.1f;startY = (float) Math.sin(angle) * mCenterY * mRandom.nextInt(3) * 0.1f;}starModel.setmStartX(startX);starModel.setmStartY(startY);if (mRandom.nextInt(12) % 2 == 0) {starModel.setmIcon(mStarOn);} else {starModel.setmIcon(mStarOff);}starModel.draw(canvas, mPaint, mCenterX, mCenterY);}}/*** 开始动画* @return*/public void startAnimation() {mAnimatorStatus=true;initStarModel();//这里开启一个线程,不断地去刷新view(调用invalidate方法后调用onDraw)new Thread(){@Overridepublic void run() {super.run();while (mAnimatorStatus){try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}invalidate();}}}.start();}/*** 停止动画*/public void stopAnimation() {mAnimatorStatus=false;}private void initStarModel() {Log.i("StarView","initStarModel");if(mStarModelList==null){mStarModelList = new ArrayList<>(mStarsNumber);}else {mStarModelList.clear();}Bitmap bitmap = mStarOn;for (int i = 0; i < mStarsNumber; i++) {Matrix matrix = new Matrix();StarModel model = new StarModel(bitmap, 0, 0, matrix);mStarModelList.add(model);}}
}

StarModel.java

import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.util.Log;public class StarModel {private Bitmap mIcon;// 图片private float mStartX;// 起始位置private float mStartY;// 起始位置private Matrix mMatrix;// 矩阵public StarModel(Bitmap mIcon, float mStartX, float mStartY, Matrix matrix) {this.mIcon = mIcon;this.mStartX = mStartX;this.mStartY = mStartY;this.mMatrix = matrix;}public void draw(Canvas canvas, Paint paint, int centerX, int centerY) {float left = centerX + mStartX;float top = centerY + mStartY;Log.i("StarModel","centerY: "+centerY+" mStartY: "+mStartY);Log.i("StarModel","left: "+left+" top: "+top);mMatrix.setTranslate(left, top);canvas.drawBitmap(mIcon, mMatrix, paint);}public Bitmap getmIcon() {return mIcon;}public void setmIcon(Bitmap mIcon) {this.mIcon = mIcon;}public float getmStartX() {return mStartX;}public void setmStartX(float mStartX) {this.mStartX = mStartX;}public float getmStartY() {return mStartY;}public void setmStartY(float mStartY) {this.mStartY = mStartY;}public Matrix getmMatrix() {return mMatrix;}public void setmMatrix(Matrix mMatrix) {this.mMatrix = mMatrix;}}

使用方法:

1,在布局文件里面加入StarView

<com.xxx.xxx.xxx.StarViewandroid:id="@+id/star"android:layout_centerInParent="true"android:layout_width="wrap_content"android:layout_height="wrap_content"/>

2,在Activity里调用

final StarView starView = findViewById(R.id.star);
starView.setStar(R.drawable.star,R.drawable.star2);
.....
start_annmotion.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {starView.startAnimation();}
});
findViewById(R.id.stop_annmotion).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {starView.stopAnimation();}
});

Android繁星眨眼动画效果相关推荐

  1. Android 卡片翻转动画效果

    转载请标明出处:http://blog.csdn.net/android_mnbvcxz/article/details/78570594 Android 卡片翻转动画效果 前言 前端时间开发一款应用 ...

  2. Android中具有动画效果的图片资源

    Android动画和Transition系列文章 初识属性动画--使用Animator创建动画 再谈属性动画--介绍以及自定义Interpolator插值器 三谈属性动画--Keyframe以及Vie ...

  3. 【Android笔记25】Android中的动画效果之逐帧动画

    这篇文章,主要介绍Android中的动画效果之逐帧动画. 目录 一.逐帧动画 1.1.什么是逐帧动画 1.2.逐帧动画的使用 (1)创建drawable动画资源<

  4. Android颜色渐变动画效果的实现

    系列文章目录 Android颜色渐变动画效果的实现 文章最后有源码 文章目录 系列文章目录 前言 一.Android中插值器TypeEvaluator. 二.案例效果实现 1.利用Android自带的 ...

  5. android图片gif动画效果,android中类似于gif 实现图片的动画效果

    案例:实现gif动画效果,连续播放图片 由于是转载的,也就没必要多说,直接上代码 案例:在android中实现gif动态图片的效果: EarthAnimationActivity.java packa ...

  6. android属性动画作用范围,Android开发之动画效果浅析(一)

    程序运行效果图: Android动画主要包含补间动画(Tween)View Animation.帧动画(Frame)Drawable Animation.以及属性动画Property Animatio ...

  7. Lottie 站在巨人的肩膀上实现 Android 酷炫动画效果

    说到动画效果,一般都会感到很高端,感觉很酷炫:而小菜技术有限,稍复杂的动画效果也需要很多时间处理,但是遇到时间紧任务重的情况该怎么办呢?那就尝试一下 Lottie 吧,酷炫的动画集成却相当简单,还支持 ...

  8. Android 雪花飘落动画效果 自定义View

    在码农的世界里,优美的应用体验,来源于程序员对细节的处理以及自我要求的境界,年轻人也是忙忙碌碌的码农中一员,每天.每周,都会留下一些脚印,就是这些创作的内容,有一种执着,就是不知为什么,如果你迷茫,不 ...

  9. android 颜色过渡动画效果,Android buttom textview 颜色平滑过渡的动画效果

    1.TransitionDrawable.例如,在文件夹中绘制一个xml文件,你可以这样写: 然后,在你的xml的实际检视你都引用这个TransitionDrawable在android:backgr ...

最新文章

  1. 几个比较冷门的prototype扩展方法:去掉html标签、去掉a标签、去掉style样式,以及判断是否为html代码的代码片段
  2. python常用模块(二)
  3. BCVP开发者社区2022专属周边第一弹
  4. osgi java_使普通的旧Java OSGi兼容
  5. CVPR 2019|手写签名认证的逆鉴别网络
  6. 循环与函数及相关例子
  7. java 循环删除hashmap中的键值对,解决java.util.ConcurrentModificationException报错
  8. 编程过度防御?只有缺乏自信的程序员才会这样做
  9. Python 第三方模块安装出现的问题和解决方案.
  10. 面向对象银角大王补充2-self就是调用当前方法的对象-静态字段,公有属性-封装的理解-继承的理解,普通方法,静态方法...
  11. Unix/Mac系统下的文件在Windows里打开的话,所有文字会变成一行——怎么将Unix/Mac系统下的文件转换到Windows系统下
  12. iOS Xcode Implicit declaration of function 'callbackBlock' is invalid in C99
  13. 西门子plc程序好坏判定
  14. 红警辅助脚本_红警Ol全能辅助_红警自动切小号刷资源_加速采集打野_建筑升级……
  15. 谷歌创始人布林申请离婚:身价930亿美元 曾出轨前妻闺蜜
  16. b站python弹幕签到_B站弹幕实时效果python
  17. Django基础-中文文档
  18. 使用备份软件快速备份VMware虚拟机
  19. 面试说了这几句话,offer铁定无望!
  20. Android自定义Drawable第十五式之啡常OK

热门文章

  1. 为什么a标签不能设置宽高?
  2. react(子传父、父传子)
  3. java将多个文件转成压缩包下载
  4. 计算机毕业设计之java+ssm学生网上请假系统
  5. C++沙海拾遗(三)
  6. 检测器backbone和neck哪个更重要,达摩院新作有不一样的答案
  7. java中float、double和BigDecimal的精度问题(fastjson、Jackson以及实例化的方式)
  8. 计算机word保存如何操作,电脑word怎么保存 在电脑上word打字怎么保存
  9. window10安装minio
  10. 材料写作素材:关于“大”排比句40例