Android中一個視圖彈出動畫的簡單實現


動畫實現的功能描述:類似於畫廊的功能,點擊其中一個圖片的縮略圖,然后全屏打開這個圖片,中間的過程用動畫實現,給操作者一個從縮略圖放大到全屏的感覺。

由上述的描述可以看出,用戶點擊縮略圖的位置是不固定的,所以動畫的起始位置是不固定的,而且有的特殊情況下可能動畫起始是視圖的大小也是不固定的,所以用anim的xml定義實現是不可能的,所以這里我用將用手寫AnimationSet的方式實現這個動畫。

示例程序描述:

本示例是通過點擊不同位置上的button,然后通過動畫彈出一個LinearLayout,點擊這個LinearLayout,然后又通過動畫的方式隱藏這個LinearLayout。

第一步,創建一個工程,在初始的main.xml中添加多個button

本例是添加了6個button,具體代碼就不再貼出了。樣子就是這樣的:

 

第二步,給每個button添加上點擊事件

可以通過xml上的android:onClick="btnOnClick"屬性聲明點擊事件,然后在相應的Activity上實現這個方法就可以了,代碼如下:

btnOnClick(View btn)
1     public void btnOnClick(View btn) {
2         showView(btn);
3     }

第三步,實現彈出動畫和隱藏動畫

顯示動畫如下:

顯示動畫
 1 AnimationSet animSet = new AnimationSet(true);
 2         ScaleAnimation sa = new ScaleAnimation((float) v.getWidth()
 3                 / ((View) v.getParent()).getWidth(), 1.0f,
 4                 (float) v.getHeight() / ((View) v.getParent()).getHeight(),
 5                 1.0f, v.getX() + v.getWidth() / 2, v.getY() + v.getHeight() / 2);
 6         sa.setDuration(2000);
 7         AlphaAnimation aa = new AlphaAnimation(0.2f, 1);
 8         aa.setDuration(2000);
 9         animSet.addAnimation(sa);
10         animSet.addAnimation(aa);

隱藏動畫如下:

隱藏動畫
 1 AnimationSet animSet = new AnimationSet(true);
 2         ScaleAnimation sa = new ScaleAnimation(1, (float) v.getWidth()
 3                 / ((View) v.getParent()).getWidth(), 1, (float) v.getHeight()
 4                 / ((View) v.getParent()).getHeight(), v.getX() + v.getWidth()
 5                 / 2, v.getY() + v.getHeight() / 2);
 6         sa.setDuration(2000);
 7         AlphaAnimation aa = new AlphaAnimation(1f, 0f);
 8         aa.setDuration(2000);
 9         animSet.addAnimation(sa);
10         animSet.addAnimation(aa);

綜上所述,整個示例的核心代碼就是Activity的2個方法,Activity的源代碼如下:

Activity
 1 public class AnimTestActivity extends Activity {
 2     private LinearLayout mView = null;
 3 
 4     /** Called when the activity is first created. */
 5     @Override
 6     public void onCreate(Bundle savedInstanceState) {
 7         super.onCreate(savedInstanceState);
 8         setContentView(R.layout.main);
 9     }
10 
11     public void btnOnClick(View btn) {
12         showView(btn);
13     }
14 
15     private void showView(final View v) {
16         if (mView == null) {
17             mView = new LinearLayout(this);
18             mView.setBackgroundColor(Color.BLUE);
19             addContentView(mView, new ViewGroup.LayoutParams(
20                     LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
21         }
22         mView.setOnClickListener(new View.OnClickListener() {
23             @Override
24             public void onClick(View view) {
25                 hideView(v);
26             }
27         });
28 
29         AnimationSet animSet = new AnimationSet(true);
30         ScaleAnimation sa = new ScaleAnimation((float) v.getWidth()
31                 / ((View) v.getParent()).getWidth(), 1.0f,
32                 (float) v.getHeight() / ((View) v.getParent()).getHeight(),
33                 1.0f, v.getX() + v.getWidth() / 2, v.getY() + v.getHeight() / 2);
34         sa.setDuration(2000);
35         AlphaAnimation aa = new AlphaAnimation(0.2f, 1);
36         aa.setDuration(2000);
37         animSet.addAnimation(sa);
38         animSet.addAnimation(aa);
39         mView.startAnimation(animSet);
40         mView.setVisibility(View.VISIBLE);
41     }
42 
43     private void hideView(View v) {
44         AnimationSet animSet = new AnimationSet(true);
45         ScaleAnimation sa = new ScaleAnimation(1, (float) v.getWidth()
46                 / ((View) v.getParent()).getWidth(), 1, (float) v.getHeight()
47                 / ((View) v.getParent()).getHeight(), v.getX() + v.getWidth()
48                 / 2, v.getY() + v.getHeight() / 2);
49         sa.setDuration(2000);
50         AlphaAnimation aa = new AlphaAnimation(1f, 0f);
51         aa.setDuration(2000);
52         animSet.addAnimation(sa);
53         animSet.addAnimation(aa);
54         mView.startAnimation(animSet);
55         mView.setVisibility(View.GONE);
56     }
57 }

 有一點需要說明一下:(float) v.getWidth()    / ((View) v.getParent()).getWidth()

  • v.getWidth()  和 ((View) v.getParent()).getWidth()都是int類型,為了不讓得到的結果為0,這里用float轉換了一下分子
  • v.getWidth() 在彈出動畫中代表的是動畫起始時視圖的大小,在隱藏動畫中代表的是動畫結束時視圖的大小
  • ((View) v.getParent()).getWidth()在彈出動畫中代表的是動畫結束時的視圖的大小,在隱藏動畫中代表的是動畫開始時視圖的大小
  • 這個比值的結果是動畫變化前后的寬度的比值


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM