android 用NineOldAndroid实现的弹出按钮

NineOldAndroid

1.首先上效果图:

左边这张是没有点击button的时候的效果,   右边这张是点击button 后是以该button为圆的展开5个button

                             

2.实现的思路是:

  1)在FrameLayout中将6个Button进行重叠,然后将主Button显示在最上面,其他Button可以隐藏掉。

  2)然后调用用NineOldAndroids来进行动画设置,在设置动画的时候要注意是以Button为中心的圆。所以要根据Button的位置来确定平移的x,y(处理的时候用到了三角函数)

3.在实现过程中遇到的一个问题:

   android AnimatorSet AnimationSet 的区别:

     简介: AnimatorSet 和 AnimationSet 都是动画集合。这里简单介绍下他们的异同,了解这些后在设计动画实现时才能得心应手。
     AnimationSet 我们最常用的是调用其 addAnimation 将一个个不一样的动画组织到一起来,然后调用view 的 startAnimation 方法触发这些动画执行。功能较弱不能做到把集合中的动画按一定顺序进行组织然后在执行的定制。

     AnimatorSet 我们最常用的是调用其play、before、with、after 等方法设置动画的执行顺序,然后调用其start 触发动画执行。

     AnimationSet 与 AnimatorSet 最大的不同在于,AnimationSet 使用的是 Animation 子类、AnimatorSet 使用的是 Animator 的子类。

     Animation 是针对视图外观的动画实现,动画被应用时外观改变但视图的触发点不会发生变化,还是在原来定义的位置。

     Animator  是针对视图属性的动画实现,动画被应用时对象属性产生变化,最终导致视图外观变化。

4.代码:

MianActivity

  1 public class MainActivity extends Activity implements OnClickListener {
  2 
  3     private Button main, one, two, three, four, five;
  4 
  5     private boolean isShow = false;
  6 
  7     @Override
  8     protected void onCreate(Bundle savedInstanceState) {
  9         super.onCreate(savedInstanceState);
 10         setContentView(R.layout.activity_main);
 11 
 12         initView();
 13     }
 14 
 15     private void initView() {
 16         main = (Button) findViewById(R.id.Main);
 17         one = (Button) findViewById(R.id.one);
 18         two = (Button) findViewById(R.id.two);
 19         three = (Button) findViewById(R.id.three);
 20         four = (Button) findViewById(R.id.four);
 21         five = (Button) findViewById(R.id.five);
 22         main.setOnClickListener(this);
 23         one.setOnClickListener(this);
 24         two.setOnClickListener(this);
 25         three.setOnClickListener(this);
 26         four.setOnClickListener(this);
 27         five.setOnClickListener(this);
 28     }
 29 
 30     @Override
 31     public void onClick(View v) {
 32         switch (v.getId()) {
 33         case R.id.Main:
 34             if (!isShow) {
 35                 isShow = true;
 36                 animationShow(one, 1, 5, 300);
 37                 animationShow(two, 2, 5, 300);
 38                 animationShow(three, 3, 5, 300);
 39                 animationShow(four, 4, 5, 300);
 40                 animationShow(five, 5, 5, 300);
 41 
 42             } else {
 43                 isShow = false;
 44                 animationHint(one, 1, 5, 300);
 45                 animationHint(two, 2, 5, 300);
 46                 animationHint(three, 3, 5, 300);
 47                 animationHint(four, 4, 5, 300);
 48                 animationHint(five, 5, 5, 300);
 49             }
 50 
 51             break;
 52         case R.id.one:
 53             Toast.makeText(MainActivity.this, "点击了" + one, Toast.LENGTH_SHORT)
 54                     .show();
 55             break;
 56         case R.id.two:
 57             Toast.makeText(MainActivity.this, "点击了" + two, Toast.LENGTH_SHORT)
 58                     .show();
 59             break;
 60         case R.id.three:
 61             Toast.makeText(MainActivity.this, "点击了" + three, Toast.LENGTH_SHORT)
 62                     .show();
 63             break;
 64         case R.id.four:
 65             Toast.makeText(MainActivity.this, "点击了" + four, Toast.LENGTH_SHORT)
 66                     .show();
 67             break;
 68         case R.id.five:
 69             Toast.makeText(MainActivity.this, "点击了" + five, Toast.LENGTH_SHORT)
 70                     .show();
 71             break;
 72         }
 73     }
 74 
 75     private void animationShow(View view, int index, int total, int radius) {
 76         if (view != null) {
 77             view.setVisibility(View.VISIBLE);
 78         }
 79 
 80         // 根据三角函数来获得view平移的x,和y
 81         double degree = index * Math.PI / (2 * total);
 82         int translateX = (int) ((int) radius * Math.sin(degree));
 83         int translateY = (int) ((int) radius * Math.cos(degree));
 84         AnimatorSet set = new AnimatorSet();
 85         set.playTogether(
 86                 ObjectAnimator.ofFloat(view, "translationX", 0, translateX),
 87                 ObjectAnimator.ofFloat(view, "translationY", 0, translateY),
 88                 ObjectAnimator.ofFloat(view, "scaleX", 0f, 1f),
 89                 ObjectAnimator.ofFloat(view, "scaleY", 0f, 1f),
 90                 ObjectAnimator.ofFloat(view, "alpha", 0f, 1f));
 91         set.start();
 92 
 93     }
 94 
 95     private void animationHint(View view, int index, int total, int radius) {
 96         if (view != null) {
 97             view.setVisibility(View.VISIBLE);
 98         }
 99 
100         // 根据三角函数来获得view平移的x,和y
101         double degree = index * Math.PI / (2 * total);
102         int translateX = (int) ((int) radius * Math.sin(degree));
103         int translateY = (int) ((int) radius * Math.cos(degree));
104         AnimatorSet set = new AnimatorSet();
105         set.playTogether(
106                 ObjectAnimator.ofFloat(view, "translationX", translateX, 0),
107                 ObjectAnimator.ofFloat(view, "translationY", translateY, 0),
108                 ObjectAnimator.ofFloat(view, "scaleX", 1f, 0f),
109                 ObjectAnimator.ofFloat(view, "scaleY", 1f, 0f),
110                 ObjectAnimator.ofFloat(view, "alpha", 1f, 0f));
111         set.start();
112 
113     }
114 
115 }
activity_main.xml:
 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     android:paddingBottom="@dimen/activity_vertical_margin"
 6     android:paddingLeft="@dimen/activity_horizontal_margin"
 7     android:paddingRight="@dimen/activity_horizontal_margin"
 8     android:paddingTop="@dimen/activity_vertical_margin"
 9     tools:context=".MainActivity" >
10 
11     <FrameLayout
12         android:layout_width="match_parent"
13         android:layout_height="match_parent" >
14 
15         <Button
16             android:id="@+id/one"
17             android:layout_width="40dp"
18             android:layout_height="40dp"
19             android:background="@drawable/circle2"
20             android:visibility="gone" />
21 
22         <Button
23             android:id="@+id/two"
24             android:layout_width="40dp"
25             android:layout_height="40dp"
26             android:background="@drawable/circle3"
27             android:visibility="gone" />
28 
29         <Button
30             android:id="@+id/three"
31             android:layout_width="40dp"
32             android:layout_height="40dp"
33             android:background="@drawable/circle4"
34             android:visibility="gone" />
35 
36         <Button
37             android:id="@+id/four"
38             android:layout_width="40dp"
39             android:layout_height="40dp"
40             android:background="@drawable/circle5"
41             android:visibility="gone" />
42 
43         <Button
44             android:id="@+id/five"
45             android:layout_width="40dp"
46             android:layout_height="40dp"
47             android:background="@drawable/circle6"
48             android:visibility="gone" />
49 
50         <Button
51             android:id="@+id/Main"
52             android:layout_width="40dp"
53             android:layout_height="40dp"
54             android:background="@drawable/circle1" />
55     </FrameLayout>
56 
57 </RelativeLayout>

 

源码下载地址:源码

 

posted @ 2014-08-19 19:20  perfect亮  阅读(1611)  评论(1编辑  收藏  举报