@Override public View onCreateView( LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.gallery_general_layout, container, false); photoView = (PhotoView) view.findViewById(R.id.animation); if (SettingUtility.allowClickToCloseGallery()) { photoView.setOnViewTapListener( new PhotoViewAttacher.OnViewTapListener() { @Override public void onViewTap(View view, float x, float y) { getActivity().onBackPressed(); } }); } LongClickListener longClickListener = ((ContainerFragment) getParentFragment()).getLongClickListener(); photoView.setOnLongClickListener(longClickListener); final String path = getArguments().getString("path"); boolean animateIn = getArguments().getBoolean("animationIn"); final AnimationRect rect = getArguments().getParcelable("rect"); if (!animateIn) { new MyAsyncTask<Void, Bitmap, Bitmap>() { @Override protected Bitmap doInBackground(Void... params) { Bitmap bitmap = ImageUtility.decodeBitmapFromSDCard( path, IMAGEVIEW_SOFT_LAYER_MAX_WIDTH, IMAGEVIEW_SOFT_LAYER_MAX_HEIGHT); return bitmap; } @Override protected void onPostExecute(Bitmap bitmap) { super.onPostExecute(bitmap); photoView.setImageBitmap(bitmap); } }.executeOnExecutor(MyAsyncTask.THREAD_POOL_EXECUTOR); return view; } final Bitmap bitmap = ImageUtility.decodeBitmapFromSDCard( path, IMAGEVIEW_SOFT_LAYER_MAX_WIDTH, IMAGEVIEW_SOFT_LAYER_MAX_HEIGHT); photoView.setImageBitmap(bitmap); final Runnable endAction = new Runnable() { @Override public void run() { Bundle bundle = getArguments(); bundle.putBoolean("animationIn", false); } }; photoView .getViewTreeObserver() .addOnPreDrawListener( new ViewTreeObserver.OnPreDrawListener() { @Override public boolean onPreDraw() { if (rect == null) { photoView.getViewTreeObserver().removeOnPreDrawListener(this); return true; } final Rect startBounds = new Rect(rect.scaledBitmapRect); final Rect finalBounds = AnimationUtility.getBitmapRectFromImageView(photoView); if (finalBounds == null) { photoView.getViewTreeObserver().removeOnPreDrawListener(this); return true; } float startScale = (float) finalBounds.width() / startBounds.width(); if (startScale * startBounds.height() > finalBounds.height()) { startScale = (float) finalBounds.height() / startBounds.height(); } int deltaTop = startBounds.top - finalBounds.top; int deltaLeft = startBounds.left - finalBounds.left; photoView.setPivotY((photoView.getHeight() - finalBounds.height()) / 2); photoView.setPivotX((photoView.getWidth() - finalBounds.width()) / 2); photoView.setScaleX(1 / startScale); photoView.setScaleY(1 / startScale); photoView.setTranslationX(deltaLeft); photoView.setTranslationY(deltaTop); photoView .animate() .translationY(0) .translationX(0) .scaleY(1) .scaleX(1) .setDuration(ANIMATION_DURATION) .setInterpolator(new AccelerateDecelerateInterpolator()) .withEndAction(endAction); AnimatorSet animationSet = new AnimatorSet(); animationSet.setDuration(ANIMATION_DURATION); animationSet.setInterpolator(new AccelerateDecelerateInterpolator()); animationSet.playTogether( ObjectAnimator.ofFloat( photoView, "clipBottom", AnimationRect.getClipBottom(rect, finalBounds), 0)); animationSet.playTogether( ObjectAnimator.ofFloat( photoView, "clipRight", AnimationRect.getClipRight(rect, finalBounds), 0)); animationSet.playTogether( ObjectAnimator.ofFloat( photoView, "clipTop", AnimationRect.getClipTop(rect, finalBounds), 0)); animationSet.playTogether( ObjectAnimator.ofFloat( photoView, "clipLeft", AnimationRect.getClipLeft(rect, finalBounds), 0)); animationSet.start(); photoView.getViewTreeObserver().removeOnPreDrawListener(this); return true; } }); return view; }