本文实例为大家分享了Android实现播放效果的具体代码,供大家参考,具体内容如下

一、首先看效果

二、实现原理

使用贝塞尔曲线实现滑动效果,在使用属性动画实现水波纹效果,然后就能实现以上效果

三、实现

1、先封装动画框架,创建动画基础类

PathPoint.java

public class PathPoint {

public static final int MOVE = 0;

public static final int LINE = 1;

public static final int CURVE = 2;

float mControl0X, mControl0Y;

float mControl1X, mControl1Y;

public float mX, mY;

int mOperation;

//line/move

private PathPoint(int operation, float x, float y) {

this.mOperation = operation;

this.mX = x;

this.mY = y;

}

//curve

private PathPoint(float c0X, float c0Y, float c1X, float c1Y, float x, float y) {

this.mControl0X = c0X;

this.mControl0Y = c0Y;

this.mControl1X = c1X;

this.mControl1Y = c1Y;

this.mX = x;

this.mY = y;

this.mOperation = CURVE;

}

public static PathPoint moveTo(float x, float y) {

return new PathPoint(MOVE, x, y);

}

public static PathPoint lineTo(float x, float y) {

return new PathPoint(LINE, x, y);

}

public static PathPoint curveTo(float c0X, float c0Y, float c1X, float c1Y, float x, float y) {

return new PathPoint(c0X, c0Y, c1X, c1Y, x, y);

}

}

2、创建动画集合类,并且保存绘制轨迹

AnimatorPath

public class AnimatorPath {

//记录轨迹

private List mPoints = new ArrayList<>();

public void moveTo(float x, float y) {

mPoints.add(PathPoint.moveTo(x, y));

}

public void lineTo(float x, float y) {

mPoints.add(PathPoint.lineTo(x, y));

}

public void curveTo(float c0X, float c0Y, float c1X, float c1Y, float x, float y) {

mPoints.add(PathPoint.curveTo(c0X, c0Y, c1X, c1Y, x, y));

}

public Collection getPoints() {

return mPoints;

}

}

3、实现页面布局

xmlns:app="http://schemas.android.com/apk/res-auto"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:background="#ffe8e8e8">

android:id="@+id/album_cover"

android:layout_width="match_parent"

android:layout_height="250dp"

android:background="#22eeff" />

android:id="@+id/toolbar"

android:layout_width="match_parent"

android:layout_height="120dp"

android:layout_below="@id/album_cover"

android:layout_marginTop="-15dp"

android:background="@color/colorPrimary"

android:elevation="4dp"

android:minHeight="?attr/actionBarSize"

android:paddingLeft="72dp">

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:gravity="center_vertical"

android:orientation="vertical">

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:fontFamily="sans-serif"

android:text="大海大海"

android:textColor="#FFF"

android:textSize="30sp" />

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_gravity="center_vertical"

android:fontFamily="sans-serif-light"

android:text="王小二"

android:textColor="#9cffffff"

android:textSize="18sp" />

android:id="@+id/fab_container"

android:layout_width="match_parent"

android:layout_height="128dp"

android:layout_below="@id/album_cover"

android:layout_marginTop="-30dp"

android:elevation="10dp">

android:id="@+id/media_controls_container"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_gravity="center"

android:orientation="horizontal">

android:layout_width="20dp"

android:layout_height="20dp"

android:scaleX="0"

android:scaleY="0"

android:src="@mipmap/play" />

android:id="@+id/iv_pause_play"

android:layout_width="20dp"

android:layout_height="20dp"

android:layout_marginLeft="50dp"

android:layout_marginRight="50dp"

android:scaleX="0"

android:scaleY="0"

android:src="@mipmap/play" />

android:layout_width="20dp"

android:layout_height="20dp"

android:layout_marginRight="50dp"

android:scaleX="0"

android:scaleY="0"

android:src="@mipmap/play" />

android:id="@+id/fab"

android:layout_width="56dp"

android:layout_height="56dp"

android:layout_gravity="top|right"

android:layout_marginRight="72dp"

android:background="@drawable/ripple"

android:elevation="5dp"

android:onClick="onPabPressed"

android:transitionName="button_fab" />

4、获取控件,并且设置点击事件,设置一些动画常量

private View mFab;

private FrameLayout mFabcontainer;

private LinearLayout mControlsContainer;

//从什么时候开始执行动画

private static final float SCALE_FACTOR = 13f;

//持续时间

private static final long ANIMATION_DURATION = 300;

//贝塞尔曲线滑动到什么时候开始执行动画

private static final float MINIMUN_X_DISTANCE = 200;

