Android購物動畫

最近在做一個類似於購物的動畫。先上最終的效果的Demo。

從圖中可以看出,是可以在一個動畫還沒有結束的時候開始第二個動畫,即多個動畫會依次執行。自己做的動畫並不多,所以就說的詳細一點(如果有說錯的的還望告訴一下啊,哈哈)
1.一個View只能在自身的父佈局中移動。最開始,將這個效果放在ListView中的時候,發現根本不移動,當時移動的是ListView的某個Item中的一個TextView,並且我也沒有單獨的new一個圖層來執行動畫。
2.怎麼才能讓View的動畫會多個依次的去執行。最開始,做的時候是在每次執行動畫之前創建一個View,然後在每次監聽動畫結束的時候去remove這個View,然後出現的結果是每當界面出現兩個View的時候就會crash。那什麼會讓動畫依次執行呢?先進先出,隊列,最後用的是Handler。
3.多種動畫同時存在的時候,比如ScaleAnimation和TranslateAnimation,加在AnimationSet中的時候會發現計算的位置不正確。這個是因爲ScaleAnimation以後位置會出現一些變化。兩種解決方案。
(1) AnimationSet將ScaleAnimation放在第一個。
(2)new Animation的時候設置他的type,Animation.RELATIVE_TO_SELF。
動畫的類。

public void startBuyAnim(final View view)
    {
        int start_location[] = new int[2];
        view.getLocationInWindow(start_location);

        ImageView startView = new ImageView(context);
        startView.setBackgroundColor(Color.RED);
        startView.setLayoutParams(new LayoutParams(context.getResources().getDimensionPixelSize(R.dimen.red_point_size),
                context.getResources().getDimensionPixelSize(R.dimen.red_point_size)));

        Item item = new Item();
        item.view = startView;
        viewHolder.add(item);
        animLayout.addView(startView);

        // 目的位子
        int endX = MainActivity.END_LOCATION[0];
        int endY = MainActivity.END_LOCATION[1];

        TranslateAnimation translateAnimationX = new TranslateAnimation(start_location[0], endX, 0.0f, 0.0f);
        translateAnimationX.setInterpolator(new LinearInterpolator());
        translateAnimationX.setRepeatCount(0);
        translateAnimationX.setFillAfter(true);
        TranslateAnimation translateAnimationY = new TranslateAnimation(0.0f, 0.0f, start_location[1], endY);
        translateAnimationY.setInterpolator(new Interpolator()
        {
            @Override
            public float getInterpolation(float input)
            {
                return ((1.5f * (input - 0.16666667f)) * (input - 0.16666667f)) - 0.041666668f;
            }
        });
        translateAnimationY.setRepeatCount(0);
        translateAnimationX.setFillAfter(true);
        // ScaleAnimation scaleAnimation = new ScaleAnimation(1, 0.05f, 1,
        // 0.05f, Animation.RELATIVE_TO_SELF, 0,
        // Animation.RELATIVE_TO_SELF, 0);
        // scaleAnimation.setRepeatCount(0);
        // scaleAnimation.setFillAfter(true);
        AnimationSet set = new AnimationSet(false);
        set.setFillAfter(false);
        // set.addAnimation(scaleAnimation);
        set.addAnimation(translateAnimationX);
        set.addAnimation(translateAnimationY);
        set.setDuration(600);
        startView.startAnimation(set);
        set.setAnimationListener(new AnimationListener()
        {

            @Override
            public void onAnimationStart(Animation animation)
            {
            }

            @Override
            public void onAnimationRepeat(Animation animation)
            {
            }

            @Override
            public void onAnimationEnd(Animation animation)
            {
                AnimUtil.this.handler.post(new Runnable()
                {

                    @Override
                    public void run()
                    {
                        AnimUtil.this.removeView();
                    }
                });
            }
        });
    }

    private List<Item> viewHolder;

    private class Item
    {
        public View view;

        private Item()
        {
        }
    }

    private void removeView()
    {
        if (this.viewHolder != null && this.viewHolder.size() > 0)
        {
            Item item0 = this.viewHolder.get(0);
            item0.view.setVisibility(View.GONE);
            this.viewHolder.remove(item0);
            this.animLayout.removeView(item0.view);
        }
    }
}


下載鏈接:http://download.csdn.net/detail/a38017032/9424067


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章