前言

  我们在微信朋友圈看别人发的带图片说说时,点击某张图片,会放大全屏显示,并且左右滑动可以切换浏览多张图片。

  这种效果应用场景很多,尤其是购物和餐饮类app很常见。比如点餐软件,一般会向顾客使用列表方式整体展示所有菜品的缩略图、价格、原料、做法、营养功效、食客评价等,由于缩略图提供的直观信息不全不清晰,顾客还可以点击缩略图进一步查看菜品的多张实拍大图,效果就是点击缩略图弹出大图,左右滑动切换图片,屏幕底部小圆点指示当前图片索引,然后点击大图,大图消失会弹回去,回到缩略图界面。

  购物类app如淘宝在用户选择商品时,一般会点击商品缩略图,全屏展示商品多张高清实物图,也可以滑动浏览,点击实物图,又会回到之前页面。

  此时,我们可能会琢磨这种效果该如何实现。其实并不难,使用ViewPager配合Activity一些特性,再加上必要的过渡动画即可完成。

具体实现流程

一、定义一个专门用来显示弹出大图的Activity

  因为图片要全屏展示,所以我们要在onCreate生命周期的方法里加上这样一句

// 设置为全屏
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

注意:上面这句代码一定要在setContentView()被调用前执行,否则会报错。

二、Activity布局

  我们需要定义一个ViewPager以及显示在屏幕底部的小圆点指示控件。因为这个小圆点个数是根据页数来确定的,也即根据图片显示个数确定,所以我们需要动态创建,可以先在xml文件里定义好它的父布局,这里我们采用线性布局,根据android:layout_weight属性设定权值,确立图片与小圆点显示比例。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@android:color/black"android:orientation="vertical" ><android.support.v4.view.ViewPagerandroid:id="@+id/show_origin_pic_vp"android:layout_width="match_parent"android:layout_height="0dip"android:layout_weight="18" /><LinearLayoutandroid:id="@+id/show_origin_pic_dot"android:layout_width="match_parent"android:layout_height="0dip"android:layout_weight="1"android:gravity="center"android:orientation="horizontal" /></LinearLayout>

三、 获取所有展示的大图,绘制小圆点

  大图获取涉及到加载网络图片,网上有很多教程,这里就不赘述。

  我们定义一个方法动态绘制圆点,并且监听ViewPager页面切换事件,实现通过改变圆点亮暗色显示指示当前页面索引。

/*** 设置圆点*/
public void setOvalLayout() {if(mPageCount <= 0) {return;}mPageDotLl.removeAllViews();for (int i = 0; i < mPageCount; i++) {mPageDotLl.addView(LayoutInflater.from(this).inflate(R.layout.vp_dot, mPageDotLl, false));}mPageDotLl.getChildAt(mCurPageIndex).findViewById(R.id.v_dot).setBackgroundResource(R.drawable.shape_circle_white);mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {@Overridepublic void onPageSelected(int position) {// 取消圆点选中mPageDotLl.getChildAt(mCurPageIndex).findViewById(R.id.v_dot).setBackgroundResource(R.drawable.shape_circle_gray);// 圆点选中mPageDotLl.getChildAt(position).findViewById(R.id.v_dot).setBackgroundResource(R.drawable.shape_circle_white);mCurPageIndex = position;}@Overridepublic void onPageScrolled(int arg0, float arg1, int arg2) {}@Overridepublic void onPageScrollStateChanged(int arg0) {}});
}

四、页面跳转过渡动画实现

  我们点击缩略图弹出大图,以及点击大图弹回之前页面需要有一个过渡动画,也就是要自定义实现Activity打开和关闭动画。

打开动画activity_zoom_open.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"android:interpolator="@android:anim/accelerate_interpolator" ><scaleandroid:fromXScale="0.0"android:fromYScale="0.0"android:toXScale="1.0"android:toYScale="1.0"android:pivotX="50%"android:pivotY="50%"android:duration="@android:integer/config_shortAnimTime" /><alphaandroid:fromAlpha="0.0"android:toAlpha="1.0"android:duration="@android:integer/config_shortAnimTime" /></set>

关闭动画activity_zoom_close.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"android:interpolator="@android:anim/decelerate_interpolator" ><scaleandroid:fromXScale="1.0"android:fromYScale="1.0"android:toXScale="0.0"android:toYScale="0.0"android:pivotX="50%"android:pivotY="50%"android:duration="@android:integer/config_shortAnimTime" /><alphaandroid:fromAlpha="1.0"android:toAlpha="0.0"android:duration="@android:integer/config_shortAnimTime"/></set>

在Activity跳转方法里添加打开动画

public static void navigateTo(Activity activity, String imgUrl) {Intent intent = new Intent(activity, ShowOriginPicActivity.class);intent.putExtra(EXTRA_KEY_ITEM_IMAGE_URL, imgUrl);activity.startActivity(intent);activity.overridePendingTransition(R.anim.activity_zoom_open, 0);
}

在Activity关闭方法里添加关闭动画

@Override
public void finishShowPic() {finish();overridePendingTransition(0, R.anim.activity_zoom_close);
}

因为关闭大图操作需要在我们定义的Viewpager适配器ImageAdapter里实现用来显示图片的每一个ImageView监听事件:

iv.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if(mOnFinishCallBack != null) {mOnFinishCallBack.finishShowPic();}}
});