private boolean mRevealFlag;

private float mFabSize;

5、给mFab设置点击事件

private void onFabPressed(View view) {

final float startX = mFab.getX();

//开始动画

AnimatorPath path = new AnimatorPath();

path.moveTo(0, 0);

path.curveTo(-200, 200, -400, 100, -600, 50);

// path.lineTo(-600,50);

ObjectAnimator anim = ObjectAnimator.ofObject(this, "fabLoc",

new PathEvaluator(), path.getPoints().toArray());

anim.setInterpolator(new AccelerateInterpolator());

// anim.setRepeatCount(ValueAnimator.INFINITE);

// anim.setRepeatMode(ValueAnimator.REVERSE);

anim.setDuration(ANIMATION_DURATION);

anim.start();

anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {

@Override

public void onAnimationUpdate(ValueAnimator valueAnimator) {

//到了path路径中的某个位置就是开始扩散动画

if (Math.abs(startX - mFab.getX()) > MINIMUN_X_DISTANCE) {

if (!mRevealFlag) {

ImageButton fab = (ImageButton) mFab;

fab.setImageDrawable(new BitmapDrawable());

//看布局里边的FabContainer要比toolbar背景高mFabSize/2(为了最初的半个fab效果)

mFabcontainer.setY(mFabcontainer.getY() + mFabSize / 2);

//fab放大动画

mFab.animate()

.scaleXBy(SCALE_FACTOR)

.scaleYBy(SCALE_FACTOR)

.setListener(mEndRevealListener)

.setDuration(ANIMATION_DURATION);

mRevealFlag = true;

}

}

}

});

}

public void setFabLoc(PathPoint newLoc) {

mFab.setTranslationX(newLoc.mX);

if (mRevealFlag) {

//因为布局里边的mFabcontainer要比toolbar背景高mFabSize/2,所以fab为了看起来平顺,需要上移mFabSize/2

mFab.setTranslationY(newLoc.mY - (mFabSize / 2));

} else {

mFab.setTranslationY(newLoc.mY);

}

}

private AnimatorListenerAdapter mEndRevealListener = new AnimatorListenerAdapter() {

@Override

public void onAnimationEnd(Animator animation) {

super.onAnimationEnd(animation);

mFab.setVisibility(View.INVISIBLE);

mFabcontainer.setBackgroundColor(getResources().getColor(R.color.colorAccent));

//reveal动画完毕后,接着每一个子控件都有个缩放动画(依次顺序出来)

for (int i = 0; i < mControlsContainer.getChildCount(); i++) {

View v = mControlsContainer.getChildAt(i);

ViewPropertyAnimator animate = v.animate()

.scaleX(1)

.scaleY(1)

.setDuration(ANIMATION_DURATION);

animate.setStartDelay(i * 50);

animate.start();

}

}

};

PathEvaluator

public class PathEvaluator implements TypeEvaluator {

@Override

public PathPoint evaluate(float t, PathPoint startValue, PathPoint endValue) {

//t执行的百分比 (0~1)

float x, y;

if (endValue.mOperation == PathPoint.CURVE) {

//三阶贝塞尔曲线 公式

float oneMinusT = 1 - t;

x = oneMinusT * oneMinusT * oneMinusT * startValue.mX +

3 * oneMinusT * oneMinusT * t * endValue.mControl0X +

3 * oneMinusT * t * t * endValue.mControl1X +

t * t * t * endValue.mX;

y = oneMinusT * oneMinusT * oneMinusT * startValue.mY +

3 * oneMinusT * oneMinusT * t * endValue.mControl0Y +

3 * oneMinusT * t * t * endValue.mControl1X +

t * t * t * endValue.mY;

} else if (endValue.mOperation == PathPoint.LINE) {

//x=起始点+t*起始点和终点的距离

x = startValue.mX + t * (endValue.mX - startValue.mX);

y = startValue.mY + t * (endValue.mY - startValue.mY);

} else {

x = endValue.mX;

y = endValue.mY;

}

return PathPoint.moveTo(x, y);

}

}

注意:属性动画既可以改变属性,也可以改变一个变量或者方法

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

