1. src/geniuz/myPathbutton/myAnimations.java
  2.  
  3. package geniuz.myPathbutton;
  4.  
  5. import java.util.ArrayList;
  6. import java.util.List;
  7.  
  8. import com.nineoldandroids.animation.Animator;
  9. import com.nineoldandroids.animation.Animator.AnimatorListener;
  10. import com.nineoldandroids.view.ViewPropertyAnimator;
  11.  
  12. import android.util.Log;
  13. import android.view.View;
  14. import android.view.ViewGroup;
  15. import android.view.animation.Animation;
  16. import android.view.animation.Animation.AnimationListener;
  17. import android.view.animation.AnticipateInterpolator;
  18. import android.view.animation.OvershootInterpolator;
  19. import android.view.animation.RotateAnimation;
  20. import android.view.animation.TranslateAnimation;
  21. import android.widget.LinearLayout;
  22. import android.widget.RelativeLayout.LayoutParams;
  23. import android.widget.RelativeLayout;
  24. import static com.nineoldandroids.view.ViewPropertyAnimator.animate;
  25.  
  26. public class myAnimations {
  27.  
  28. public final int R; // 半徑
  29. public static byte RIGHTBOTTOM = 1, CENTERBOTTOM = 2, LEFTBOTTOM = 3,
  30. LEFTCENTER = 4, LEFTTOP = 5, CENTERTOP = 6, RIGHTTOP = 7,
  31. RIGHTCENTER = 8;
  32.  
  33. private int pc; // 位置代號
  34. private ViewGroup clayout; // 父laoyout
  35. private final int amount; // 有幾多個按鈕
  36. private double fullangle = 180.0;// 在幾大嘅角度內排佈
  37. private byte xOri = 1, yOri = 1; // x、y值嘅方向,即系向上還是向下
  38. private boolean isOpen = false;// 记录是已经打开还是关闭
  39. private List<ViewPropertyAnimator> viewAnimators = new ArrayList<ViewPropertyAnimator>();
  40.  
  41. /**
  42. * 構造函數
  43. *
  44. * @param comlayout
  45. * 包裹彈出按鈕嘅layout
  46. * @param poscode
  47. * 位置代號,分別對應RIGHTBOTTOM、CENTERBOTTOM、LEFTBOTTOM、LEFTCENTER、
  48. * LEFTTOP、CENTERTOP、RIGHTTOP、RIGHTCENTER
  49. * @param radius
  50. * 半徑
  51. */
  52. public myAnimations(ViewGroup comlayout, int poscode, int radius) {
  53. this.pc = poscode;
  54. this.clayout = comlayout;
  55. this.amount = clayout.getChildCount();
  56. this.R = radius;
  57.  
  58. // 初始化动画,每个view对应一个animator
  59. for (int i = 0; i < amount; i++) {
  60. View childAt = clayout.getChildAt(i);
  61. ViewPropertyAnimator anim = animate(childAt);
  62. viewAnimators.add(anim);
  63. }
  64.  
  65. if (poscode == RIGHTBOTTOM) { // 右下角
  66. fullangle = 90;
  67. xOri = -1;
  68. yOri = -1;
  69. } else if (poscode == CENTERBOTTOM) {// 中下
  70. fullangle = 180;
  71. xOri = -1;
  72. yOri = -1;
  73. } else if (poscode == LEFTBOTTOM) { // 左下角
  74. fullangle = 90;
  75. xOri = 1;
  76. yOri = -1;
  77. } else if (poscode == LEFTCENTER) { // 左中
  78. fullangle = 180;
  79. xOri = 1;
  80. yOri = -1;
  81. } else if (poscode == LEFTTOP) { // 左上角
  82. fullangle = 90;
  83. xOri = 1;
  84. yOri = 1;
  85. } else if (poscode == CENTERTOP) { // 中上
  86. fullangle = 180;
  87. xOri = -1;
  88. yOri = 1;
  89. } else if (poscode == RIGHTTOP) { // 右上角
  90. fullangle = 90;
  91. xOri = -1;
  92. yOri = 1;
  93. } else if (poscode == RIGHTCENTER) { // 右中
  94. fullangle = 180;
  95. xOri = -1;
  96. yOri = -1;
  97. }
  98. }
  99.  
  100. private class AnimListener implements AnimatorListener {
  101.  
  102. private View target;
  103.  
  104. public AnimListener(View _target) {
  105. target = _target;
  106. }
  107.  
  108. @Override
  109. public void onAnimationStart(Animator animation) {
  110.  
  111. }
  112.  
  113. @Override
  114. public void onAnimationEnd(Animator animation) {
  115. if (!isOpen) {
  116. target.setVisibility(View.INVISIBLE);
  117. }
  118. }
  119.  
  120. @Override
  121. public void onAnimationCancel(Animator animation) {
  122. // TODO Auto-generated method stub
  123.  
  124. }
  125.  
  126. @Override
  127. public void onAnimationRepeat(Animator animation) {
  128. // TODO Auto-generated method stub
  129.  
  130. }
  131. }
  132.  
  133. /**
  134. * 彈幾個按鈕出嚟
  135. *
  136. * @param durationMillis
  137. * 用幾多時間
  138. */
  139. public void startAnimationsIn(int durationMillis) {
  140. isOpen = true;
  141. for (int i = 0; i < clayout.getChildCount(); i++) {
  142. final LinearLayout inoutimagebutton = (LinearLayout) clayout
  143. .getChildAt(i);
  144.  
  145. double offangle = fullangle / (amount - 1);
  146.  
  147. final double deltaY, deltaX;
  148. if (pc == LEFTCENTER || pc == RIGHTCENTER) {
  149. deltaX = Math.sin(offangle * i * Math.PI / 180) * R;
  150. deltaY = Math.cos(offangle * i * Math.PI / 180) * R;
  151. } else {
  152. deltaY = Math.sin(offangle * i * Math.PI / 180) * R;
  153. deltaX = Math.cos(offangle * i * Math.PI / 180) * R;
  154. }
  155.  
  156. ViewPropertyAnimator viewPropertyAnimator = viewAnimators.get(i);
  157. viewPropertyAnimator.setListener(null);
  158.  
  159. inoutimagebutton.setVisibility(View.VISIBLE);
  160. viewPropertyAnimator.x(
  161. (float) (inoutimagebutton.getLeft() + xOri * deltaX)).y(
  162. (float) (inoutimagebutton.getTop() + yOri * deltaY));
  163.  
  164. }
  165. }
  166.  
  167. /**
  168. * 收埋幾個按鈕入去
  169. *
  170. * @param durationMillis
  171. * 用幾多時間
  172. */
  173. public void startAnimationsOut(int durationMillis) {
  174. isOpen = false;
  175. for (int i = 0; i < clayout.getChildCount(); i++) {
  176. final LinearLayout inoutimagebutton = (LinearLayout) clayout
  177. .getChildAt(i);
  178. ViewPropertyAnimator viewPropertyAnimator = viewAnimators.get(i);
  179. viewPropertyAnimator.setListener(null);
  180. viewPropertyAnimator.x((float) inoutimagebutton.getLeft()).y(
  181. (float) inoutimagebutton.getTop());
  182. viewPropertyAnimator
  183. .setListener(new AnimListener(inoutimagebutton));
  184.  
  185. }
  186.  
  187. }
  188.  
  189. /**
  190. * 獲取位置代碼(其實貌似都冇乜用)
  191. */
  192. public int getPosCode() {
  193. return this.pc;
  194. }
  195.  
  196. /**
  197. * 自轉函數(原本就有嘅靜態函數,未實體化都可以調用)
  198. *
  199. * @param fromDegrees
  200. * 從幾多度
  201. * @param toDegrees
  202. * 到幾多度
  203. * @param durationMillis
  204. * 轉幾耐
  205. */
  206. public static Animation getRotateAnimation(float fromDegrees,
  207. float toDegrees, int durationMillis) {
  208. RotateAnimation rotate = new RotateAnimation(fromDegrees, toDegrees,
  209. Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
  210. 0.5f);
  211. rotate.setDuration(durationMillis);
  212. rotate.setFillAfter(true);
  213. return rotate;
  214. }
  215.  
  216. }
  217. 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. Android滑动菜单特效实现,仿人人客户端侧滑效果,史上最简单的侧滑实现

    http://blog.csdn.net/guolin_blog/article/details/8714621 http://blog.csdn.net/lmj623565791/article/d ...

  2. iOS开发——高级篇——iPad开发、iPad开发中的modal

    一.iPad简介 1.什么是iPad一款苹果公司于2010年发布的平板电脑定位介于苹果的智能手机iPhone和笔记本电脑产品之间跟iPhone一样,搭载的是iOS操作系统 2.iPhone和iPadi ...

  3. mysql取前取后

    SELECT * FROM (SELECT * FROM 表 WHERE id<居中的ID ORDER BY id DESC LIMIT 5) as A UNION all SELECT * F ...

  4. [Keygen]IntelliJ IDEA 14.1.7

    IntelliJ IDEA 14.1.7 Keygen package com.candy.keygen.intelliJIdea; import java.math.BigInteger; impo ...

  5. dp 走格子问题

    问题: 一个5x8的格子,想从左下角走到右上角,求最短路径,共有多少种走法. 思路: 因为是求最短路径,所以,只会往右往上走. 我们可以把棋盘的左下角看做二维坐标的原点(0,0),把棋盘的右上角看做二 ...

  6. VMware中的Ubuntu网络设置

    网络配置: VMware安装后会有两个默认网卡,分别是VMnet8(192.168.83.1)和VMnet1(192.168.19.1),当然不同的机器上,这两个网卡的 IP会不同的.在windows ...

  7. BZOJ 1770: [Usaco2009 Nov]lights 燈

    Description 一个图,对一个点进行操作会改变这个点及其相邻的点的状态,问全部变成黑色至少需要几次.数据保证有解. Sol Meet in middle. 我一开始写个高斯消元,发现有两个点过 ...

  8. linux git安装及配置(包括更新)

    1.在终端运行命令 sudo apt-get install git 2.查看版本号 git --version  (若不是最新可更新 自选) 更新提示: sudo add-apt-repositor ...

  9. 微信支付JSAPI模式及退款CodeIgniter集成篇

    微信支付接口文档:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_1 首先你得知道这个jsapi是不能离开微信进行调用支付的,明白 ...

  10. Fiddler响应post的请求 request body里面填写什么?

    若是想传json格式的数据,请求头可以这样写:(应该先勾选 post,然后写上正确滴请求地址)User-Agent: Fiddler Host: localhost:1455 <span sty ...