NineOldAndroid开源库简单使用demo
看到很多开源库都使用了这个动画框架,就自己试了一下,果然很强大。把测试代码贴上,方便以后使用
package com.test.animation; import android.animation.ValueAnimator;
import android.app.Activity;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout; import com.nineoldandroids.animation.Animator;
import com.nineoldandroids.animation.AnimatorSet;
import com.nineoldandroids.animation.ObjectAnimator;
import com.nineoldandroids.animation.PropertyValuesHolder;
import com.nineoldandroids.view.ViewHelper;
import com.nineoldandroids.view.ViewPropertyAnimator; public class AnimationActivity extends Activity {
Button button; private void initView() {
LinearLayout layout = new LinearLayout(this);
layout.setOrientation(LinearLayout.VERTICAL);
layout.setGravity(Gravity.CENTER_HORIZONTAL);
button = new Button(this);
button.setText("target");
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
layout.addView(button, params);
setContentView(layout);
} @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initView();
// testAnim00();
// testAnim0();
// testAnim1();
// testAnim2();
testAnim3();
// testAnim4();
// testAnim5();
// testAnim6();
// testAnim7();
// startActivity(new Intent(this,AnimationContextMenuActivity.class));
} private void testAnim00() {
Animator animator1 = AnimatorUtils.rotationCloseToRight(button).setDuration(2000);
Animator animator2 = AnimatorUtils.rotationOpenFromRight(button).setDuration(2000);
Animator animator3 = AnimatorUtils.rotationCloseVertical(button).setDuration(2000);
Animator animator4 = AnimatorUtils.rotationOpenVertical(button).setDuration(2000);
Animator animator5 = AnimatorUtils.alphaDisappear(button).setDuration(2000);
Animator animator6 = AnimatorUtils.alphaAppear(button).setDuration(2000);
Animator animator7 = AnimatorUtils.translationRight(button, 100).setDuration(2000);
Animator animator8 = AnimatorUtils.translationLeft(button, 100).setDuration(2000);
final AnimatorSet set = new AnimatorSet();
// set.play(animator1).before(animator2)/*.after(animator3).after(animator4).after(animator5).after(animator6).after(animator7).after(animator8)*/;
// set.play(animator2).before(animator3);
// set.play(animator3).before(animator4);
// set.play(animator4).before(animator5);
// set.play(animator5).before(animator6);
// set.play(animator6).before(animator7);
// set.play(animator7).before(animator8);
/*===============//after before只能有两个,注意 before/after的顺序 或者用下面的===========================*/
set.playSequentially(animator1,animator2,animator3,animator4,animator5,animator6,animator7,animator8);
set.start();
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
set.start();
}
});
} private void testAnim0() {
Animator anim1 = ObjectAnimator.ofFloat(button, "rotationX", 90, 0).setDuration(2000);
Animator anim2 = ObjectAnimator.ofFloat(button, "rotationX", 0, 90).setDuration(2000);
final AnimatorSet set = new AnimatorSet();
set.play(anim1).after(anim2);
set.start();
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
set.start();
}
});
} private void testAnim1() {
ObjectAnimator.ofFloat(button, "translationY", 100).setDuration(1000).start();
} private void testAnim2() {
Animator animator = ObjectAnimator.ofFloat(button, "translationX", 100).setDuration(1000);
animator.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animator) { } @Override
public void onAnimationEnd(Animator animator) {
ObjectAnimator.ofFloat(button, "translationX", 0).setDuration(1000).start();
} @Override
public void onAnimationCancel(Animator animator) { } @Override
public void onAnimationRepeat(Animator animator) { }
});
animator.start();
} private void testAnim3() {
ViewPropertyAnimator.animate(button).translationY(100).start();
final ValueAnimator animator = ValueAnimator.ofFloat(0, 360).setDuration(2000);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
// ViewHelper.setPivotX(button,0);
// ViewHelper.setRotationX(button, (Float) animation.getAnimatedValue());
ViewHelper.setPivotY(button, 0);
ViewHelper.setRotationY(button, (Float) animation.getAnimatedValue()); //配套使用
}
});
animator.start();
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
animator.start();
}
});
} private void testAnim4() {
//左移动100,右移动100,alpha 变为0.2 跟5效果一样
AnimatorSet set = new AnimatorSet();
set.playTogether(ObjectAnimator.ofFloat(button, "translationX", 100),
ObjectAnimator.ofFloat(button, "translationY", 100),
ObjectAnimator.ofFloat(button, "alpha", 1, 0.2f));
set.setDuration(2000).start();
} private void testAnim5() {
//左移动100,右移动100,alpha 变为0.2
ObjectAnimator.ofPropertyValuesHolder(button, PropertyValuesHolder.ofFloat("translationX", -100),
PropertyValuesHolder.ofFloat("translationY", 100),
PropertyValuesHolder.ofFloat("alpha", 1, 0.3f)).setDuration(2000).start(); } private void testAnim6() {
// ViewPropertyAnimator.animate(button).translationX(100).translationY(100).setDuration(2000).start();
// ViewPropertyAnimator.animate(button).translationY(100).rotationYBy(720).setDuration(2000).start();
ViewPropertyAnimator.animate(button).rotationYBy(360).x(300).y(500).setDuration(2000).start();//旋转角度为360的倍数,x(..)y(..)后面为动画后位置
} //===========================================================================demo=========================================================
private void testAnim7() {
final LinearLayout layout = new LinearLayout(this);
layout.setOrientation(LinearLayout.VERTICAL);
layout.setGravity(Gravity.CENTER_HORIZONTAL); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
for (int i = 0; i < 5; i++) {
Button btn = new Button(this);
btn.setText("btn" + i);
btn.setTag(i);
layout.addView(btn, params);
}
Button startBtn = new Button(this);
startBtn.setText("start");
startBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!isAdimateOpen) {
isAdimateOpen = true;
doAnimateOpen(layout.getChildAt(0), 0, 5, 300);
doAnimateOpen(layout.getChildAt(1), 1, 5, 300);
doAnimateOpen(layout.getChildAt(2), 2, 5, 300);
doAnimateOpen(layout.getChildAt(3), 3, 5, 300);
doAnimateOpen(layout.getChildAt(4), 4, 5, 300);
} else {
isAdimateOpen = false;
doAnimateClose(layout.getChildAt(0), 0, 5, 300);
doAnimateClose(layout.getChildAt(1), 1, 5, 300);
doAnimateClose(layout.getChildAt(2), 2, 5, 300);
doAnimateClose(layout.getChildAt(3), 3, 5, 300);
doAnimateClose(layout.getChildAt(4), 4, 5, 300);
}
}
});
layout.addView(startBtn, params);
setContentView(layout);
} boolean isAdimateOpen = false; /**
* 打开菜单的动画
*
* @param view 执行动画的view
* @param index view在动画序列中的顺序
* @param total 动画序列的个数
* @param radius 动画半径
*/
private void doAnimateOpen(View view, int index, int total, int radius) {
if (view.getVisibility() != View.VISIBLE) {
view.setVisibility(View.VISIBLE);
}
double degree = Math.PI * index / ((total - 1) * 2);
int translationX = (int) (radius * Math.cos(degree));
int translationY = (int) (radius * Math.sin(degree));
AnimatorSet set = new AnimatorSet();
//包含平移、缩放和透明度动画
set.playTogether(
ObjectAnimator.ofFloat(view, "translationX", 0, translationX),
ObjectAnimator.ofFloat(view, "translationY", 0, translationY),
ObjectAnimator.ofFloat(view, "scaleX", 1f, 1.5f),
ObjectAnimator.ofFloat(view, "scaleY", 1f, 1.5f),
ObjectAnimator.ofFloat(view, "alpha", 1f, 1.5f));
//动画周期为500ms
set.setDuration(1000).start();
} /**
* 关闭菜单的动画
*
* @param view 执行动画的view
* @param index view在动画序列中的顺序
* @param total 动画序列的个数
* @param radius 动画半径
*/
private void doAnimateClose(final View view, int index, int total,
int radius) {
if (view.getVisibility() != View.VISIBLE) {
view.setVisibility(View.VISIBLE);
}
double degree = Math.PI * index / ((total - 1) * 2);
int translationX = (int) (radius * Math.cos(degree));
int translationY = (int) (radius * Math.sin(degree));
AnimatorSet set = new AnimatorSet();
//包含平移、缩放和透明度动画
set.playTogether(
ObjectAnimator.ofFloat(view, "translationX", translationX, 0),
ObjectAnimator.ofFloat(view, "translationY", translationY, 0),
ObjectAnimator.ofFloat(view, "scaleX", 1.5f, 1f),
ObjectAnimator.ofFloat(view, "scaleY", 1.5f, 1f),
ObjectAnimator.ofFloat(view, "scaleY", 1.5f, 1f));
set.setDuration(1000).start();
}
}
NineOldAndroid开源库简单使用demo的更多相关文章
- 开源框架】Android之史上最全最简单最有用的第三方开源库收集整理,有助于快速开发
[原][开源框架]Android之史上最全最简单最有用的第三方开源库收集整理,有助于快速开发,欢迎各位... 时间 2015-01-05 10:08:18 我是程序猿,我为自己代言 原文 http: ...
- 【开源框架】Android之史上最全最简单最有用的第三方开源库收集整理,有助于快速开发,欢迎各位网友补充完善
链接地址:http://www.tuicool.com/articles/jyA3MrU 时间 2015-01-05 10:08:18 我是程序猿,我为自己代言 原文 http://blog.cs ...
- Android之史上最全最简单最有用的第三方开源库收集整理
Android开源库 自己一直很喜欢Android开发,就如博客签名一样, 我是程序猿,我为自己代言 . 在摸索过程中,GitHub上搜集了很多很棒的Android第三方库,推荐给在苦苦寻找的开发者, ...
- 【踩坑速记】开源日历控件,顺便全面解析开源库打包发布到Bintray/Jcenter全过程(新),让开源更简单~
一.写在前面 自使用android studio开始,就被它独特的依赖方式:compile 'com.android.support:appcompat-v7:25.0.1'所深深吸引,自从有了它,麻 ...
- GitHub 上排名前 100 的 Android 开源库进行简单的介绍
若有任何疑问可通过邮件或微博联系我 项目名称 项目简介 1. react-native 这个是 Facebook 在 React.js Conf 2015 大会上推出的基于 JavaScript 的开 ...
- GitHub开源库排名一百的简单介绍,值得收藏!
GitHub Android Libraries Top 100 简介 本项目主要对目前 GitHub 上排名前 100 的 Android 开源库进行简单的介绍, 至于排名完全是根据 GitHub ...
- 我的Android进阶之旅】GitHub 上排名前 100 的 Android 开源库进行简单的介绍
GitHub Android Libraries Top 100 简介 本文转载于:https://github.com/Freelander/Android_Data/blob/master/And ...
- Android 使用SwipeActionAdapter开源库实现简单列表的左右滑动操作
我们做listview左右滑动操作时,一般中情况下,都是像QQ那样,左滑弹出操作菜单(删除.编辑),然后选择菜单操作: 这样的效果不可谓不好,算是非常经典. 另外,有少数的APP,尤其是任务管理类的A ...
- 开源库Magicodes.WeChat.SDK总体介绍
目录 1 概要 1 2 主要特点 2 3 架构图 8 3.1 构造器——WeChatSDKBuilder 8 3.2 函数管理器——WeChatF ...
随机推荐
- HTML5本地数据库(WebSQL)[转]
除了sessionStorage和localStorage外,HTML5还支持通过本地数据库进行本地数据存储,HTML5采用的是"SQLite"这种文件型数据库,该数据库多集中在嵌 ...
- POJ 1094 Sorting It All Out 拓扑排序 难度:0
http://poj.org/problem?id=1094 #include <cstdio> #include <cstring> #include <vector& ...
- 服务器端与客户端TCP连接入门(二)
1.服务器端程序 package Socket; import java.io.BufferedReader; import java.io.IOException; import java.io.I ...
- Codeforces 451E Devu and Flowers(组合计数)
题目地址 在WFU(不是大学简称)第二次比赛中做到了这道题.高中阶段参加过数竞的同学手算这样的题简直不能更轻松,只是套一个容斥原理公式就可以.而其实这个过程放到编程语言中来实现也没有那么的复杂,不过为 ...
- bzoj1211: prufer序列 | [HNOI2004]树的计数
题目大意: 告诉你树上每个节点的度数,让你构建出这样一棵树,问能够构建出树的种树 这里注意数量为0的情况,就是 当 n=1时,节点度数>0 n>1时,所有节点度数相加-n!=n-2 可以通 ...
- web.xml的初始化参数
web.xml的初始化参数 ---------首先声明,这里所介绍的是web中context-param,init-param参数的初始化配置---------- ------------------ ...
- Certificate、Provisioning Profile、App ID
关于 Certificate.Provisioning Profile.App ID 的介绍及其之间的关系 2014-03-13 15:26 13416人阅读 评论(1) 收藏 举报 目录(?)[ ...
- [Algorithm Basics] Sorting, LinkedList
Time complexity: Binary search O(log2 n): i=0. n elements: ------------------- i=1. n/2 ...
- 【LeetCode OJ】Path Sum II
Problem Link: http://oj.leetcode.com/problems/path-sum-ii/ The basic idea here is same to that of Pa ...
- LINUX系统编程 由REDIS的持久化机制联想到的子进程退出的相关问题
19:22:01 2014-08-27 引言: 以前对wait waitpid 以及exit这几个函数只是大致上了解,但是看REDIS的AOF和RDB 2种持久化时 均要处理子进程运行完成退出和父进程 ...