微信小程序仿系统预览大图功能

问题:

微信小程序系统自带的 wx.previewImage 预览大图功能很好用,用起来很顺畅丝滑,但是有一个致命问题:预览大图的时候是在新页面中打开,当前页面的生命周期会销毁,如果当前页面中没有实时的东西还好,但如果有类似 <live_player> <live_push> <video> 等组件,或者有计时器之类的变量的时候,你会发现当前页面的这些组件或变量就没法使用了,如果想在当前页面下打开大图,那么就无法使用官方 wx.previewImage 这个方法,这是需要我们自定义一个大图预览组件。

扫一下体验效果:

两种预览大图方式:

1、系统方法:wx.previewImage

优点:系统自带,效果好,全屏,手势顺畅丝滑,使用方便简单
缺点:在新页面中打开,预览时会调用当前页面的生命周期onHide方法,会导致当前页面的变量无法使用,具体表现形式为:live_play 没有声音,暂停播放,倒计时无法继续计时等问题

使用:

wx.previewImage({
	current: imgUrl, // 当前显示图片的http链接
	urls: [imgUrl] // 需要预览的图片http链接列表
})

官方文档:wx.previewImage

2、自定义组件:< previewImg >

优点:可解决 wx.previewImage 的致命缺点,调用后是在当前页面展示预览图,不会调用当前页面的生命周期方法,不会对当前页面逻辑造成影响
缺点:体验不如系统自带控件,无法隐藏胶囊,无法实现全屏。(如果想要全屏效果,只能设置当前页面的navigationStyle来控制隐藏navigationBar 达到全屏的效果)

使用:

.json:

"usingComponents": {
	"previewImg":"/components/previewImg/previewImg"
},

.wxml

<previewImg id="previewComponent" previewImgList="{{imgList}}" previewImg="{{currentImg}}" />

.js

// 点击预览大图
openpreviewImg() {
	this.selectComponent("#previewComponent").showPreview();
   	this.setData({
   	//imgList 图片地址数组
		currentImg: this.data.imgList[0]
	})
}
previewImg组件代码:

wxml:

<view class="preview_box" wx:if="{{previewHideStatus}}" style="top:{{preview_box_top}}" catchtouchmove='stopPageScroll'>
  <view class="totalimg">{{imgindex}}/{{previewImgList.length}}</view>
  <view class="preview_box1" style="left:{{left}}" bindtap="jingzhi">
    <block wx:for="{{previewImgList}}" wx:key="key">
      <view class="img_box">
        <view bindtouchstart='touchStart' bindtouchmove='touchMove' bindtouchend='touchEnd'>
          <movable-area scale-area>
            <movable-view direction="all" animation catchscale="onScale" scale scale-min="1" scale-max="5" scale-value="{{scale}}">
              <image src="{{item}}" style="width:100%;" mode="widthFix"></image>
            </movable-view>
          </movable-area>
        </view>
      </view>
    </block>
  </view>
</view>

js 核心代码:

//最困难最核心的代码就是处理手指移动的位置和距离来对图片进行相应的操作
touchStart: function(e) {
      this.data.touchStartTime = e.timeStamp //时间点
      let sx = e.touches[0].pageX
      let sy = e.touches[0].pageY
      this.data.touchS = [sx, sy];
    },

    touchMove: function(e) {
      let start = this.data.touchS;
      let sx = e.touches[0].pageX;
      let sy = e.touches[0].pageY;
      this.data.touchE = [sx, sy];
    },

    touchEnd: function(e) {
      this.data.touchEndTime = e.timeStamp //时间点
      let start = this.data.touchS
      let end = this.data.touchE
      let scaleObj = this.data.scaleObj
      //如果((start[0] < end[0] - 50) && (scaleObj.scale==1&&scaleObj.x==0&&scaleObj.y==0)) //左滑动
      //如果((start[0] > end[0] + 50) && (scaleObj.scale==1&&scaleObj.x==0&&scaleObj.y==0)) //右滑动
      if (scaleObj.yes) {
        if (end[0] == 0) {
          console.log('点击')
        } else if ((start[0] < end[0] - 50) && (scaleObj.scale == 1 && scaleObj.x == 0 && scaleObj.y == 0)) {
          if (this.data.index !== 0) {
            this.data.index -= 1;
            this.data.imgindex -= 1;
            this.setData({
              index: this.data.index,
              left: '-' + this.data.index + '00%;transition: all .5s;',
              imgindex: this.data.imgindex
            });
          }
        } else if ((start[0] > end[0] + 50) && (scaleObj.scale == 1 && scaleObj.x == 0 && scaleObj.y == 0)) {
          if (this.data.index !== this.data.previewImgList.length - 1) {
            this.data.index += 1;
            this.data.imgindex += 1;
            this.setData({
              index: this.data.index,
              left: '-' + this.data.index + '00%;transition: all .5s;',
              imgindex: this.data.imgindex
            });
          }
        } else {
          console.log('下滑/上滑');
          this.setData({
            preview_box_top: '100%'
          })
        }
        this.data.touchE = [0, 0];
      }

      setTimeout(() => {
        if (this.data.scaleObj.x == 0 && this.data.scaleObj.y == 0 && this.data.scaleObj.scale == 1) {
          // console.log('yes is true');
          this.data.scaleObj.yes = true;
        }
      }, 500)
    }

