Android Open Source - Android-GridView-Zoom-Images-Animation-Tutorial Image Adapter






From Project

Back to project page Android-GridView-Zoom-Images-Animation-Tutorial.

License

The source code is released under:

Apache License

If you think the Android project Android-GridView-Zoom-Images-Animation-Tutorial listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

package com.androidbegin.gridviewzoom;
/*  w w w.j  a v  a  2  s .co  m*/
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.content.Context;
import android.app.Activity;
import android.graphics.Point;
import android.graphics.Rect;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.animation.DecelerateInterpolator;
import android.widget.BaseAdapter;
import android.widget.ImageView;

public class ImageAdapter extends BaseAdapter {

  private Animator mCurrentAnimator;

  private int mShortAnimationDuration;

  private Context mContext;
  LayoutInflater inflater;

  public ImageAdapter(Context c) {
    mContext = c;
  }

  public int getCount() {
    return mThumbIds.length;
  }

  public Object getItem(int position) {
    return mThumbIds[position];
  }

  public long getItemId(int position) {
    return 0;
  }

  public View getView(final int position, View convertView, ViewGroup parent) {

    final ImageView imageView;
    if (convertView == null) {
      imageView = new ImageView(mContext);
      imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
    } else {
      imageView = (ImageView) convertView;
    }

    imageView.setImageResource(mThumbIds[position]);
    imageView.setTag(mThumbIds[position]);
    imageView.setOnClickListener(new OnClickListener() {

      @Override
      public void onClick(View arg0) {
        int id = (Integer) arg0.getTag();
        zoomImageFromThumb(arg0, id);
      }
    });

    return imageView;
  }

  // References to our images in res > drawable
  public Integer[] mThumbIds = { R.drawable.sample_0, R.drawable.sample_1,
      R.drawable.sample_2, R.drawable.sample_3, R.drawable.sample_4,
      R.drawable.sample_5, R.drawable.sample_6, R.drawable.sample_7,
      R.drawable.sample_8, R.drawable.sample_9, R.drawable.sample_10,
      R.drawable.sample_11, R.drawable.sample_12, R.drawable.sample_13,
      R.drawable.sample_14, R.drawable.sample_15, R.drawable.sample_16,
      R.drawable.sample_17, R.drawable.sample_18 };

