animation過渡效果

References:html

http://developer.android.com/training/animation/index.htmlandroid

http://developer.android.com/reference/android/view/ViewGroup.html#attr_android:animateLayoutChangeside


動畫效果能夠微妙地提高用戶體驗。特別是當屏幕狀態發生改變時,好比新的內容添加進來或者新的動做產生。本文將以developer的training教程Adding Animations爲基礎,分析Android裏面的動畫使用。動畫

layout過渡動畫this

若是layout界面有view的簡單怎加,刪減,能夠用addView()與removeView(), 此時能夠對這個過程怎加一個動畫效果。ViewGroup有一個android:animateLayoutChanges的屬性能夠設置,這個屬性的做用就在於,當layout發生變化時是否觸發過分動畫效果。所以只需設置爲true,就能夠開啓默認的過渡動畫。spa

addBtn = (Button) findViewById(R.id.button1);
        container = (LinearLayout) findViewById(R.id.container);
        addBtn.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                final TextView tv = new TextView(MainActivity.this);
                tv.setText("new item");
                container.addView(tv, 0);
                tv.setOnClickListener(new OnClickListener() {
                    
                    @Override
                    public void onClick(View v) {
                       container.removeView(tv);
                    }
                });
            }
        });

View的漸變
從API level 12之後基類Veiw增長了animate(),能夠返回一個ViewPropertyAnimator實例,做用是用來控制view自己的動畫屬性。
API level 12指的是Android 3.1.X以上,也就是所2.X是不支持的。
這個ViewPropertyAnimator 的接口很是多,基本的如透明度alpha,動畫時長duration,座標,漸變方式,動畫結束時的回調藉口等等,training重的案例使用到了alpha屬性,使得進度條和顯示內容的切換有一淡入淡出的效果。code

mContentView.setAlpha(0f);
    mContentView.setVisibility(View.VISIBLE);

    // Animate the content view to 100% opacity, and clear any animation
    // listener set on the view.
    mContentView.animate()
            .alpha(1f)
            .setDuration(mShortAnimationDuration)
            .setListener(null);

    // Animate the loading view to 0% opacity. After the animation ends,
    // set its visibility to GONE as an optimization step (it won't
    // participate in layout passes, etc.)
    mHideView.animate()
            .alpha(0f)
            .setDuration(mShortAnimationDuration)
            .setListener(new AnimatorListenerAdapter() {
                @Override
                public void onAnimationEnd(Animator animation) {
                    mHideView.setVisibility(View.GONE);
                }
            });
 

滑動屏幕動畫
這個就是Viewpager的效果,在上下也滑動之間有一個動畫效果,平時使用viewpager是通常不設置,實際上也能夠經過實現本身的ViewPager.PageTransformer 來作出徹底不一樣的切換動畫效果。官方給出的縮放效果和深度效果的ViewPager.PageTransformer與默認的效果很不一樣。
本身實現動畫關鍵是理解transformPage(View page, float position)的參數並實現他。page固然值得就是滑動中德那個view,position這裏是float,不是平時理解的int位置信息,而是當前滑動狀態的一個表示,好比當滑動到正全屏時,position是0,而向左滑動,使得右邊恰好有一部被進入屏幕時,position是1,若是前一晚上和下一頁基本各在屏幕佔一半時,前一頁的position是-0.5,後一頁的posiotn是0.5,因此根據position的值咱們就能夠自行設置須要的alpha,x/y信息。orm

Zoom-out page transformer
public class ZoomOutPageTransformer implements ViewPager.PageTransformer {
    private static float MIN_SCALE = 0.85f;
    private static float MIN_ALPHA = 0.5f;

    public void transformPage(View view, float position) {
        int pageWidth = view.getWidth();
        int pageHeight = view.getHeight();

        if (position < -1) { // [-Infinity,-1)
            // This page is way off-screen to the left.
            view.setAlpha(0);

        } else if (position <= 1) { // [-1,1]
            // Modify the default slide transition to shrink the page as well
            float scaleFactor = Math.max(MIN_SCALE, 1 - Math.abs(position));
            float vertMargin = pageHeight * (1 - scaleFactor) / 2;
            float horzMargin = pageWidth * (1 - scaleFactor) / 2;
            if (position < 0) {
                view.setTranslationX(horzMargin - vertMargin / 2);
            } else {
                view.setTranslationX(-horzMargin + vertMargin / 2);
            }

            // Scale the page down (between MIN_SCALE and 1)
            view.setScaleX(scaleFactor);
            view.setScaleY(scaleFactor);

            // Fade the page relative to its size.
            view.setAlpha(MIN_ALPHA +
                    (scaleFactor - MIN_SCALE) /
                    (1 - MIN_SCALE) * (1 - MIN_ALPHA));

        } else { // (1,+Infinity]
            // This page is way off-screen to the right.
            view.setAlpha(0);
        }
    }
}
Depth page transformer
public class DepthPageTransformer implements ViewPager.PageTransformer {
    private static float MIN_SCALE = 0.75f;

    public void transformPage(View view, float position) {
        int pageWidth = view.getWidth();

        if (position < -1) { // [-Infinity,-1)
            // This page is way off-screen to the left.
            view.setAlpha(0);

        } else if (position <= 0) { // [-1,0]
            // Use the default slide transition when moving to the left page
            view.setAlpha(1);
            view.setTranslationX(0);
            view.setScaleX(1);
            view.setScaleY(1);

        } else if (position <= 1) { // (0,1]
            // Fade the page out.
            view.setAlpha(1 - position);

            // Counteract the default slide transition
            view.setTranslationX(pageWidth * -position);

            // Scale the page down (between MIN_SCALE and 1)
            float scaleFactor = MIN_SCALE
                    + (1 - MIN_SCALE) * (1 - Math.abs(position));
            view.setScaleX(scaleFactor);
            view.setScaleY(scaleFactor);

        } else { // (1,+Infinity]
            // This page is way off-screen to the right.
            view.setAlpha(0);
        }
    }
}
相關文章
相關標籤/搜索