组件源码可以去 git 下载,目录是:/components/previewImg 文件夹

组件源码涉及公司代码,已隐藏,全部主要的代码都已在上述中贴上了,直接使用即可

2024-7-11修改:补齐wxss代码


page{
  height: 100%;
}
.preview_box{
  position: fixed;
  top: 0;
  left: 0;
  bottom: 0;
  right: 0;
  background: #000;
  white-space: nowrap;
  transition: all .3s;
  height: 100%;
  z-index: 99999;
}
.preview_box>.totalimg{
  color: #fff;
  position: absolute;
  z-index: 999;
  top: 10px;
  display: flex;
  justify-content: center;
  width: 100%;
}
.preview_box>.preview_box1{
  height: 100%;
  position: relative;
}
.img_box{
  position: relative;
  display: inline-block;
  width: 100%;
  height: 100%;
}
.img_box>view{
  width: 100%;
  height: 100%;
  display: flex;
  align-items: center;
  justify-items: center;
}
movable-view {
  display: flex;
  align-items: center;
  justify-content: center;
  height: 100%;
  width: 100%;
  color: #fff;
}

movable-area {
  height: 100%;
  width: 100%;
  overflow: hidden;
}Ï```

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
在uni-app中,要实现微信小程序图片放大预览并带有图片描述并可左右切换,可以使用uni-app提供的组件和方法来实现。 首先,我们可以使用uni-app的image组件来展示图片,并通过设置mode属性为aspectFit,使图片按照原图的长宽比等比缩放并保持完整显示。 然后,为了实现图片放大预览并可左右切换,在点击图片时,我们可以使用uni-app的previewImage方法来打开一个全屏的图片预览,并传入一个包含图片链接数组的current参数,以及一个包含图片描述的urls参数。这样就可以在预览界面中显示图片描述,并且可通过左右滑动切换图片。 具体实现步骤如下: 1.在模板中,使用image组件展示图片,设置mode为aspectFit,并绑定点击事件。 2.在点击事件处理函数中,调用uni-app的previewImage方法,传入图片链接数组和图片描述数组。 3.在预览界面中,通过swiper组件实现图片的左右滑动切换,并显示图片描述。 示例代码如下: ``` <template> <view> <image mode="aspectFit" :src="imageUrl" @click="previewImage"></image> </view> </template> <script> export default { data() { return { imageUrl: '图片链接', imageDesc: '图片描述' } }, methods: { previewImage() { uni.previewImage({ current: this.imageUrl, urls: [this.imageUrl], longPressActions: { itemList: ['保存图片'], success: function(data) { if (data.tapIndex === 0) { uni.saveImageToPhotosAlbum({ filePath: this.imageUrl, success: function() { uni.showToast({ title: '保存图片成功' }) }, fail: function() { uni.showToast({ title: '保存图片失败', icon: 'none' }) } }) } } } }) } } } </script> ``` 使用以上方法,我们可以在uni-app微信小程序中实现图片放大预览并带有图片描述可左右切换的功能

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值