  private void zoomImageFromThumb(final View thumbView, int imageResId) {
    // If there's an animation in progress, cancel it immediately and
    // proceed with this one.
    if (mCurrentAnimator != null) {
      mCurrentAnimator.cancel();
    }

    // Load the high-resolution "zoomed-in" image.
    final ImageView expandedImageView = (ImageView) ((Activity) mContext)
        .findViewById(R.id.expanded_image);
    expandedImageView.setImageResource(imageResId);

    // Calculate the starting and ending bounds for the zoomed-in image.
    // This step
    // involves lots of math. Yay, math.
    final Rect startBounds = new Rect();
    final Rect finalBounds = new Rect();
    final Point globalOffset = new Point();

    // The start bounds are the global visible rectangle of the thumbnail,
    // and the
    // final bounds are the global visible rectangle of the container view.
    // Also
    // set the container view's offset as the origin for the bounds, since
    // that's
    // the origin for the positioning animation properties (X, Y).
    thumbView.getGlobalVisibleRect(startBounds);
    ((Activity) mContext).findViewById(R.id.container)
        .getGlobalVisibleRect(finalBounds, globalOffset);
    startBounds.offset(-globalOffset.x, -globalOffset.y);
    finalBounds.offset(-globalOffset.x, -globalOffset.y);

    // Adjust the start bounds to be the same aspect ratio as the final
    // bounds using the
    // "center crop" technique. This prevents undesirable stretching during
    // the animation.
    // Also calculate the start scaling factor (the end scaling factor is
    // always 1.0).
    float startScale;
    if ((float) finalBounds.width() / finalBounds.height() > (float) startBounds
        .width() / startBounds.height()) {
      // Extend start bounds horizontally
      startScale = (float) startBounds.height() / finalBounds.height();
      float startWidth = startScale * finalBounds.width();
      float deltaWidth = (startWidth - startBounds.width()) / 2;
      startBounds.left -= deltaWidth;
      startBounds.right += deltaWidth;
    } else {
      // Extend start bounds vertically
      startScale = (float) startBounds.width() / finalBounds.width();
      float startHeight = startScale * finalBounds.height();
      float deltaHeight = (startHeight - startBounds.height()) / 2;
      startBounds.top -= deltaHeight;
      startBounds.bottom += deltaHeight;
    }

    // Hide the thumbnail and show the zoomed-in view. When the animation
    // begins,
    // it will position the zoomed-in view in the place of the thumbnail.
    thumbView.setAlpha(0f);
    expandedImageView.setVisibility(View.VISIBLE);

    // Set the pivot point for SCALE_X and SCALE_Y transformations to the
    // top-left corner of
    // the zoomed-in view (the default is the center of the view).
    expandedImageView.setPivotX(0f);
    expandedImageView.setPivotY(0f);

    // Construct and run the parallel animation of the four translation and
    // scale properties
    // (X, Y, SCALE_X, and SCALE_Y).
    AnimatorSet set = new AnimatorSet();
    set.play(
        ObjectAnimator.ofFloat(expandedImageView, View.X,
            startBounds.left, finalBounds.left))
        .with(ObjectAnimator.ofFloat(expandedImageView, View.Y,
            startBounds.top, finalBounds.top))
        .with(ObjectAnimator.ofFloat(expandedImageView, View.SCALE_X,
            startScale, 1f))
        .with(ObjectAnimator.ofFloat(expandedImageView, View.SCALE_Y,
            startScale, 1f));
    set.setDuration(mShortAnimationDuration);
    set.setInterpolator(new DecelerateInterpolator());
    set.addListener(new AnimatorListenerAdapter() {
      @Override
      public void onAnimationEnd(Animator animation) {
        mCurrentAnimator = null;
      }

      @Override
      public void onAnimationCancel(Animator animation) {
        mCurrentAnimator = null;
      }
    });
    set.start();
    mCurrentAnimator = set;

    // Upon clicking the zoomed-in image, it should zoom back down to the
    // original bounds
    // and show the thumbnail instead of the expanded image.
    final float startScaleFinal = startScale;
    expandedImageView.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View view) {
        if (mCurrentAnimator != null) {
          mCurrentAnimator.cancel();
        }

        // Animate the four positioning/sizing properties in parallel,
        // back to their
        // original values.
        AnimatorSet set = new AnimatorSet();
        set.play(
            ObjectAnimator.ofFloat(expandedImageView, View.X,
                startBounds.left))
            .with(ObjectAnimator.ofFloat(expandedImageView, View.Y,
                startBounds.top))
            .with(ObjectAnimator.ofFloat(expandedImageView,
                View.SCALE_X, startScaleFinal))
            .with(ObjectAnimator.ofFloat(expandedImageView,
                View.SCALE_Y, startScaleFinal));
        set.setDuration(mShortAnimationDuration);
        set.setInterpolator(new DecelerateInterpolator());
        set.addListener(new AnimatorListenerAdapter() {
          @Override
          public void onAnimationEnd(Animator animation) {
            thumbView.setAlpha(1f);
            expandedImageView.setVisibility(View.GONE);
            mCurrentAnimator = null;
          }

          @Override
          public void onAnimationCancel(Animator animation) {
            thumbView.setAlpha(1f);
            expandedImageView.setVisibility(View.GONE);
            mCurrentAnimator = null;
          }
        });
        set.start();
        mCurrentAnimator = set;
      }
    });
  }
}




Java Source Code List

com.androidbegin.gridviewzoom.GridViewActivity.java
com.androidbegin.gridviewzoom.ImageAdapter.java