所以我们要在Activity里面implements ImageAdapter.OnFinishCallBack,使用回调接口形式,在创建ImageAdapter对象时实例化mOnFinishCallBack,也即:

imageAdapter.setOnFinishCallBack(this);

五、最终实现效果

六、示例代码下载(ZJGallery)

仿微信点击图片放大,并可滑动浏览效果相关推荐

  1. 初学者笔记——微信小程序点击图片放大

    微信小程序点击图片放大 wx.previewImage 官方文档的解释 PS:红色框框内要注意,需要预览的图片连接列表只支持网络连接图片,2.2.3版本以上支持云文件ID. 将图片dream.jpg上 ...

  2. vue项目 一行js代码搞定点击图片放大缩小

    一行js代码搞定xue项目需要点击图片放大缩小,其实主要用的是用到了vue:class的动态切换,内容比较简单.一开始我把维护的需求想得太复杂了,和测试小姐姐聊了一下才反应过来. 两个月不到跟了四个项 ...

  3. 点击图片放大至原始图片大小

    有些时候为了排版的整洁,页面展示的图片不得不都是限定宽高的,如果想要点击图片放大至原始大小进行预览,再次点击回到原来样子,就要用到下面的代码了: var _w = parseInt($(window) ...

  4. 点击图片放大缩小功能

    1.点击图片放大缩小的思路 图片部分: <table><div><img style="width:62px;height:83px;display:block ...

  5. jquery点击图片放大效果

    点击图片放大效果无非就是创建一个大容器,点击小图片获取图片路径存放到大容器里. 接下来看一下效果图 HTML结构 <img class="enlargeImg" width= ...

  6. 百度移动优化:关于移动端点击图片放大有多少人注意?

    百度移动搜索落地页体验白皮书4.0于2018年08月15日发布有多少人注意到白皮书最下面的这短短的60字? 好多网站都存在点击图片不可放大,有多少站长注意这个细节问题? 关于加这个功能确实挺麻烦,不懂 ...

  7. Android 点击图片放大至全屏 再次点击关闭过度动画 Shared Element效果(共享元素效果)

    Android 点击图片放大至全屏 再次点击关闭过度动画 最近项目需要给用户一个体验优化,各种查阅,然后改了很多地方,类似于图片的点击预览,消息列表的点击流畅过渡. Shared Element效果( ...

  8. js实现点击图片放大效果,以及懒加载图片

    js实现点击图片放大效果,以及懒加载图片 近期有个后端管理页面小优化,原来的图片是点击才会去后端请求图片展示到前端,用dialog的方式展示,但是不太直观 存在两个问题 1.点击查看后,电子照片会变形 ...

  9. jquery 点击图片放大,带上下一张,可通过滚动鼠标进行图片缩放

    <?php /*** Created by PhpStorm.* User: 28010* Date: 2022/1/17* Time: 13:50*** 1.这里图片的数据是从数据库里面查询取 ...

最新文章

  1. 简单介绍 ghost封装过程
  2. JavaScript和HTML实现的简单计算机
  3. PHP Smarty template for website
  4. Linux系统编程:pipe匿名管道的使用,实现linux命令下管道命令
  5. OJ1024: 计算字母序号
  6. HGAT-用于半监督短文本分类的异构图注意力网络
  7. 如何在柱状图中点连线_如何快速掌握MSA
  8. android scroll 中 scroll Bar 修改
  9. mybatis 注解的方式批量插入,更新数据
  10. Ajax学习笔记-get请求参数-4
  11. 典型相关分析(CCA)及其python实现
  12. 这8种常用的代码编辑器,你平时用哪个?
  13. java 群发求职邮件
  14. SMPP协议,CMPP协议是啥子
  15. 计算机应用物联网应用技术论文,计算机应用技术论文:物联网垃圾回收站设计与实现...
  16. rm -rf —— 删库跑路教程详解
  17. 微信WIFI小程序开发
  18. 创建前缀索引时,如何确认“最佳长度”
  19. 2020-11-25-springboot-打开web日志
  20. 论文笔记——EXPLAINING AND HARNESSING ADVERSARIAL EXAMPLES(解释和利用对抗样本)

热门文章

  1. ShuffleNetV1-轻量级神经网络
  2. 红帽子设置SSH基于密钥的用户登陆
  3. Python爬虫:爬取“Boss直聘”招聘数据
  4. Java面向对象笔记第1天(达内Java课程)
  5. mysql 日常管理及维护
  6. android 如何实现一键清理
  7. uniapp上下元素联动
  8. windows安装xpm
  9. 屏幕背光调节的两种方式
  10. Windows10中添加或删除开机自启动项目