private void animateOut() { ValueAnimator animWidth = ValueAnimator.ofInt(zoomableImageView.getMeasuredWidth(), rect.right); animWidth.addUpdateListener( new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator valueAnimator) { int val = (Integer) valueAnimator.getAnimatedValue(); ViewGroup.LayoutParams layoutParams = zoomableImageView.getLayoutParams(); layoutParams.width = val; zoomableImageView.setLayoutParams(layoutParams); } }); animWidth.setDuration(500); animWidth.start(); ValueAnimator animHeight = ValueAnimator.ofInt(zoomableImageView.getMeasuredHeight(), rect.bottom); animHeight.addUpdateListener( new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator valueAnimator) { int val = (Integer) valueAnimator.getAnimatedValue(); ViewGroup.LayoutParams layoutParams = zoomableImageView.getLayoutParams(); layoutParams.height = val; zoomableImageView.setLayoutParams(layoutParams); } }); animHeight.setDuration(500); animHeight.start(); if (statusBarHeightCorrection > 0) { zoomableImageView.animate().y(-statusBarHeightCorrection).setDuration(300).start(); } zoomableImageView.animate().alpha(0.0f).setDuration(500).start(); }
@Override public Object instantiateItem(ViewGroup container, int position) { View itemView = mLayoutInflater.inflate(R.layout.item_preview, container, false); PhotoView imageView = (PhotoView) itemView.findViewById(R.id.iv_pager); final String path = paths.get(position); final Uri uri; if (path.startsWith("http")) { uri = Uri.parse(path); } else { uri = Uri.fromFile(new File(path)); } Glide.with(mContext) .load(uri) // .placeholder(R.mipmap.default_error) .error(R.mipmap.default_error) .crossFade() .into(imageView); imageView.setOnPhotoTapListener( new PhotoViewAttacher.OnPhotoTapListener() { @Override public void onPhotoTap(View view, float v, float v1) { if (listener != null) { listener.OnPhotoTapListener(view, v, v1); } } }); container.addView(itemView); return itemView; }
public void animationExit(ObjectAnimator backgroundAnimator) { if (Math.abs(photoView.getScale() - 1.0f) > 0.1f) { photoView.setScale(1, true); return; } getActivity().overridePendingTransition(0, 0); animateClose(backgroundAnimator); }
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mPhotoView = (PhotoView) findViewById(R.id.pv_photo); Drawable bitmap = getResources().getDrawable(R.drawable.wallpaper); mPhotoView.setImageDrawable(bitmap); mPhotoView.setZoomable(true); }
@Override public Object instantiateItem(ViewGroup container, int position) { PhotoView photo = new PhotoView(container.getContext()); photo.setScaleType(ImageView.ScaleType.FIT_CENTER); // Load Image from URL using Glide Glide.with(activity) .load(imagesList.get(position)) .crossFade() .diskCacheStrategy(DiskCacheStrategy.ALL) .into(photo); container.addView( photo, ViewPager.LayoutParams.MATCH_PARENT, ViewPager.LayoutParams.MATCH_PARENT); return photo; }
public void runExitAnimation(ObjectAnimator backgroundAnimator) { mGifView.setVisibility(View.GONE); mPhotoView.setVisibility(View.VISIBLE); // setBitmapToPhotoView(); // AnimationRect rect = getArguments().getParcelable("rect"); AnimationRect.runExitAnimation(mPhotoView, mRect, backgroundAnimator); }
@Override public View onCreateView( LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_photo_view, container, false); imageView = (PhotoView) view.findViewById(R.id.photoIm); progressBar = (CircularProgressBar) view.findViewById(R.id.progressBar); ImageLoader loader = ImageLoader.getInstance(); ImageLoaderUtils.initImageLoader(getActivity()); DisplayImageOptions options = new DisplayImageOptions.Builder().cacheInMemory(true).cacheOnDisc(true).build(); imageView.setOnViewTapListener( new PhotoViewAttacher.OnViewTapListener() { @Override public void onViewTap(View view, float x, float y) { getActivity().finish(); } }); loader.displayImage( url, imageView, options, new ImageLoadingListener() { @Override public void onLoadingStarted(String imageUri, View view) {} @Override public void onLoadingFailed(String imageUri, View view, FailReason failReason) {} @Override public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { if (imageUri.equals(url)) { progressBar.setVisibility(View.GONE); } } @Override public void onLoadingCancelled(String imageUri, View view) {} }, new ImageLoadingProgressListener() { @Override public void onProgressUpdate(String s, View view, int i, int i2) { progressBar.setProgressPecentage((float) i / i2); } }); return view; }
@Override public boolean onException( Exception e, String model, Target<Bitmap> target, boolean isFirstResource) { if (image != null) { image.setImageResource(R.drawable.cancel); } if (progress != null) { progress.setVisibility(View.GONE); } if (getActivity() != null) Toast.makeText(getActivity(), R.string.loading_exception_error, Toast.LENGTH_SHORT) .show(); return false; }
@Nullable @Override public View onCreateView( LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_image_gif, container, false); mGifView = (PhotoView) view.findViewById(R.id.iv_normal); mPhotoView = (ClipImageView) view.findViewById(R.id.cover); mScreenWidth = getResources().getDisplayMetrics().widthPixels; mGifView.setOnLongClickListener(this); File gifFile = new File(mPath); try { GifDrawable gifFromFile = new GifDrawable(gifFile); mGifView.setImageDrawable(gifFromFile); } catch (IOException e) { e.printStackTrace(); } setBitmapToPhotoView(); if (mAnimateIn) { mAnimateIn = false; runEnterAnimation(); } if (SettingHelper.isClickToCloseGallery()) { mGifView.setOnViewTapListener( new PhotoViewAttacher.OnViewTapListener() { @Override public void onViewTap(View view, float x, float y) { getActivity().onBackPressed(); } }); } return view; }
/** 用来实例化页卡 */ @Override public Object instantiateItem(ViewGroup container, int position) { PhotoView photoView = new PhotoView(mContext); // photoView.setScaleType(ImageView.ScaleType.CENTER); photoView.setScaleType(ImageView.ScaleType.FIT_CENTER); Glide.with(mContext).load(mPictures.get(position)).into(photoView); // Now just add PhotoView to ViewPager and return it container.addView( photoView, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); // 单击图片 photoView.setOnPhotoTapListener( new PhotoViewAttacher.OnPhotoTapListener() { @Override public void onPhotoTap(View view, float v, float v1) { mOnSingleClickListener.singleClickFinish(); } @Override public void onOutsidePhotoTap() { mOnSingleClickListener.singleClickFinish(); } }); return photoView; }
private void applyZoomLevel() { if (image != null && image.canZoom()) { switch (zoomLevel) { case 0: image.setScale(image.getMinimumScale(), true); break; case 1: image.setScale(image.getMediumScale(), true); break; case 2: image.setScale(image.getMaximumScale(), true); break; } } }
private void runEnterAnimation() { mPhotoView.setVisibility(View.VISIBLE); mGifView.setVisibility(View.GONE); AnimationRect.runEnterAnimation(mPhotoView, mRect, mGifView); }
@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; }
private void animateClose(ObjectAnimator backgroundAnimator) { AnimationRect rect = getArguments().getParcelable("rect"); if (rect == null) { photoView.animate().alpha(0); backgroundAnimator.start(); return; } final Rect startBounds = rect.scaledBitmapRect; final Rect finalBounds = AnimationUtility.getBitmapRectFromImageView(photoView); if (finalBounds == null) { photoView.animate().alpha(0); backgroundAnimator.start(); return; } if (Utility.isDevicePort() != rect.isScreenPortrait) { photoView.animate().alpha(0); backgroundAnimator.start(); return; } float startScale; if ((float) finalBounds.width() / finalBounds.height() > (float) startBounds.width() / startBounds.height()) { startScale = (float) startBounds.height() / finalBounds.height(); } else { startScale = (float) startBounds.width() / finalBounds.width(); } final float startScaleFinal = startScale; 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 .animate() .translationX(deltaLeft) .translationY(deltaTop) .scaleY(startScaleFinal) .scaleX(startScaleFinal) .setDuration(ANIMATION_DURATION) .setInterpolator(new AccelerateDecelerateInterpolator()) .withEndAction( new Runnable() { @Override public void run() { photoView .animate() .alpha(0.0f) .setDuration(200) .withEndAction( new Runnable() { @Override public void run() {} }); } }); AnimatorSet animationSet = new AnimatorSet(); animationSet.setDuration(ANIMATION_DURATION); animationSet.setInterpolator(new AccelerateDecelerateInterpolator()); animationSet.playTogether(backgroundAnimator); animationSet.playTogether( ObjectAnimator.ofFloat( photoView, "clipBottom", 0, AnimationRect.getClipBottom(rect, finalBounds))); animationSet.playTogether( ObjectAnimator.ofFloat( photoView, "clipRight", 0, AnimationRect.getClipRight(rect, finalBounds))); animationSet.playTogether( ObjectAnimator.ofFloat( photoView, "clipTop", 0, AnimationRect.getClipTop(rect, finalBounds))); animationSet.playTogether( ObjectAnimator.ofFloat( photoView, "clipLeft", 0, AnimationRect.getClipLeft(rect, finalBounds))); animationSet.start(); }
private void animateIn(final Dialog dialog) { RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) zoomableImageView.getLayoutParams(); params.width = rect.right; params.height = rect.bottom; zoomableImageView.setLayoutParams(params); zoomableImageView.setX(rect.left); zoomableImageView.setY(rect.top - statusBarHeightCorrection); zoomableImageView.setAlpha(0.0f); zoomableImageView.setImageBitmap(bitmap); WindowManager win = getActivity().getWindowManager(); Display d = win.getDefaultDisplay(); int displayWidth = d.getWidth(); // Width of the actual device int displayHeight = d.getHeight() + statusBarHeightCorrection; ValueAnimator animWidth = ValueAnimator.ofInt(rect.right, displayWidth); animWidth.addUpdateListener( new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator valueAnimator) { int val = (Integer) valueAnimator.getAnimatedValue(); ViewGroup.LayoutParams layoutParams = zoomableImageView.getLayoutParams(); layoutParams.width = val; zoomableImageView.setLayoutParams(layoutParams); } }); animWidth.setDuration(500); animWidth.setInterpolator(new LinearOutSlowInInterpolator()); animWidth.start(); ValueAnimator animHeight = ValueAnimator.ofInt(rect.bottom, displayHeight); animHeight.addUpdateListener( new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator valueAnimator) { int val = (Integer) valueAnimator.getAnimatedValue(); ViewGroup.LayoutParams layoutParams = zoomableImageView.getLayoutParams(); layoutParams.height = val; zoomableImageView.setLayoutParams(layoutParams); } }); animHeight.setDuration(500); animHeight.setInterpolator(new LinearOutSlowInInterpolator()); animHeight.start(); if (statusBarHeightCorrection > 0) { zoomableImageView.animate().y(0.0f).setDuration(300).start(); } ValueAnimator animDim = ValueAnimator.ofFloat(0.0f, 0.5f); animDim.addUpdateListener( new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator valueAnimator) { WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams(); layoutParams.copyFrom(dialog.getWindow().getAttributes()); layoutParams.dimAmount = (Float) valueAnimator.getAnimatedValue(); dialog.getWindow().setAttributes(layoutParams); } }); animDim.setDuration(300); animDim.setStartDelay(300); animDim.start(); zoomableImageView.animate().alpha(1.0f).setDuration(300).start(); }
@Override public Object instantiateItem(ViewGroup container, final int position) { View itemView = mLayoutInflater.inflate(R.layout.pager_item, container, false); final PhotoView pvComic = (PhotoView) itemView.findViewById(R.id.ivComic); itemView.setTag(position); final TextView tvAlt = (TextView) itemView.findViewById(R.id.tvAlt); if (PrefHelper.altByDefault()) { tvAlt.setVisibility(View.VISIBLE); } tvAlt.setText(PrefHelper.getAlt(sFavorites[position])); // fix for issue #2 pvComic.setOnDoubleTapListener( new GestureDetector.OnDoubleTapListener() { @Override public boolean onDoubleTap(MotionEvent e) { if (pvComic.getScale() < 0.5f * pvComic.getMaximumScale()) { pvComic.setScale(0.5f * pvComic.getMaximumScale(), true); } else if (pvComic.getScale() < pvComic.getMaximumScale()) { pvComic.setScale(pvComic.getMaximumScale(), true); } else { pvComic.setScale(1.0f, true); } return true; } @Override public boolean onSingleTapConfirmed(MotionEvent e) { if (!PrefHelper.altLongTap()) { if (PrefHelper.classicAltStyle()) { toggleVisibility(tvAlt); } else { android.support.v7.app.AlertDialog.Builder mDialog = new android.support.v7.app.AlertDialog.Builder(getActivity()); mDialog.setMessage(tvAlt.getText()); mDialog.show(); } } return false; } @Override public boolean onDoubleTapEvent(MotionEvent e) { if (e.getAction() == MotionEvent.ACTION_UP) { fingerLifted = true; } if (e.getAction() == MotionEvent.ACTION_DOWN) { fingerLifted = false; } return false; } }); // Setup alt text and LongClickListener pvComic.setOnLongClickListener( new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { if (fingerLifted && PrefHelper.altLongTap()) { if (PrefHelper.altVibration()) { Vibrator vi = (Vibrator) getActivity().getSystemService(MainActivity.VIBRATOR_SERVICE); vi.vibrate(10); } // tvAlt.setText(PrefHelper.getAlt(sFavorites[sFavoriteIndex])); if (PrefHelper.classicAltStyle()) { toggleVisibility(tvAlt); } else { android.support.v7.app.AlertDialog.Builder mDialog = new android.support.v7.app.AlertDialog.Builder(getActivity()); mDialog.setMessage(tvAlt.getText()); mDialog.show(); } } return true; } }); // setup the title text view TextView tvTitle = (TextView) itemView.findViewById(R.id.tvTitle); tvTitle.setText(PrefHelper.getTitle(sFavorites[position])); if (PrefHelper.invertColors()) { float[] colorMatrix_Negative = { -1.0f, 0, 0, 0, 255, // red 0, -1.0f, 0, 0, 255, // green 0, 0, -1.0f, 0, 255, // blue 0, 0, 0, 1.0f, 0 // alpha }; ColorFilter cf = new ColorMatrixColorFilter(colorMatrix_Negative); pvComic.setColorFilter(cf); } // load the image pvComic.setImageBitmap(mComicMap.get(position).getBitmap()); if (Arrays.binarySearch( mContext.getResources().getIntArray(R.array.large_comics), sFavorites[sFavoriteIndex]) >= 0) { pvComic.setMaximumScale(7.0f); } // Disable ViewPager scrolling when the user zooms into an image pvComic.setOnMatrixChangeListener( new PhotoViewAttacher.OnMatrixChangedListener() { @Override public void onMatrixChanged(RectF rectF) { if (pvComic.getScale() > 1.4) { mPager.setLocked(true); } else { mPager.setLocked(false); } } }); container.addView(itemView); return itemView; }
@Override public View instantiateItem(ViewGroup container, final int position) { final PhotoView photoView = new PhotoView(container.getContext()); photoView.setImageResource(sDrawables[position]); // Now just add PhotoView to ViewPager and return it container.addView(photoView, LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); photoView.setOnPhotoTapListener( new PhotoViewAttacher.OnPhotoTapListener() { public void onPhotoTap( View paramAnonymousView, float paramAnonymousFloat1, float paramAnonymousFloat2) { if (mCurrentAnimator != null) { mCurrentAnimator.cancel(); } photoView.clearZoom(); boolean scaleResult = getScaleFinalBounds(position); // Animate the four positioning/sizing properties in parallel, // back to their // original values. AnimatorSet as = new AnimatorSet(); ObjectAnimator containAlphaAnimator = ObjectAnimator.ofFloat(((MainActivity) mContext).gridView, "alpha", 0.f, 1.0f); if (scaleResult) { ObjectAnimator animatorX = ObjectAnimator.ofFloat(viewPager, "x", startBounds.left); ObjectAnimator animatorY = ObjectAnimator.ofFloat(viewPager, "y", startBounds.top); ObjectAnimator animatorScaleX = ObjectAnimator.ofFloat(viewPager, "scaleX", startScaleFinal); ObjectAnimator animatorScaleY = ObjectAnimator.ofFloat(viewPager, "scaleY", startScaleFinal); as.play(containAlphaAnimator) .with(animatorX) .with(animatorY) .with(animatorScaleX) .with(animatorScaleY); } else { // the selected photoview is beyond the mobile screen display // so it just fade out ObjectAnimator alphaAnimator = ObjectAnimator.ofFloat(viewPager, "alpha", 0.1f); as.play(alphaAnimator).with(containAlphaAnimator); } as.setDuration(mShortAnimationDuration); as.setInterpolator(new DecelerateInterpolator()); as.addListener( new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { viewPager.clearAnimation(); viewPager.setVisibility(View.GONE); mCurrentAnimator = null; } @Override public void onAnimationCancel(Animator animation) { viewPager.clearAnimation(); viewPager.setVisibility(View.GONE); mCurrentAnimator = null; } }); as.start(); mCurrentAnimator = as; } }); return photoView; }