本文实例为大家分享了Android点击缩略图放大效果的具体代码,供大家参考,具体内容如下

import android.animation.Animator;import android.animation.AnimatorListenerAdapter;import android.animation.AnimatorSet;import android.animation.ObjectAnimator;import android.graphics.Point;import android.graphics.Rect;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.view.animation.DecelerateInterpolator;import android.widget.ImageView;public class MainActivity extends AppCompatActivity {  // 持有这个动画的引用,让他可以在动画执行中途取消  private Animator mCurrentAnimator;  private int mShortAnimationDuration;  private View imageView1;  private View imageView2;  @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    initView();    imageView1.setOnClickListener(new View.OnClickListener() {      @Override      public void onClick(View v) {        zoomImageFromThumb(imageView1,R.mipmap.ic_launcher);      }    });    imageView2.setOnClickListener(new View.OnClickListener() {      @Override      public void onClick(View v) {        zoomImageFromThumb(imageView2,R.mipmap.ic_launcher);      }    });    // 系统默认的短动画执行时间 200    mShortAnimationDuration = getResources().getInteger(        android.R.integer.config_shortAnimTime);  }  private void initView() {    imageView1 = (ImageView) findViewById(R.id.imageView1);    imageView2 = (ImageView) findViewById(R.id.imageView2);  }  private void zoomImageFromThumb(final View thumbView, int imageResId) {    // 如果有动画正在运行,取消这个动画    if (mCurrentAnimator != null) {      mCurrentAnimator.cancel();    }    // 加载显示大图的ImageView    final ImageView expandedImageView = (ImageView) findViewById(        R.id.expanded_image);    expandedImageView.setImageResource(imageResId);    // 计算初始小图的边界位置和最终大图的边界位置。    final Rect startBounds = new Rect();    final Rect finalBounds = new Rect();    final Point globalOffset = new Point();    // 小图的边界就是小ImageView的边界,大图的边界因为是铺满全屏的,所以就是整个布局的边界。    // 然后根据偏移量得到正确的坐标。    thumbView.getGlobalVisibleRect(startBounds);    findViewById(R.id.imageView1).getGlobalVisibleRect(finalBounds, globalOffset);    startBounds.offset(-globalOffset.x, -globalOffset.y);    finalBounds.offset(-globalOffset.x, -globalOffset.y);    // 计算初始的缩放比例。最终的缩放比例为1。并调整缩放方向,使看着协调。    float startScale=0;    if ((float) finalBounds.width() / finalBounds.height()        > (float) startBounds.width() / startBounds.height()) {      // 横向缩放      float startWidth = startScale * finalBounds.width();      float deltaWidth = (startWidth - startBounds.width()) / 2;      startBounds.left -= deltaWidth;      startBounds.right += deltaWidth;    } else {      // 竖向缩放      float startHeight = startScale * finalBounds.height();      float deltaHeight = (startHeight - startBounds.height()) / 2;      startBounds.top -= deltaHeight;      startBounds.bottom += deltaHeight;    }    // 隐藏小图,并显示大图    thumbView.setAlpha(0f);    expandedImageView.setVisibility(View.VISIBLE);    // 将大图的缩放中心点移到左上角。默认是从中心缩放    expandedImageView.setPivotX(0f);    expandedImageView.setPivotY(0f);    //对大图进行缩放动画    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;    // 点击大图时,反向缩放大图,然后隐藏大图,显示小图。    final float startScaleFinal = startScale;    expandedImageView.setOnClickListener(new View.OnClickListener() {      @Override      public void onClick(View view) {        if (mCurrentAnimator != null) {          mCurrentAnimator.cancel();        }        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;      }    });  }}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

更多相关文章

  1. Android 图片缩放与旋转的实现详解
  2. 如何使用Android MediaStore裁剪大图片
  3. 【Android】一个浏览图片的Android库的实现,可以移动、缩放图片以
  4. Android实现图片随意拖动、缩放
  5. Android图片双指缩放,单指移动实现

随机推荐

  1. Android Studio 配置输出apk的名字
  2. android fragment 面试
  3. android通过图片名称获取资源识别码
  4. android中使用static、application、本地
  5. Android G711A编解码
  6. android银行卡操作步骤
  7. ANDROID音频系统散记之四:4.0音频系统HAL
  8. 常用adb命令
  9. Android - 详情页面【仿】淘宝App
  10. JS调用Android、Ios原生控件