package org.qii.weiciyuan.support.gallery; import org.qii.weiciyuan.R; import org.qii.weiciyuan.bean.MessageBean; import org.qii.weiciyuan.support.lib.AnimationRect; import org.qii.weiciyuan.support.utils.AnimationUtility; import org.qii.weiciyuan.support.utils.GlobalContext; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.ObjectAnimator; import android.animation.ValueAnimator; import android.content.Intent; import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; import android.support.v4.view.ViewPager; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import java.util.ArrayList; import java.util.HashMap; /** * User: qii * Date: 14-3-21 */ public class GalleryAnimationActivity extends FragmentActivity { private static final int STATUS_BAR_HEIGHT_DP_UNIT = 25; private ArrayList<AnimationRect> rectList; private ArrayList<String> urls = new ArrayList<String>(); private ViewPager pager; private TextView position; private View background; private int initPosition; private ColorDrawable backgroundColor; public static Intent newIntent(MessageBean msg, ArrayList<AnimationRect> rectList, int initPosition) { Intent intent = new Intent(GlobalContext.getInstance(), GalleryAnimationActivity.class); intent.putExtra("msg", msg); intent.putExtra("rect", rectList); intent.putExtra("position", initPosition); return intent; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.galleryactivity_animation_layout); rectList = getIntent().getParcelableArrayListExtra("rect"); MessageBean msg = getIntent().getParcelableExtra("msg"); ArrayList<String> tmp = msg.getThumbnailPicUrls(); for (int i = 0; i < tmp.size(); i++) { urls.add(tmp.get(i).replace("thumbnail", "large")); } boolean disableHardwareLayerType = false; for (String url : urls) { if (url.contains(".gif")) { disableHardwareLayerType = true; break; } } position = (TextView) findViewById(R.id.position); initPosition = getIntent().getIntExtra("position", 0); pager = (ViewPager) findViewById(R.id.pager); pager.setAdapter(new ImagePagerAdapter(getSupportFragmentManager())); final boolean finalDisableHardwareLayerType = disableHardwareLayerType; pager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { @Override public void onPageSelected(int position) { super.onPageSelected(position); GalleryAnimationActivity.this.position.setText(String.valueOf(position + 1)); } @Override public void onPageScrollStateChanged(int scrollState) { if (scrollState != ViewPager.SCROLL_STATE_IDLE && finalDisableHardwareLayerType) { final int childCount = pager.getChildCount(); for (int i = 0; i < childCount; i++) { View child = pager.getChildAt(i); if (child.getLayerType() != View.LAYER_TYPE_NONE) { child.setLayerType(View.LAYER_TYPE_NONE, null); } } } } }); pager.setCurrentItem(getIntent().getIntExtra("position", 0)); pager.setOffscreenPageLimit(1); pager.setPageTransformer(true, new ZoomOutPageTransformer()); TextView sum = (TextView) findViewById(R.id.sum); sum.setText(String.valueOf(urls.size())); background = AnimationUtility.getAppContentView(this); if (savedInstanceState != null) { showBackgroundImmediately(); } } private HashMap<Integer, ContainerFragment> fragmentMap = new HashMap<Integer, ContainerFragment>(); private boolean alreadyAnimateIn = false; private class ImagePagerAdapter extends FragmentPagerAdapter { public ImagePagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { ContainerFragment fragment = fragmentMap.get(position); if (fragment == null) { boolean animateIn = (initPosition == position) && !alreadyAnimateIn; fragment = ContainerFragment .newInstance(urls.get(position), rectList.get(position), animateIn, initPosition == position); alreadyAnimateIn = true; fragmentMap.put(position, fragment); } return fragment; } //when activity is recycled, ViewPager will reuse fragment by theirs name, so //getItem wont be called, but we need fragmentMap to animate close operation @Override public void setPrimaryItem(ViewGroup container, int position, Object object) { super.setPrimaryItem(container, position, object); if (object instanceof Fragment) { fragmentMap.put(position, (ContainerFragment) object); } } @Override public int getCount() { return urls.size(); } } public void showBackgroundImmediately() { if (background.getBackground() == null) { backgroundColor = new ColorDrawable(Color.BLACK); background.setBackground(backgroundColor); } } public ObjectAnimator showBackgroundAnimate() { backgroundColor = new ColorDrawable(Color.BLACK); background.setBackground(backgroundColor); ObjectAnimator bgAnim = ObjectAnimator .ofInt(backgroundColor, "alpha", 0, 255); bgAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { background.setBackground(backgroundColor); } }); return bgAnim; } @Override public void onBackPressed() { ContainerFragment fragment = fragmentMap.get(pager.getCurrentItem()); if (fragment != null && fragment.canAnimateCloseActivity()) { backgroundColor = new ColorDrawable(Color.BLACK); ObjectAnimator bgAnim = ObjectAnimator.ofInt(backgroundColor, "alpha", 0); bgAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { background.setBackground(backgroundColor); } }); bgAnim.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); GalleryAnimationActivity.super.finish(); overridePendingTransition(-1, -1); } }); fragment.animationExit(bgAnim); } else { super.onBackPressed(); } } }