仿爱奇艺加载dialog
仿爱奇艺在加载视频时的动画,想上张图;
gif的效果有点卡,先说一下实现的方法,
主要的难点在于怎样将三角形画到空间的中间,我通过三角形中心到顶角的距离来确定三角形的大小,
当三角形在中间时角a的大小为60度,线段A的长度为已知的自己设定的,我这里设定的为40像素,则C的长度为
A乘以sin(a) B的长度为A乘以cos(a); 这里假设空间的长宽各位200的正方形,所以三角形的上顶点的坐标为(100,60),左下顶点为(200 / 2 - A * cos(a)),右顶点的坐标为(200 / 2,A* sin(a)),确定了三角形的三个顶点就可以在通过drawPath画三角形了,代码如下:
path.moveTo(width / 2, height / 2 - length); path.lineTo(formantNumber(width / 2 - Math.sin(Math.PI / 3) * length), width / 2 + length / 2); path.lineTo(formantNumber(width / 2 + Math.sin(Math.PI / 3) * length), width / 2 + length / 2); path.close();
当布局加载完成后开始动画,由于但旋转的时候弧形的扫过的角度为360度,旋转时看不出来圆弧的旋转,
/** * 布局加载完成后开始动画 */ @Override protected void onFinishInflate() {super.onFinishInflate();startAnimation(rotateAnimation); }
/** * 初始化动画 */ private void initRouteAnimation() {rotateAnimation = new RotateAnimation(0, 1800, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);rotateAnimation.setInterpolator(new AccelerateDecelerateInterpolator());rotateAnimation.setDuration(1500);rotateAnimation.setFillAfter(false);rotateAnimation.setAnimationListener(this); }
当动画执行完后将将扫过的角度设置为0度,重新绘制
/** * 动画介绍后的回调 * * @param animation */ @Override public void onAnimationEnd(Animation animation) {sweepAngle = 0;isAfterAnimation = true;invalidate(); }
下面是onDraw方法的代码,我在这里判断当扫过的角度为330度的时候,也就是sweepAngle为360的时候,重绘视图,然后开启动画
@Override protected void onDraw(Canvas canvas) {super.onDraw(canvas);if (isAfterAnimation) {sweepAngle += 30;if (sweepAngle >= 360) {isAfterAnimation = false;drawPicture(canvas, 360);startAnimation(rotateAnimation);} else {drawPicture(canvas, sweepAngle);postInvalidateDelayed(30);}} else {drawPicture(canvas, 360);} }
下面是重写onMeasure方法的代码,在measureWidth方法中判断计算模式,返回空间的宽度,计算模式为wrap_content的时候宽度为200px,计算高度的方法一样,这里不再累赘;
@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);width = measureWidth(widthMeasureSpec);height = measureHeight(heightMeasureSpec);setMeasuredDimension(measureWidth(widthMeasureSpec), measureHeight(heightMeasureSpec)); }
/** * 计算控件宽度 * * @param widthMeasureSpec * @return */ private int measureWidth(int widthMeasureSpec) {int result = 0;int mode = MeasureSpec.getMode(widthMeasureSpec);int size = MeasureSpec.getSize(widthMeasureSpec);if (mode == MeasureSpec.EXACTLY) {result = size;} else {result = 200;if (mode == MeasureSpec.AT_MOST) {result = Math.min(result, size);}}return result; }
完整代码:
package com.example.mengsong.demo01;/** * Created by MengSong on 2016/12/20. */ import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.LinearGradient; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.Path; import android.graphics.Rect; import android.graphics.RectF; import android.graphics.Shader; import android.util.AttributeSet; import android.util.Log; import android.view.View; import android.view.animation.AccelerateDecelerateInterpolator; import android.view.animation.Animation; import android.view.animation.RotateAnimation; import android.view.animation.ScaleAnimation; import android.widget.TextView;/** * Created by MengSong on 2016/12/15. */ public class MyView extends View implements Animation.AnimationListener {//绘制三角形的路径 private Path path;//绘制三角形的画笔 public Paint mPaintTriangle;//绘制弧形的画笔 public Paint mPaintArc;//三角形的中心到顶点的距离 private int length = 40;//圆弧的半径 private int arcRadius = 80;//圆弧扫过的角度 private float sweepAngle = 360;private boolean isAfterAnimation = false;//旋转动画 private RotateAnimation rotateAnimation;//圆弧所在的矩形 private RectF rect;//空间的宽度 private int width;//控件的高度 private int height;public MyView(Context context) {super(context);init();}public MyView(Context context, AttributeSet attrs) {super(context, attrs);init();}/** * 布局加载完成后开始动画 */ @Override protected void onFinishInflate() {super.onFinishInflate();startAnimation(rotateAnimation);}/** * 初始化相关属性 */ private void init() {mPaintTriangle = new Paint();mPaintTriangle.setDither(true);mPaintTriangle.setAntiAlias(true);mPaintTriangle.setStyle(Paint.Style.FILL);mPaintTriangle.setColor(Color.GREEN);mPaintArc = new Paint();mPaintArc.setDither(true);mPaintArc.setAntiAlias(true);mPaintArc.setStrokeWidth(3);mPaintArc.setStyle(Paint.Style.STROKE);mPaintArc.setColor(Color.GREEN);path = new Path();initRouteAnimation();}/** * 初始化三角形的path弧形的所在的矩形 * * @param w * @param h * @param oldw * @param oldh */ @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) {super.onSizeChanged(w, h, oldw, oldh);rect = new RectF(width / 2 - arcRadius, height / 2 - arcRadius, width / 2 + arcRadius, height / 2 + arcRadius);path.moveTo(width / 2, height / 2 - length);path.lineTo(formantNumber(width / 2 - Math.sin(Math.PI / 3) * length), width / 2 + length / 2);path.lineTo(formantNumber(width / 2 + Math.sin(Math.PI / 3) * length), width / 2 + length / 2);path.close();}@Override protected void onDraw(Canvas canvas) {super.onDraw(canvas);if (isAfterAnimation) {sweepAngle += 30;if (sweepAngle >= 360) {isAfterAnimation = false;drawPicture(canvas, 360);startAnimation(rotateAnimation);} else {drawPicture(canvas, sweepAngle);postInvalidateDelayed(30);}} else {drawPicture(canvas, 360);}}private void drawPicture(Canvas canvas, float sweepAngle) {//画三角形 canvas.drawPath(path, mPaintTriangle);//画扇形 canvas.drawArc(rect, 270, sweepAngle, false, mPaintArc);}/** * 保留四位小数 * * @param number * @return */ private float formantNumber(double number) {java.text.DecimalFormat df = new java.text.DecimalFormat("#.####");String format = df.format(number);return Float.valueOf(format.trim());}/** * 动画介绍后的回调 * * @param animation */ @Override public void onAnimationEnd(Animation animation) {sweepAngle = 0;isAfterAnimation = true;invalidate();}@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);width = measureWidth(widthMeasureSpec);height = measureHeight(heightMeasureSpec);setMeasuredDimension(measureWidth(widthMeasureSpec), measureHeight(heightMeasureSpec));}/** * 计算控件宽度 * * @param widthMeasureSpec * @return */ private int measureWidth(int widthMeasureSpec) {int result = 0;int mode = MeasureSpec.getMode(widthMeasureSpec);int size = MeasureSpec.getSize(widthMeasureSpec);if (mode == MeasureSpec.EXACTLY) {result = size;} else {result = 200;if (mode == MeasureSpec.AT_MOST) {result = Math.min(result, size);}}return result;}/** * 计算控件高度 * * @param heightMeasureSpec * @return */ private int measureHeight(int heightMeasureSpec) {int result = 0;int mode = MeasureSpec.getMode(heightMeasureSpec);int size = MeasureSpec.getSize(heightMeasureSpec);if (mode == MeasureSpec.EXACTLY) {result = size;} else {result = 200;if (mode == MeasureSpec.AT_MOST) {result = Math.min(result, size);}}return result;}/** * 初始化动画 */ private void initRouteAnimation() {rotateAnimation = new RotateAnimation(0, 1800, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);rotateAnimation.setInterpolator(new AccelerateDecelerateInterpolator());rotateAnimation.setDuration(1500);rotateAnimation.setFillAfter(false);rotateAnimation.setAnimationListener(this);}@Override public void onAnimationStart(Animation animation) {}@Override public void onAnimationRepeat(Animation animation) {} }
仿爱奇艺加载dialog相关推荐
- android高仿奇艺影视,android仿爱奇艺加载动画实例
本篇文章介绍了android仿爱奇艺加载动画实例,具体代码如下: 效果图: 用到的知识点: Path ValueAnimator 如果对Path和ValueAnimator还不熟悉推荐去看这几个大神的 ...
- html实现视频网站,仿爱奇艺,搜狐,迅雷看看(附源码)
文章目录 1.功能模板 1.1 仿爱奇艺 1.2 仿搜狐视频 1.3 仿迅雷看看 1.4 视频播放 1.5 影视公司官网 2.效果和源码 2.1 源代码 2.2 模板目录 源码下载 作者:xcLeig ...
- 仿爱奇艺UI界面(第一天)
仿爱奇艺UI界面 1.整体布局 是一个Activity,再一个Activity界面中填充不同的Fragment. 主界面是一个LinearLayout布局,在布局中放一个FrameLayout用来做显 ...
- 爱奇艺首页底部导航按钮android,仿爱奇艺/腾讯视频ViewPager导航条实现
仿爱奇艺/腾讯视频ViewPager导航条实现,支持自定义导航条高度,宽度,颜色变化,字体大小变化.支持多种滚动模式,支持自定义每个TabView的样式.项目地址:https://github.com ...
- 苹果cms v8模板 高仿爱奇艺带PC+手机模板
介绍: 苹果cms v8模板 高仿爱奇艺带PC+手机模板 网盘下载地址: http://kekewl.net/frgNDYcaQne0 图片:
- 仿爱奇艺视频,腾讯视频,搜狐视频首页推荐位轮播图(二)之SuperIndicator源码分析
转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼:http://blog.csdn.net/hejjunlin/article/details/52510431 背景:仿爱奇艺视频,腾讯视频 ...
- 仿爱奇艺视频,腾讯视频,搜狐视频首页推荐位轮播图介绍(一)
请尊重分享成果,转载请注明出处:http://blog.csdn.net/hejjunlin/article/details/52327435 前言:本篇只是一个介绍这个一个类库,具体实现思路代码会下 ...
- Android源码之高仿爱奇艺
Android源码之高仿爱奇艺 支持平台:Android 运行环境:Eclipse 开发语言:Java 下载地址:http://www.devstore.cn/code/info/306.h ...
- 仿爱奇艺H5电影站v1.1源码
简介: 一个近乎纯前端的H5影视程序,高仿爱奇艺APP界面,资源全面,更新及时,搜索功能强大,VIP影视免费看,微商公号吸粉利器.本影视站源码采用PHP实时抓取可用资源,以文本缓存方式缓存存储,程序运 ...
最新文章
- 网卡故障:弹出界面eth0: 错误:没有找到合适的设备:没有找到可用于链接System eth0 的
- Java 洛谷 P1008 三连击
- html5 去掉 li的样式,css li 去掉点的样式写法
- python--Time(时间)模块
- php nginx配置404页面,Nginx实现404页面的几种方法
- fh 幅频特性曲线怎么画fl_初学者怎么练习线条?教你如何画出流畅线条的技巧...
- c++ 写x64汇编 5参数_怀念9年前用纯C和汇编写的入侵检测软件
- 浏览器填写数据,跳转页面返回数据不消失
- POJ3617 Best Cow Line【水题】
- Linux进阶之LAMP和LNMP动态网站搭建
- 微带滤波器摘要_微带低通滤波器的设计
- vue省市区联动插件---distpicker
- 自己搭的12V 电机驱动电路设计
- java抖音字符视频_代码生成抖音文字视频
- 使用openoffice任意格式的office转pdf
- 什么是智能DNS云解析?云解析如何实现智能解析效果?
- 神经网络压缩 剪枝 量化 嵌入式计算优化NCNN mobilenet squeezenet shufflenet
- 【MySQL】汇总数据
- 深入了解Elasticsearch存储
- win10更改mysql密码_win10 修改mysql密码忘了怎么办
热门文章
- 微信小程序引用Vant组件库message: 没有找到可以构建的 NPM 包,请确认需要参与构建的 npm 都在 `miniprogramRoot` 目录内...
- 基于tiny4412的u-boot移植(二)_ git clone
- ADB——连接手机的三种方式
- 京东数据库运维自动化体系建设之路
- iOS应用的内测签名、分发托管平台:蒲公英内测分发平台简介
- 台式计算机无线接入,台式电脑可以无线连接wifi吗
- Java常见面试题含答案(第一期)
- 工行二维码支付时代来了
- 阿里云交互式分析与Presto对比分析及使用注意事项
- 大数据到底是什么意思?