关于ValueAnimation以及Interpolator +Drawable实现的自己定义动画效果
ValueAnimation :
Android中的属性动画,他跟objectAnimation是比补间动画拥有更强大的功能,能够操作对象。所以我们能够在自
定义View中通过他们来实现些特别的功能。
Interpolator:
插值器,通过插值器我们能实现比方反弹。重力加速度。等等的效果。
Android本来就自带了插值器。加速减速等等。并且在最新的v4包中还加入了几个新的插值器,能够上网搜下,看看不同的插值器的效果。
Drawable :Drawable这个类是能够用来绘制的类
通过自己定义Drawable 能够实现非常多不通过的功能:
由于不是动态图片。看不到实际效果。能够下载Demo自己执行下看看。
关于自己定义Drawable 的步骤:
1、用一个类继承Drawable
2、创建一个ValueAnimator 对象。设置他的各种属性以及加入AnimatorUpdateListener。然后通过他的监听器能够设置你控件的动画效果
3、创建一个画笔,用来进行绘制你所要绘制的东西
4、绘制的时候按你的需求来计算要绘制的东西(功能不一样计算方式也不一样)
看上图第一个控件的实现方式:
package com.example.modifyprogress; import android.animation.ValueAnimator;
import android.animation.ValueAnimator.AnimatorUpdateListener;
import android.annotation.SuppressLint;
import android.graphics.Canvas;
import android.graphics.ColorFilter;
import android.graphics.Path;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.drawable.Drawable;
import android.view.animation.Animation;
import app.dinus.com.loadingdrawable.MaterInterpolator; @SuppressLint("NewApi")
public class LoadingDrawable extends Drawable{
private Drawable mDrawable;
private Path mPath = new Path();
private float mPercent;
private ValueAnimator mAnimator;
public LoadingDrawable(Drawable drawable) {
this.mDrawable = drawable; mAnimator = ValueAnimator.ofFloat(0.0f,1.0f);
mAnimator.setDuration(5000);
mAnimator.setRepeatCount(Animation.INFINITE);
mAnimator.setRepeatMode(Animation.REVERSE);
mAnimator.setInterpolator(MaterInterpolator.createInterpolator().setDefault_Type(MaterInterpolator.BOUNCE));
mAnimator.addUpdateListener(new AnimatorUpdateListener() { @Override
public void onAnimationUpdate(ValueAnimator animation) { if (mPercent < 1) {
mPercent += (Float)animation.getAnimatedValue()/100;
} else {
mPercent = 0;
}
invalidateSelf();
}
});
mAnimator.start();
}
@Override
public void draw(Canvas canvas) {
mPath.reset();
RectF rect = new RectF(getBounds());
double radius = Math.pow(Math.pow(rect.right, 2) + Math.pow(rect.bottom, 2), 0.5);
mPath.moveTo(rect.right / 2, rect.bottom / 2);
mPath.lineTo(rect.right / 2, 0);
if (mPercent > 0.125f) {
mPath.lineTo(rect.right, 0);
}
if (mPercent > 0.375f) {
mPath.lineTo(rect.right, rect.bottom);
}
if (mPercent > 0.625f) {
mPath.lineTo(0, rect.bottom);
}
if (mPercent > 0.875f) {
mPath.lineTo(0, 0);
}
mPath.lineTo((float) (rect.right / 2 + radius * Math.sin(Math.PI * 2 * mPercent)),
(float) (rect.bottom / 2 - radius * Math.cos(Math.PI * 2 * mPercent)));
mPath.close();
if (mPercent >= 0 && mPercent <= 1) {
canvas.save();
canvas.clipPath(mPath);
mDrawable.draw(canvas);
canvas.restore();
}
} @Override
public void setAlpha(int alpha) {
mDrawable.setAlpha(alpha);
} @Override
public int getAlpha() {
return mDrawable.getAlpha();
} @Override
public void setColorFilter(ColorFilter cf) {
mDrawable.setColorFilter(cf);
} @Override
public int getOpacity() {
// TODO Auto-generated method stub
return mDrawable.getOpacity();
} @Override
protected void onBoundsChange(Rect bounds) {
mDrawable.setBounds(bounds);
} @Override
public int getIntrinsicHeight() {
return mDrawable.getIntrinsicHeight();
} @Override
public int getIntrinsicWidth() {
return mDrawable.getIntrinsicWidth();
} public void setPercent(float percent) {
if (percent > 1) {
percent = 1;
} else if (percent < 0) {
percent = 0;
}
if (percent != mPercent) {
this.mPercent = percent;
invalidateSelf();
}
} }
我自己自己定义了几个插值动画。关于插值动画的測试能够在:http://inloop.github.io/interpolator/
package app.dinus.com.loadingdrawable; import android.view.animation.Interpolator;
/**
*各种插值器效果
* @author chenpengfei_d
*能够去这个网址上看效果: http://inloop.github.io/interpolator/
*/
public class MaterInterpolator implements Interpolator{
private int mDefault_Type = LINEAR;
private float interpolatorValue;
private static MaterInterpolator mInterpolator;
public static MaterInterpolator createInterpolator(){
if (mInterpolator == null) {
mInterpolator = new MaterInterpolator();
}
return mInterpolator;
} @Override
public float getInterpolation(float input) { switch (mDefault_Type) {
case LINEAR: //线性
interpolatorValue = input;
break;
case ACCELERATE: //加速
float factor = 1.0f;
if (factor == 1.0) {
factor = input * input;
}else {
factor = (float)Math.pow(input, factor *2);
}
interpolatorValue = factor;
break;
case ACCELERATEDECELERATE://先加速后减速
interpolatorValue = (float) ((Math.cos((input + 1) * Math.PI) /2.0) + 0.5F);
break;
case ANTICIPATE: float tension = 2.0f;
interpolatorValue = input * input *((tension + 1) * input - tension);
break;
case ANTICIPATEOVERSHOOT:
tension = 2.0f * 1.5f;
if (input < 0.5){
interpolatorValue = (float) (0.5 * (Math.pow(input * 2.0f, 2) * ((tension + 1) * input - tension)));
}else {
interpolatorValue = (float) (0.5 *(Math.pow(((input - 1) * 2.0f), 2) *((tension + 1) *(input - 1) * 2.0f + tension)));
}
break;
case BOUNCE://反弹
if (input < 0.3535) {
interpolatorValue = bounce(input);
}else if(input < 0.7408){
interpolatorValue = bounce(input - 0.54719f) + 0.7f;
}else if (input < 0.9644) {
interpolatorValue = bounce(input - 0.8526f) + 0.9f;
}else {
interpolatorValue = bounce(input - 1.0435f) + 0.95f;
}
break;
case CUBICHERMITE:
interpolatorValue = CubicHermite(input, 0, 1, 4, 4);
break;
case CYCLE:
float cycles = 1.0f;
interpolatorValue = (float)Math.sin(2* cycles *Math.PI *input);
break;
case DECELERATE://减速
float divisor = 1.0f;
if (divisor == 1.0) {
interpolatorValue = (float) (1.0 - (1.0 - input ) * (1.0 - input));
}else {
interpolatorValue = (float) (1.0 - Math.pow((1.0 - input), 2 * divisor));
}
break;
case OVERSHOOT:
tension = 2.0f;
input = input - 1.0f;
interpolatorValue = (float) (input *input *((tension + 1) * input + tension ) +1.0);
break;
case SMOOTHSTEP:
interpolatorValue = input * input * (3 - 2 *input );
break;
case SPRING://弹簧效果
factor = 0.4f;
interpolatorValue = (float) (Math.pow(2, -10 *input) * Math.sin((input - factor /4) *(2 *Math.PI)/factor ) + 1.0);
break;
default:
break;
} return interpolatorValue;
} private float bounce(float input){
return input *input *8;
}
private float CubicHermite(float t, int p0,int p1,int m0,int m1){
float t2 = t* t;
float t3 = t2 * t ;
return (2* t3 - 3 * t2 +1) * p0 + (t3 - 2 * t2 + t) * m0 + (-2 * t3 + 3 * t2) * p1 + (t3 - t2) *m1;
}
public int getDefault_Type() {
return mDefault_Type;
}
public MaterInterpolator setDefault_Type(int default_Type) {
mDefault_Type = default_Type;
return mInterpolator;
}
public static final int LINEAR =0 ;
public static final int SMOOTHSTEP = 1;
public static final int ACCELERATEDECELERATE = 2;
public static final int BOUNCE = 3;
public static final int ACCELERATE = 4;
public static final int ANTICIPATEOVERSHOOT = 5;
public static final int CYCLE = 6;
public static final int ANTICIPATE = 7;
public static final int DECELERATE = 8;
public static final int OVERSHOOT = 9;
public static final int CUBICHERMITE = 10;
public static final int SPRING = 11;
public enum MaterInterPolatorType{
LINEAR,SMOOTHSTEP,SPRING,CUBICHERMITE,OVERSHOOT,DECELERATE,ANTICIPATE,CYCLE,ANTICIPATEOVERSHOOT
,ACCELERATE,BOUNCE,ACCELERATEDECELERATE
}
}
还有其它的效果能够看代码里边。下载执行就好,效果还不错,个人感觉。
关于ValueAnimation以及Interpolator +Drawable实现的自己定义动画效果的更多相关文章
- Android动画主要包含补间动画(Tween)View Animation、帧动画(Frame)Drawable Animation、以及属性动画Property Animation
程序运行效果图: Android动画主要包含补间动画(Tween)View Animation.帧动画(Frame)Drawable Animation.以及属性动画Property Animatio ...
- Android 学习笔记多媒体技术之 Drawable类+Tween(补间动画)+Frame(帧动画)
学习内容: 1.了解Drawable类的作用 2.如何使用Drawable... 3.了解Tween动画... 4.如何创建和使用Tween动画... 1.Drawable类... Drawabl ...
- 动画效果interpolator
Interpolator 被用来修饰动画效果,定义动画的变化率 AccelerateDecelerateInterpolator 在动画开始与结束的地方速率改变比较慢,在中间的时候加速 Accel ...
- Android开发之View动画效果插补器Interpolator
插补器Interpolator 官网描述:An interpolator defines the rate of change of an animation. This allows the bas ...
- 几种常用的Interpolator(插值器)的动画效果
在实现动画的非线性变化的方法中,常用的一种是为动画添加插值器以改变视图的属性值,从而实现理想的动画效果.Interpolator使用相对简单,下面就只给出一些提供的插值器的默认效果. 在代码中:直接调 ...
- 巧用Drawable 实现Android UI 元素间距效果
源文地址: 巧用Drawable 实现Android UI 元素间距效果 在大部分的移动UI或者Web UI都是基于网格概念而设计的.这种网格一般都是有一些对其的方块组成,然后它们组合成为一个块.使用 ...
- Android中的动画机制
1 逐帧动画 逐帧动画 就是一系列的图片按照一定的顺序展示的过程. 逐帧动画很简单, 只需要在drawable中或者anim中定义一个Animation-list 其中包含多个it ...
- 动画_ _ Android应用开发之所有动画使用详解
转载: http://blog.csdn.net/yanbober/article/details/46481171 题外话:有段时间没有更新博客了,这篇文章也是之前写了一半一直放在草稿箱,今天抽空把 ...
- Android 三种动画详解
[工匠若水 http://blog.csdn.net/yanbober 转载请注明出处.点我开始Android技术交流] 1 背景 不能只分析源码呀,分析的同时也要整理归纳基础知识,刚好有人微博私信让 ...
随机推荐
- Memcached的实战笔记
官网:http://memcached.org/ 优秀Blogs: http://blog.csdn.net/jingqiang521/article/details/48345021 开启telne ...
- tp volist需要便利两个数组时的处理办法
你需要便利两个数组,并且需要使用key 和value的试的时候,volist是否先得有些捉鸡? 我们可以便利其中一个数组,而另一个利用数组的指针来操作 next($arr) 将数组指针下移 key($ ...
- 监控myserver计数器
- 2015 Multi-University Training Contest 3 hdu 5325 Crazy Bobo
Crazy Bobo Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)Total ...
- 各种List、Map、Set的比較
前言:Java中用不同的数据结构(哈希表/动态数组/平衡树/链表)实现了不同的集合接口(List/Map/Set).大多数情况下,集合类被用于不须要线程安全地环境,所以后来的集合实现都没有再採用同步以 ...
- 混合高斯模型的EM求解(Mixtures of Gaussians)及Python实现源代码
今天为大家带来混合高斯模型的EM推导求解过程. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveHVhbnl1YW5zZW4=/font/5a6L5L2T/ ...
- 百度 谷歌 Twitter,这么多短链接服务(Short Url)究竟哪家强?
一.短链接是什么 url=HPqdQ5VR3vA39x7ZWoWyNzwWnsDhTbh66BTpdzsJLroBDzFRm4JV-G818Zc027uZrwe7zxtxnD4H2FUahftpUK& ...
- Keil5.15版本号
Keil5.15下载地址 http://pan.baidu.com/s/1kT6AGvX Keil5.15软件补丁下载地址 http://www.keil.com/dd2/pack/ Keil5.15 ...
- ubuntu 休眠之后蓝牙鼠标无效果。
ubuntu链接蓝牙鼠标之后.左上角蓝牙标志左下角应该有一个锁的标志. 可是休眠之后,蓝牙鼠标失效,锁没有了,点击按键,出来锁之后,立即消失. 运行两次例如以下命令能够解决: sudo hciconf ...
- Python爬糗百热门20条并邮件分发+wxPython简易GUI+py2app转成可运行文件
学了一阵子Python,拿来做个什么有意思的东西呢?爬糗百好了.爬到的内容,邮件分发出去. 然后又啃了两天的wxpython,做了个简易的邮件管理界面,能够在这里添加或者删除邮件,而且一键爬虫发送. ...