src/geniuz/myPathbutton/myAnimations.java

package geniuz.myPathbutton;

import java.util.ArrayList;
import java.util.List; import com.nineoldandroids.animation.Animator;
import com.nineoldandroids.animation.Animator.AnimatorListener;
import com.nineoldandroids.view.ViewPropertyAnimator; import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.Animation.AnimationListener;
import android.view.animation.AnticipateInterpolator;
import android.view.animation.OvershootInterpolator;
import android.view.animation.RotateAnimation;
import android.view.animation.TranslateAnimation;
import android.widget.LinearLayout;
import android.widget.RelativeLayout.LayoutParams;
import android.widget.RelativeLayout;
import static com.nineoldandroids.view.ViewPropertyAnimator.animate; public class myAnimations { public final int R; // 半徑
public static byte RIGHTBOTTOM = 1, CENTERBOTTOM = 2, LEFTBOTTOM = 3,
LEFTCENTER = 4, LEFTTOP = 5, CENTERTOP = 6, RIGHTTOP = 7,
RIGHTCENTER = 8; private int pc; // 位置代號
private ViewGroup clayout; // 父laoyout
private final int amount; // 有幾多個按鈕
private double fullangle = 180.0;// 在幾大嘅角度內排佈
private byte xOri = 1, yOri = 1; // x、y值嘅方向,即系向上還是向下
private boolean isOpen = false;// 记录是已经打开还是关闭
private List<ViewPropertyAnimator> viewAnimators = new ArrayList<ViewPropertyAnimator>(); /**
* 構造函數
*
* @param comlayout
* 包裹彈出按鈕嘅layout
* @param poscode
* 位置代號,分別對應RIGHTBOTTOM、CENTERBOTTOM、LEFTBOTTOM、LEFTCENTER、
* LEFTTOP、CENTERTOP、RIGHTTOP、RIGHTCENTER
* @param radius
* 半徑
*/
public myAnimations(ViewGroup comlayout, int poscode, int radius) {
this.pc = poscode;
this.clayout = comlayout;
this.amount = clayout.getChildCount();
this.R = radius; // 初始化动画,每个view对应一个animator
for (int i = 0; i < amount; i++) {
View childAt = clayout.getChildAt(i);
ViewPropertyAnimator anim = animate(childAt);
viewAnimators.add(anim);
} if (poscode == RIGHTBOTTOM) { // 右下角
fullangle = 90;
xOri = -1;
yOri = -1;
} else if (poscode == CENTERBOTTOM) {// 中下
fullangle = 180;
xOri = -1;
yOri = -1;
} else if (poscode == LEFTBOTTOM) { // 左下角
fullangle = 90;
xOri = 1;
yOri = -1;
} else if (poscode == LEFTCENTER) { // 左中
fullangle = 180;
xOri = 1;
yOri = -1;
} else if (poscode == LEFTTOP) { // 左上角
fullangle = 90;
xOri = 1;
yOri = 1;
} else if (poscode == CENTERTOP) { // 中上
fullangle = 180;
xOri = -1;
yOri = 1;
} else if (poscode == RIGHTTOP) { // 右上角
fullangle = 90;
xOri = -1;
yOri = 1;
} else if (poscode == RIGHTCENTER) { // 右中
fullangle = 180;
xOri = -1;
yOri = -1;
}
} private class AnimListener implements AnimatorListener { private View target; public AnimListener(View _target) {
target = _target;
} @Override
public void onAnimationStart(Animator animation) { } @Override
public void onAnimationEnd(Animator animation) {
if (!isOpen) {
target.setVisibility(View.INVISIBLE);
}
} @Override
public void onAnimationCancel(Animator animation) {
// TODO Auto-generated method stub } @Override
public void onAnimationRepeat(Animator animation) {
// TODO Auto-generated method stub }
} /**
* 彈幾個按鈕出嚟
*
* @param durationMillis
* 用幾多時間
*/
public void startAnimationsIn(int durationMillis) {
isOpen = true;
for (int i = 0; i < clayout.getChildCount(); i++) {
final LinearLayout inoutimagebutton = (LinearLayout) clayout
.getChildAt(i); double offangle = fullangle / (amount - 1); final double deltaY, deltaX;
if (pc == LEFTCENTER || pc == RIGHTCENTER) {
deltaX = Math.sin(offangle * i * Math.PI / 180) * R;
deltaY = Math.cos(offangle * i * Math.PI / 180) * R;
} else {
deltaY = Math.sin(offangle * i * Math.PI / 180) * R;
deltaX = Math.cos(offangle * i * Math.PI / 180) * R;
} ViewPropertyAnimator viewPropertyAnimator = viewAnimators.get(i);
viewPropertyAnimator.setListener(null); inoutimagebutton.setVisibility(View.VISIBLE);
viewPropertyAnimator.x(
(float) (inoutimagebutton.getLeft() + xOri * deltaX)).y(
(float) (inoutimagebutton.getTop() + yOri * deltaY)); }
} /**
* 收埋幾個按鈕入去
*
* @param durationMillis
* 用幾多時間
*/
public void startAnimationsOut(int durationMillis) {
isOpen = false;
for (int i = 0; i < clayout.getChildCount(); i++) {
final LinearLayout inoutimagebutton = (LinearLayout) clayout
.getChildAt(i);
ViewPropertyAnimator viewPropertyAnimator = viewAnimators.get(i);
viewPropertyAnimator.setListener(null);
viewPropertyAnimator.x((float) inoutimagebutton.getLeft()).y(
(float) inoutimagebutton.getTop());
viewPropertyAnimator
.setListener(new AnimListener(inoutimagebutton)); } } /**
* 獲取位置代碼(其實貌似都冇乜用)
*/
public int getPosCode() {
return this.pc;
} /**
* 自轉函數(原本就有嘅靜態函數,未實體化都可以調用)
*
* @param fromDegrees
* 從幾多度
* @param toDegrees
* 到幾多度
* @param durationMillis
* 轉幾耐
*/
public static Animation getRotateAnimation(float fromDegrees,
float toDegrees, int durationMillis) {
RotateAnimation rotate = new RotateAnimation(fromDegrees, toDegrees,
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
0.5f);
rotate.setDuration(durationMillis);
rotate.setFillAfter(true);
return rotate;
} }
Desktop version

  

安卓中級教程(8):pathbutton中的animation.java研究(1)的更多相关文章

  1. 安卓中級教程(3):ScrollView

    以上是scrollview的圖例,可見srollview是一種滑動功能的控件,亦是非常常見的控件. 一般寫法如下: package com.mycompany.viewscroller; import ...

  2. 安卓中級教程(9):pathbutton中的animation.java研究(2)

    src/geniuz/myPathbutton/composerLayout.java package geniuz.myPathbutton; import com.nineoldandroids. ...

  3. 安卓中級教程(10):@InjectView

    package com.example.android.db01; import android.app.Activity; import android.content.ContentValues; ...

  4. 安卓中級教程(5):ScrollView與refreshable之間的設置

    設置向下拉動更新. package com.mycompany.Scroll_test; import android.app.*; import android.os.*; import andro ...

  5. 安卓中級教程(4):ScrollView與ListView之間的高度問題

    在scrollView中加插ListView是一個大難題.其中一個難題是Listview的高度難以計算,輸出效果往往強差人意,就讓我們看看當中的問題 . <LinearLayout xmlns: ...

  6. 安卓中級教程(6):annotation的基本用法

    package com.example.ele_me.activity; import android.annotation.SuppressLint; import android.app.Acti ...

  7. 安卓中級教程(1):@InjectView

    package com.mycompany.hungry; import android.annotation.SuppressLint; import android.app.Activity; i ...

  8. 安卓中級教程(11):深入研究餓了麼的各個java檔運作關係(1)

    package com.example.ele_me.activity; import android.annotation.SuppressLint; import android.app.Acti ...

  9. 安卓中級教程(7):annotation中的 public @interface的用法

    package com.example.ele_me.util; import java.lang.annotation.Retention; import java.lang.annotation. ...

随机推荐

  1. CentOS6.3 编译安装LAMP(2):编译安装 Apache2.2.25

    所需源码包: /usr/local/src/Apache-2.2.25/httpd-2.2.25.tar.gz 编译安装 Apache2.2.25 #切换到源码目录 cd /usr/local/src ...

  2. eclipse 快捷键

    Eclipse快捷键大全 Ctrl+1 快速修复(最经典的快捷键,就不用多说了) Ctrl+D: 删除当前行  Ctrl+Alt+↓ 复制当前行到下一行(复制增加) Ctrl+Alt+↑ 复制当前行到 ...

  3. sql server日期时间转字符串

    一.sql server日期时间函数Sql Server中的日期与时间函数 1.  当前系统日期.时间     select getdate()  2. dateadd  在向指定日期加上一段时间的基 ...

  4. HTTPS Web配置举例

    http://www.h3c.com.cn/Products___Technology/Technology/Security_Encrypt/Other_technology/Representat ...

  5. SQLServer2008设置 开启远程连接

    SQLServer2008设置 开启远程连接 前一段时间,学生分组做项目,使用SVN工具,要求功能使用存储过程,在数据库这块出现这么一个问题: A学生在他的数据库上添加了存储过程,需要其他的B,C,D ...

  6. AngularJS多模块开发

    angularJS中的多模块开发是指多个module模块开发,步骤为: 1. 确定主模块    var app=angular.module('myApp',[]); 2. 其他的子模块添加到主模块后 ...

  7. SQL中inner join、outer join和cross join的区别

    对于SQL中inner join.outer join和cross join的区别简介:现有两张表,Table A 是左边的表.Table B 是右边的表.其各有四条记录,其中有两条记录name是相同 ...

  8. Pyqt SpVoice朗读功能

    用Pyqt 做一个读取系统剪贴板内容,然后通过语音合成(TTS)朗读出剪贴板的内容 知识要点 SpVoice SpVoice类是支持语音合成(TTS)的核心类.通过SpVoice对象调用TTS引擎,从 ...

  9. ytu 1057: 输入两个整数,求他们相除的余数(带参的宏 + 模板函数 练习)

    1057: 输入两个整数,求他们相除的余数 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 177  Solved: 136[Submit][Status ...

  10. windows批处理语法

    写批处理文件,除了了解基本语法外,你还需要熟悉常用的windows命令,那就先看看这篇文章:windows常用命令 #重要说明 文件及目录路径:要使用反斜杠'\',不要使用正斜杠'/' 如:del d ...