仿爱奇艺在加载视频时的动画,想上张图;

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相关推荐

  1. android高仿奇艺影视,android仿爱奇艺加载动画实例

    本篇文章介绍了android仿爱奇艺加载动画实例,具体代码如下: 效果图: 用到的知识点: Path ValueAnimator 如果对Path和ValueAnimator还不熟悉推荐去看这几个大神的 ...

  2. html实现视频网站,仿爱奇艺,搜狐,迅雷看看(附源码)

    文章目录 1.功能模板 1.1 仿爱奇艺 1.2 仿搜狐视频 1.3 仿迅雷看看 1.4 视频播放 1.5 影视公司官网 2.效果和源码 2.1 源代码 2.2 模板目录 源码下载 作者:xcLeig ...

  3. 仿爱奇艺UI界面(第一天)

    仿爱奇艺UI界面 1.整体布局 是一个Activity,再一个Activity界面中填充不同的Fragment. 主界面是一个LinearLayout布局,在布局中放一个FrameLayout用来做显 ...

  4. 爱奇艺首页底部导航按钮android,仿爱奇艺/腾讯视频ViewPager导航条实现

    仿爱奇艺/腾讯视频ViewPager导航条实现,支持自定义导航条高度,宽度,颜色变化,字体大小变化.支持多种滚动模式,支持自定义每个TabView的样式.项目地址:https://github.com ...

  5. 苹果cms v8模板 高仿爱奇艺带PC+手机模板

    介绍: 苹果cms v8模板 高仿爱奇艺带PC+手机模板 网盘下载地址: http://kekewl.net/frgNDYcaQne0 图片:

  6. 仿爱奇艺视频,腾讯视频,搜狐视频首页推荐位轮播图(二)之SuperIndicator源码分析

    转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼:http://blog.csdn.net/hejjunlin/article/details/52510431 背景:仿爱奇艺视频,腾讯视频 ...

  7. 仿爱奇艺视频,腾讯视频,搜狐视频首页推荐位轮播图介绍(一)

    请尊重分享成果,转载请注明出处:http://blog.csdn.net/hejjunlin/article/details/52327435 前言:本篇只是一个介绍这个一个类库,具体实现思路代码会下 ...

  8. Android源码之高仿爱奇艺

    Android源码之高仿爱奇艺  支持平台:Android   运行环境:Eclipse   开发语言:Java 下载地址:http://www.devstore.cn/code/info/306.h ...

  9. 仿爱奇艺H5电影站v1.1源码

    简介: 一个近乎纯前端的H5影视程序,高仿爱奇艺APP界面,资源全面,更新及时,搜索功能强大,VIP影视免费看,微商公号吸粉利器.本影视站源码采用PHP实时抓取可用资源,以文本缓存方式缓存存储,程序运 ...

最新文章

  1. 网卡故障:弹出界面eth0: 错误:没有找到合适的设备:没有找到可用于链接System eth0 的
  2. Java 洛谷 P1008 三连击
  3. html5 去掉 li的样式,css li 去掉点的样式写法
  4. python--Time(时间)模块
  5. php nginx配置404页面,Nginx实现404页面的几种方法
  6. fh 幅频特性曲线怎么画fl_初学者怎么练习线条?教你如何画出流畅线条的技巧...
  7. c++ 写x64汇编 5参数_怀念9年前用纯C和汇编写的入侵检测软件
  8. 浏览器填写数据,跳转页面返回数据不消失
  9. POJ3617 Best Cow Line【水题】
  10. Linux进阶之LAMP和LNMP动态网站搭建
  11. 微带滤波器摘要_微带低通滤波器的设计
  12. vue省市区联动插件---distpicker
  13. 自己搭的12V 电机驱动电路设计
  14. java抖音字符视频_代码生成抖音文字视频
  15. 使用openoffice任意格式的office转pdf
  16. 什么是智能DNS云解析?云解析如何实现智能解析效果?
  17. 神经网络压缩 剪枝 量化 嵌入式计算优化NCNN mobilenet squeezenet shufflenet
  18. 【MySQL】汇总数据
  19. 深入了解Elasticsearch存储
  20. win10更改mysql密码_win10 修改mysql密码忘了怎么办

热门文章

  1. 微信小程序引用Vant组件库message: 没有找到可以构建的 NPM 包,请确认需要参与构建的 npm 都在 `miniprogramRoot` 目录内...
  2. 基于tiny4412的u-boot移植(二)_ git clone
  3. ADB——连接手机的三种方式
  4. 京东数据库运维自动化体系建设之路
  5. iOS应用的内测签名、分发托管平台:蒲公英内测分发平台简介
  6. 台式计算机无线接入,台式电脑可以无线连接wifi吗
  7. Java常见面试题含答案(第一期)
  8. 工行二维码支付时代来了
  9. 阿里云交互式分析与Presto对比分析及使用注意事项
  10. 大数据到底是什么意思?