android实现多画面播放,Android实现炫酷播放效果相关推荐

  1. android自定义图片过渡效果,教你做出炫酷的Android动画效果

    前言 Android动画也是Android系统中一个很重要的模块, 在平时开发中, 为了做出炫酷的效果, 动画可以说是必不可少的; 本文将总结Android中与动画相关的部分, 文中部分内容整理自文末 ...

  2. Android studio实现底部导航,Android 开发之BottomBar+ViewPager+Fragment实现炫酷的底部导航效果...

    BottomBar BottomBar是Github上的一个开源框架,因为从1.3.3开始不支持fragments了,要自己配置,弄了很久,不管是app的fragment还是V4 的程序总是总是闪退. ...

  3. RecyclerView + SnapHelper实现炫酷ViewPager效果

    目录 什么是SnapHelper SnapHelper是Google 在 Android 24.2.0 的support 包中添加的对RecyclerView的拓展,结合RecyclerView使用, ...

  4. canvas实现阿里云云栖大会炫酷动画效果

    效果展示: 源码展示: <!doctype html> <html> <head><meta charset="utf-8">< ...

  5. 经典回顾超炫酷阅读效果3D Book使用方法

    经典回顾超炫酷阅读效果3D Book使用方法 现在有很多人都喜欢在电脑上看小说,而电脑上看小说基本都是以记事本TXT电子书形式阅读,看起来总是觉得没有书本的那种感觉:你是不是已经受够了使用记事本看小说 ...

  6. css 特效 火球 光,JS+CSS实现炫酷光感效果

    JS+CSS带你实现炫酷光感效果,供大家参考,具体内容如下 效果一:(螺旋式沉浸视觉感受) 效果二:(旋涡式远观视觉感受) 实现代码: 光感效果 html,body{ height: 100%; ov ...

  7. 【每日一练】103—纯CSS实现的一款炫酷卡片效果

    作者 | 杨小爱 写在前面 我们经常会在各大平台看到很多产品的卡片效果,以及一些个人单页网站上的个人资料介绍时,也会用到各种卡片效果来展示信息,这种卡片式的设计,可以帮助我们分门别类的归类各种信息,让 ...

  8. 用javascript写Android和iOS naitve应用,实在炫酷。

    关注NativeScript有一段时间了,说好了的三月发第一个Beta版,终于发布了. // declare the extended NativeScriptActivity functionali ...

  9. android 动画开源框架,图文简介非常炫酷的Android开源框架之UI框架

    架构,其又名软件架构,是关于软件整体结构与组件的抽象描述,用于指导大型软件系统各个方面的设计.而软件架构(software architecture)是一系列相关的抽象模式,其是用来指导大型软件系统各 ...

  10. android 锁屏画面开发,android 锁屏应用开发

    要先注册为admin的.相关代码: mAdminName = new ComponentName(this, MyAdmin.class); // public static class MyAdmi ...

最新文章

  1. vmware nat模式原理探究,实现虚拟机跨网段管理
  2. 【推荐】年终已至,十张图告诉你15年领取年终奖的正确姿势
  3. 【Linux网络编程】原始套接字实例:MAC 地址扫描器
  4. 使用网络存储SAN和NAS
  5. mysql 备份 master_如何配置MYSQL的MASTER---SLAVE复制备份?
  6. Shell 脚本知识回顾 (六) —— Shell 函数
  7. 华为抓截屏_原来这才是华为截屏的正确姿势,今天才知道,千万别不当回事
  8. 引入方式之行内样式表(CSS、HTML)
  9. JMS学习十一(ActiveMQ Consumer高级特性之独有消费者(Exclusive Consumer))
  10. Cknife流量分析
  11. HandyJSON和SwiftyJSON的应用
  12. js读取excel,xlsx,xls 表格,转成JSON数据
  13. 基于JavaWeb的12306网络购票系统设计与实现 文档+项目源码+脚本文件
  14. 世嘉MD游戏开发进阶篇【二】:C语言实现有限状态机
  15. 关于前端代码埋点数据上报的实现
  16. 车载微信助手,网页微信开发回顾
  17. 用html制作学生成绩表格代码,利用Excel制作学生成绩表.doc
  18. 周易六十四卦——否卦
  19. HOUDINI之curve命令
  20. [Tool] 常用开发工具注册码(持续更新)

热门文章

  1. 查看UiPath许可证状态
  2. Tkinter定时刷新页面或数据
  3. 看<奋斗>-----论门当户对(转自新浪博客)
  4. 数据结构之SWUSTOJ954: 单链表的链接
  5. 机顶盒抓包(无法连接WIFI的设备)
  6. Python的len函数探究
  7. win10修改系统字体(替换OneNote中Calibri字体)
  8. 浅谈矢量场 —— 1. 梯度、散度与拉普拉斯算子
  9. A-MPDU与A-MSDU各是什么意思
  10. 车载显示屏刷鸿蒙系统,华为智能品鉴会如期进行,鸿蒙系统车载显示屏首次亮相...