Android加载动画系列—— CircularSmileLoadingAnim
来源:互联网 发布:cisco 配置多个端口 编辑:程序博客网 时间:2024/06/06 04:11
Android加载动画系列—— CircularSmileLoadingAnim
一次记录一次分享,CircularSmileLoadingAnim微笑面对一切烦恼,即使生活再忙再累,也不要忘了给自己一个大大的微笑。
让我们先来看看效果图:
1、CircularSmileLoadingAnim.java源码如下:
public class CircularSmileLoadingAnim extends View { private Paint mPaint; private float mWidth = 0f; private float mEyeWidth = 0f; private float mPadding = 0f; private float startAngle = 0f; private boolean isSmile = false; RectF rectF = new RectF(); public CircularSmileLoadingAnim(Context context) { this(context, null); } public CircularSmileLoadingAnim(Context context, AttributeSet attrs) { this(context, attrs, 0); } public CircularSmileLoadingAnim(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); initPaint(); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); if (getMeasuredWidth() > getHeight()) mWidth = getMeasuredHeight(); else mWidth = getMeasuredWidth(); mPadding = dip2px(10); mEyeWidth = dip2px(3); } private int dip2px(float dpValue) { final float scale = getContext().getResources().getDisplayMetrics().density; return (int) (dpValue * scale + 0.5f); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); rectF = new RectF(mPadding, mPadding, mWidth - mPadding, mWidth - mPadding); mPaint.setStyle(Paint.Style.STROKE); canvas.drawArc(rectF, startAngle, 180, false, mPaint); mPaint.setStyle(Paint.Style.FILL); if (isSmile) { canvas.drawCircle(mPadding + mEyeWidth + mEyeWidth / 2, mWidth / 3, mEyeWidth, mPaint); canvas.drawCircle(mWidth - mPadding - mEyeWidth / 2, mWidth / 3, mEyeWidth, mPaint); } } private void initPaint() { mPaint = new Paint(); mPaint.setAntiAlias(true); mPaint.setStyle(Paint.Style.STROKE); mPaint.setColor(Color.WHITE); mPaint.setStrokeWidth(dip2px(2)); } public void startAnim() { stopAnim(); startViewAnim(0f, 1f, 1500); } ValueAnimator valueAnimator; float mAnimatedValue = 0f; public void stopAnim() { if (valueAnimator != null) { clearAnimation(); isSmile = false; mAnimatedValue = 0f; startAngle = 0f; valueAnimator.setRepeatCount(0); valueAnimator.cancel(); valueAnimator.end(); } } private ValueAnimator startViewAnim(float startF, final float endF, long time) { valueAnimator = ValueAnimator.ofFloat(startF, endF); valueAnimator.setDuration(time); valueAnimator.setInterpolator(new LinearInterpolator()); valueAnimator.setRepeatCount(ValueAnimator.INFINITE); valueAnimator.setRepeatMode(ValueAnimator.RESTART); valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { mAnimatedValue = (float) valueAnimator.getAnimatedValue(); if (mAnimatedValue < 0.5) { isSmile = false; startAngle = 720 * mAnimatedValue; } else { startAngle = 720; isSmile = true; } invalidate(); } }); valueAnimator.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); } @Override public void onAnimationRepeat(Animator animation) { super.onAnimationRepeat(animation); } @Override public void onAnimationStart(Animator animation) { super.onAnimationStart(animation); } }); if (!valueAnimator.isRunning()) { valueAnimator.start(); } return valueAnimator; }}
2、接下来就是在layout中引用自定义的动画控件,如下所示:
<com.cyril.loadinganim.CircularSmileLoadingAnim android:id="@+id/circularsmile" android:layout_width="50dp" android:layout_height="50dp" />
3、然后在Activity中实现动画的播放和停止,使用事例如下:
circularSmileLoadingAnim = (CircularSmileLoadingAnim) findViewById(R.id.circularsmile);circularSmileLoadingAnim.startAnim();
4、 最后小编双手奉上源码的下载地址:http://download.csdn.net/detail/zhimingshangyan/9582830
1 0
- Android加载动画系列—— CircularSmileLoadingAnim
- Android加载动画系列——BalloonLoading
- Android加载动画系列——WaterBottleLoading
- Android加载动画系列——BatteryLoading
- Android加载动画系列——CircularLoadingAnim
- Android加载动画系列——CircularCDLoadingAnim
- Android加载动画系列——CircularRingLoadingAnim
- Android加载动画系列—— CircularJumpLoadingAnim
- Android加载动画系列——CircularZoomLoadingAnim
- Android加载动画系列—— LineWithTextLoadingAnim
- Android加载动画系列——WifiLoadingAnim
- Android加载动画系列——PlayBallLoadingAnim
- Android加载动画系列——PlayBallLoadingAnim
- Android加载动画系列——GearsLoadingAnim
- Android加载动画系列——ChromeLogoLoadingAnim
- Android加载动画系列——GearsTwoLoadingAnim
- Android加载动画系列—— GhostLoadingAnim
- Android加载动画系列——FinePoiStarLoadingAnim
- PHP的51个Memcached方法(32-41)
- URAL 1962 In Chinese Restaurant 并查集
- python基础[list,tuple,dictionary,set]
- 图形_part1
- 带分割符的参数提取 C语言
- Android加载动画系列—— CircularSmileLoadingAnim
- 暑假集训第1天链表-数据结构实验之链表三:链表的逆置
- npm install -g ios-deploy 失败问题的解决方法
- F28027第二节课---系统时钟(一)
- 图形part_2
- 在与没有参考系时,主动选择或者被动选择
- Python 基础练习02
- Jeckin搭建
- 事件