全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Android实现图片点击预览效果(zoom动画)

参考:https://developer.android.google.cn/training/animation/zoom.html

1.创建Views

下面的布局包括了你想要zoom的大版本和小版本的view。

1.ImageButton是小版本的,能点击的,点击后显示大版本的ImageView。

2.ImageView是大版本的,可以显示ImageButton点击后的样式。

3.ImageView一开始是不可见的(invisible),当ImageButton点击后,它会实现zoom动画,就像从ImageButton上扩大显示出来。

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:id="@+id/container"
 android:layout_width="match_parent"
 android:layout_height="match_parent">
 <LinearLayout android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:orientation="vertical"
  android:padding="16dp">
  <ImageButton
   android:id="@+id/thumb_button_1"
   android:layout_width="100dp"
   android:layout_height="75dp"
   android:layout_marginRight="1dp"
   android:src="@drawable/thumb1"
   android:scaleType="centerCrop"
android:contentDescription="@string/description_image_1" />
 </LinearLayout>
 <!-- 这个不可见的ImageView持有上面的ImageButton zoom后的图片版本。
 动画没有发生之前,它占据了整个屏幕。动画开始,这个View从上面
 ImageButton的范围变化到他自己最终的范围。
   -->
 <ImageView
  android:id="@+id/expanded_image"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:visibility="invisible"
android:contentDescription="@string/description_zoom_touch_close" />

</FrameLayout>

2.设置zoom动画

  在ImageButton上设置点击事件,执行zoom动画

public class ZoomActivity extends FragmentActivity {
 // 保存下当前动画类,以便可以随时结束动画
 private Animator mCurrentAnimator;
 //系统的短时长动画持续时间(单位ms)
 // 对于不易察觉的动画或者频繁发生的动画
 // 这个动画持续时间是最理想的
 private int mShortAnimationDuration;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_zoom);
  // 给ImageButton设置点击事件
  final View thumb1View = findViewById(R.id.thumb_button_1);
  thumb1View.setOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View view) {
  //执行zoom动画方法
    zoomImageFromThumb(thumb1View, R.drawable.image1);
   }
  });
  //取回系统默认的短时长动画持续时间
  mShortAnimationDuration = getResources().getInteger(
android.R.integer.config_shortAnimTime);
 }
 ...
}

3.实现zoom动画

你需要把从正常大小的view到扩大以后的view这个过程作成动画。

1.指定想要zoom的图片给ImageView。(理想情况下,这个bitmap的大小不应该比屏幕大)

2.计算这个ImageView的开始和结束位置

3.把四个点和缩放大小的属性同时作成动画,从开始的状态到结束的状态。这四个动画被添加到AnimatorSet中,方便他们同时执行。

4.当用户再次点击屏幕时,动画要执行回去。一样道理,给ImageView一个View.OnClickListener,然后隐藏ImageView。

private void zoomImageFromThumb(final View thumbView, int imageResId) {
 // 如果有动画在执行,立即取消,然后执行现在这个动画
 if (mCurrentAnimator != null) {
 mCurrentAnimator.cancel();
 }
 // 加载高分辨率的图片
 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();
 // 开始的范围就是ImageButton的范围,
 // 结束的范围是容器(FrameLayout)的范围
 // getGlobalVisibleRect(Rect)得到的是view相对于整个硬件屏幕的Rect
 // 即绝对坐标,减去偏移,获得动画需要的坐标,即相对坐标
 // getGlobalVisibleRect(Rect,Point)中,Point获得的是view在它在
 // 父控件上的坐标与在屏幕上坐标的偏移
 thumbView.getGlobalVisibleRect(startBounds);
 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;
 }
 });
}

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!


# android图片点击预览  # android  # 点击预览图片  # android实现图片预览  # zoom动画  # Android仿京东顶部搜索框滑动伸缩动画效果  # Android实现页面滑动切换动画  # Android实现手势滑动和简单动画效果  # Android程序开发之使用Design包实现QQ动画侧滑效果和滑动菜单导航  # Android编程实现ViewPager多页面滑动切换及动画效果的方法  # Android Tween动画之RotateAnimation实现图片不停旋转效果实例介绍  # android实现图片闪烁动画效果的两种实现方式(实用性高)  # Android Glide图片加载(加载监听、加载动画)  # Android图片翻转动画简易实现代码  # Android实现ViewFlipper图片动画滑动  # 的是  # 持续时间  # 时长  # 就像  # 这段  # 要把  # 他自己  # 不应  # 它在  # 相对于  # 它会  # 可以随时  # 结束时  # 你想要  # 情况下  # 加载  # 压扁  # 占据了  # 屏幕上  # 这四个 


相关文章: 赚钱网站制作软件,建一个网站怎样才能赚钱?是如何盈利的?  javascript中的try catch异常捕获机制用法分析  微信h5制作网站有哪些,免费微信H5页面制作工具?  如何通过NAT技术实现内网高效建站?  建站之星如何实现五合一智能建站与营销推广?  ,购物网站怎么盈利呢?    免费公司网站制作软件,如何申请免费主页空间做自己的网站?  网页设计与网站制作内容,怎样注册网站?  电影网站制作价格表,那些提供免费电影的网站,他们是怎么盈利的?  如何用西部建站助手快速创建专业网站?  教程网站设计制作软件,怎么创建自己的一个网站?  番禺网站制作公司哪家值得合作,番禺图书馆新馆开放了吗?  魔方云NAT建站如何实现端口转发?  电商网站制作价格怎么算,网上拍卖流程以及规则?  建站主机是否属于云主机类型?  购物网站制作公司有哪些,哪个购物网站比较好?  如何选择CMS系统实现快速建站与SEO优化?  佛山网站制作系统,佛山企业变更地址网上办理步骤?  兔展官网 在线制作,怎样制作微信请帖?  建站之星CMS建站配置指南:模板选择与SEO优化技巧  建站之星24小时客服电话如何获取?  建站之星展会模版如何一键下载生成?  如何通过WDCP绑定主域名及创建子域名站点?  如何在建站之星网店版论坛获取技术支持?  php json中文编码为null的解决办法  盐城做公司网站,江苏电子版退休证办理流程?  如何快速打造个性化非模板自助建站?  建站之家VIP精选网站模板与SEO优化教程整合指南  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  在线制作视频网站免费,都有哪些好的动漫网站?  学校为何禁止电信移动建设网站?  建站168自助建站系统:快速模板定制与SEO优化指南  哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?  如何在IIS中新建站点并配置端口与IP地址?  详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)  c++怎么实现高并发下的无锁队列_c++ std::atomic原子变量与CAS操作【详解】  PHP 500报错的快速解决方法  css网站制作参考文献有哪些,易聊怎么注册?  存储型VPS适合搭建中小型网站吗?  成都网站制作价格表,现在成都广电的单独网络宽带有多少的,资费是什么情况呢?  官网网站制作腾讯审核要多久,联想路由器newifi官网  建站之星IIS配置教程:代码生成技巧与站点搭建指南  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  天河区网站制作公司,广州天河区如何办理身份证?需要什么资料有预约的网站吗?  建站之星如何快速解决建站难题?  建站之星如何配置系统实现高效建站?  三星网站视频制作教程下载,三星w23网页如何全屏?  建站主机选择指南:服务器配置与SEO优化实战技巧  家具网站制作软件,家具厂怎么跑业务? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。