Android 属性动画实现一个简单的PopupWindow

1.今天看到一个PopupWindow的效果如图:

2.其实就是属性动画的一个简单实用就ObjectAnimator就可以的,想实现更多,更灵活的可以用ValueAnimator

3.直接上代码:

  

  1 public class MainActivity extends Activity implements OnClickListener {
  2 
  3     private LinearLayout layout1, layout2;
  4     private Button btnShow, btnHint;
  5 
  6     private int screenWidth, screenHeight;
  7 
  8     @Override
  9     protected void onCreate(Bundle savedInstanceState) {
 10         super.onCreate(savedInstanceState);
 11         setContentView(R.layout.activity_main);
 12         initView();
 13         addListener();
 14 
 15     }
 16 
 17     private void addListener() {
 18         btnShow.setOnClickListener(this);
 19         btnHint.setOnClickListener(this);
 20     }
 21 
 22     private void initView() {
 23         screenWidth = getWindowWidth(MainActivity.this);
 24         screenHeight = getWindowHeigh(MainActivity.this);
 25         layout1 = (LinearLayout) findViewById(R.id.layout1);
 26         btnShow = (Button) findViewById(R.id.layout_button);
 27         layout2 = (LinearLayout) findViewById(R.id.layout2);
 28         btnHint = (Button) findViewById(R.id.btnhint);
 29     }
 30 
 31     @SuppressLint("NewApi")
 32     private void initShowMeanuAnimation() {
 33 
 34         System.out.println("执行没有");
 35         ObjectAnimator animator1 = ObjectAnimator.ofFloat(layout1, "scaleX",
 36                 1.0f, 0.8f);
 37         animator1.setDuration(350);
 38         ObjectAnimator animator2 = ObjectAnimator.ofFloat(layout1, "scaleY",
 39                 1.0f, 0.8f);
 40         animator2.setDuration(350);
 41         ObjectAnimator animator3 = ObjectAnimator.ofFloat(layout1, "alpha",
 42                 1.0f, 0.5f);
 43         animator3.setDuration(350);
 44         ObjectAnimator animator4 = ObjectAnimator.ofFloat(layout1, "rotationX",
 45                 0f, 12f);
 46         animator4.setDuration(200);
 47         ObjectAnimator animator5 = ObjectAnimator.ofFloat(layout1, "rotationX",
 48                 12f, 0f);
 49         animator5.setDuration(300);
 50         animator5.setStartDelay(250);
 51         ObjectAnimator animator6 = ObjectAnimator.ofFloat(layout1,
 52                 "translationY", 0, -screenHeight * 0.1f);
 53         animator6.setDuration(350);
 54 
 55         ObjectAnimator animator7 = ObjectAnimator.ofFloat(layout2,
 56                 "translationY", 300, 0);
 57         animator7.setDuration(350);
 58 
 59         animator7.addListener(new AnimatorListenerAdapter() {
 60 
 61             @Override
 62             public void onAnimationStart(Animator animation) {
 63                 super.onAnimationStart(animation);
 64 
 65                 layout2.setVisibility(View.VISIBLE);
 66 
 67             }
 68 
 69         });
 70 
 71         AnimatorSet set = new AnimatorSet();
 72         set.playTogether(animator1, animator2, animator3, animator4, animator5,
 73                 animator6, animator7);
 74 
 75         set.start();
 76     }
 77 
 78     /**
 79      * 隐藏PopupWindow
 80      */
 81     @SuppressLint("NewApi")
 82     public void initHideMeanuAnimation() {
 83 
 84         ObjectAnimator animator1 = ObjectAnimator.ofFloat(layout1, "scaleX",
 85                 0.8f, 1.0f);
 86         animator1.setDuration(350);
 87         ObjectAnimator animator2 = ObjectAnimator.ofFloat(layout1, "scaleY",
 88                 0.8f, 1.0f);
 89         animator2.setDuration(350);
 90         ObjectAnimator animator3 = ObjectAnimator.ofFloat(layout1, "alpha",
 91                 0.5f, 1.0f);
 92         animator3.setDuration(350);
 93         ObjectAnimator animator4 = ObjectAnimator.ofFloat(layout1, "rotationX",
 94                 0f, 12f);
 95         animator4.setDuration(200);
 96         ObjectAnimator animator5 = ObjectAnimator.ofFloat(layout1, "rotationX",
 97                 12f, 0f);
 98         animator5.setDuration(300);
 99         animator5.setStartDelay(250);
100         ObjectAnimator animator6 = ObjectAnimator.ofFloat(layout1,
101                 "translationY", -screenHeight * 0.1f, 0);
102         animator6.setDuration(350);
103 
104         ObjectAnimator animator7 = ObjectAnimator.ofFloat(layout2,
105                 "translationY", 0, 300);
106         animator7.setDuration(350);
107 
108         animator7.addListener(new AnimatorListenerAdapter() {
109 
110             @Override
111             public void onAnimationEnd(Animator animation) {
112                 super.onAnimationEnd(animation);
113                 layout2.setVisibility(View.INVISIBLE);
114 
115             }
116 
117         });
118 
119         AnimatorSet set1 = new AnimatorSet();
120         set1.playTogether(animator1, animator2, animator3, animator4,
121                 animator5, animator6, animator7);
122 
123         set1.start();
124 
125     }
126 
127     @Override
128     public void onClick(View v) {
129         switch (v.getId()) {
130         case R.id.layout_button:
131             initShowMeanuAnimation();
132             break;
133         case R.id.btnhint:
134             initHideMeanuAnimation();
135             break;
136 
137         }
138 
139     }
140 
141     public static int getWindowWidth(Context context) {
142         // 获取屏幕分辨率
143         WindowManager wm = (WindowManager) (context
144                 .getSystemService(Context.WINDOW_SERVICE));
145         DisplayMetrics dm = new DisplayMetrics();
146         wm.getDefaultDisplay().getMetrics(dm);
147         int mScreenWidth = dm.widthPixels;
148         return mScreenWidth;
149 
150     }
151 
152     public static int getWindowHeigh(Context context) {
153         // 获取屏幕分辨率
154         WindowManager wm = (WindowManager) (context
155                 .getSystemService(Context.WINDOW_SERVICE));
156         DisplayMetrics dm = new DisplayMetrics();
157         wm.getDefaultDisplay().getMetrics(dm);
158         int mScreenHeigh = dm.heightPixels;
159         return mScreenHeigh;
160     }
161 }

代码有重复的地方就没有合并了。

源码下载:下载

posted @ 2015-04-29 21:25  perfect亮  阅读(1119)  评论(0编辑  收藏  举报