证件照换底色

主要进行后端所需功能的增加,尺寸选择功能的增加,颜色选择功能样式修改,版权问题导致的ui修改和所需ui的设计。

跳转前按钮判断

在点击开始转换图片进行跳转之前,判断用户是否已经进行授权,后端需要用到用户的信息进行操作,所以在前端进行图片的操作之前,需要让用户先进行授权,才能获取相应的信息。若用户未授权,在点击进行转换按钮后将会自动跳转到tabBar的我的界面,用户点击授权按钮进行授权并且显示头像和姓名,授权后将自动进入证件照换底色的功能界面进行操作。
点击按钮响应函数中,wx.getSetting为获取用户的当前设置的函数,if语句判断用户是否授权过,若已经授权就直接跳转底色功能界面

 wx.getSetting({ // 调用接口获取用户的当前设置success: res => { // 调用成功时的回调函数if (res.authSetting['scope.userInfo']) {wx.navigateTo({url: '../grids/grid_demo'//openID可以用时改为下面这个url//url: '../grids/grid_demo?openID='+this.data.openID})}

若未授权,就弹出提示框并且在1秒后自动跳转到进行授权的界面进行操作
wx.showToast弹出框函数
setTimeout为自动跳转函数,数值为等待时间

else{wx.showToast({title: '请先授权登录',       icon: 'success',        duration: 2000})setTimeout(function(){wx.switchTab({url: '../logs/logs'//openID可以用时改为下面这个url//url: '../grids/grid_demo?openID='+this.data.openID})},1000);}

跳转授权界面后,用户点击获取头像昵称按钮进行用户授权,按钮响应函数中判断返回数值是否含有相关数据,若含有则表示授权成功,在授权成功之后将自动跳转到底色功能界面。

 setTimeout(function(){wx.navigateTo({url: '../grids/grid_demo'//openID可以用时改为下面这个url//url: '../grids/grid_demo?openID='+this.data.openID})},1000);

解决上传图片位置的不固定

在横向的两个组件外面添加flex横向布局,使两个组件可以固定在横向的特定位置,之后进行图片上传显示的话,图片尺寸不对也不会影响整体的布局。又因为使用了weui组件库中的上传图片组件,所以在weui源文件中会默认设置一些该组件位置的属性使最终页面效果有所变化,所以需要到weui.wxss中直接修改相应的原属性的部分数值,使其效果达到平均横向显示。

······flex·横向居中布局
.flex{display: flex;flex-direction: row;align-items: center;justify-content: center;
}

weui-单选组件设置背景图片

需要了解这个组件之间各种属性的关系和作用,经过不断测试,得出label属性为底下的背景界面,对其进行背景图片的设置就可以实现单选组件的背景图片设置。
以下为随便图片的测试结果,需要更加美观可以在weui.wxss中对相关组件进行部分数值的修改,如padding属性等。最终效果中,没有使用到该单选组件,而是使用了下面会说到的grid组件。

weui-grid组件及选中未选中状态切换

weui组件库已经实现了grid,直接进行搬运使用,而所需要做的是用户进行点击之后需要显示被选中的图片,更加直观地看到自己的选择。
我的想法是将grid中的多余组件,如文字和图片嵌套都去掉,直接内嵌一个按钮,设计其功能类似于单选按钮,通过点击对应部分对其背景图片进行切换,实现选中和未选中的状态展示。
···········
内嵌按钮组件

<view class="weui-grids"><a class="weui-grid"><button  class='{{colorbtns[0].checked?"checked_colorbutton":"normal_colorbutton"}}' data-id='{{colorbtns[0].id}}' bindtap='radiocolorButtonTap'></button></a><a class="weui-grid"><button  class='{{colorbtns[1].checked?"checked_colorbutton2":"normal_colorbutton2"}}' data-id='{{colorbtns[1].id}}' bindtap='radiocolorButtonTap'></button></a><a class="weui-grid"><button  class='{{colorbtns[2].checked?"checked_colorbutton3":"normal_colorbutton3"}}' data-id='{{colorbtns[2].id}}' bindtap='radiocolorButtonTap'></button></a>
</view>

···········
设置按钮样式

/* 按钮未选中 */
样式注意和wxml中的样式名称对应,设置好对应的背景图片
以下仅为一个按钮的样式举例,其他按钮雷同
.normal_button{width: 150rpx;    //根据图片大小和所需占据grid格子的大小进行调整长宽height:177rpx;background-image: url(**使用网络图片地址或者将图片转为base64格式后放入);background-repeat:no-repeat; background-size:100% 100%;-moz-background-size:100% 100%;
}
//边框为0
.normal_colorbutton::after {border: 0;
}
/* 按钮选中 */
.checked_colorbutton{width: 150rpx;   //根据图片大小和所需占据grid格子的大小进行调整长宽height:177rpx;background-image: url(**使用网络图片地址或者将图片转为base64格式后放入);background-repeat:no-repeat; background-size:100% 100%;-moz-background-size:100% 100%;
}
//边框为0
.checked_colorbutton::after {border: 0;
}

···········
设置按钮的数据
注意id只能只能为数值,否则页面将无法显示

 data: {colorbtns: [{ id: 1, name: '_white' }, { id: 2, name: '_red' }, { id: 3, name: '_blue' }],},

···········
默认第一个按钮选中

onLoad: function (options) {this.data.colorbtns[0].checked = true;this.setData({ colorbtns: this.data.colorbtns})},

···········
事件监听函数,进行按钮是否选中的判断,并设置其checked属性

radiocolorButtonTap: function (e) {console.log(e)let id = e.currentTarget.dataset.idconsole.log(id)for (let i = 0; i < this.data.colorbtns.length; i++) {if (this.data.colorbtns[i].id == id) {//当前点击的位置为true即选中this.data.colorbtns[i].checked = true;}else {//其他的位置为falsethis.data.colorbtns[i].checked = false;}}this.setData({colorbtns: this.data.colorbtns,msg: "id:"+id})},


功能bug:按钮不会充满格子,所以点击到不是按钮部分时会有点击却没选中的状态,当前解决办法就是把按钮设置得尽量大。

头像框

主要进行了这个项目的ui再设计,然后根据ui效果实现前端页面展示,以及图片显示和切换的功能修改。

ui设计主要就是定好主色调,再根据两个主色调来进行设计和素材的协调。

页面实现

设置背景图片

背景图片作为在界面最底层的组件,对其他组件的渲染不能有影响。
mode="aspectFill"→满屏,且不失比例,但是可能不能完整显示图片,如果图片太大,某个方向多出的图片会被裁剪

<image class='background' src="../../images/bg1.png" mode="aspectFill"></image>

z-index用来控制元素重叠时堆叠顺序,数值越高越靠上,需要有 position:absolute; position:relative;or position:fixed;的基础下才能生效

.background {width: 100%;height: 100%;position:fixed; background-size:100% 100%;z-index: -1;
}
图片横向满屏并且自适应高度显示

设定宽度为100%,保证横向满屏

<image style="width:100%;height:{{imgheight}}rpx " src="../../images/banner.png"></image>

提前设定好图片原来的大小,通过计算其比例,对页面中的图片进行高度的设定,使图片既能够横向满屏又不会使图片比例错误。(图片的宽度100%默认为750rpx)

 onLoad:function(){var imgwidth = 900,imgheight = 383,//宽高比ratio = imgwidth / imgheight;console.log(imgwidth, imgheight)//计算的高度值var viewHeight = 750 / ratio;var imgheight = viewHeightthis.setData({imgheight: imgheight,})},
下拉框的实现
 <!--新增--下拉框-->
<view class='select_box'><view class='select' catchtap='selectTap'><text class='select_text'>{{selectData[index]}}</text><image class='select_img {{show&&"select_img_rotate"}}' src='../../images/gobottom.png'></image>         </view><view class='option_box' style='height:{{show?(selectData.length>5?300:selectData.length*60):0}}rpx;'><text class='option' style='{{index==selectData.length-1&&"border:0;"}}' wx:for='{{selectData}}' wx:key='this' data-index='{{index}}' catchtap='optionTap'>{{item}}</text></view>
</view><!---->

···········
设置下拉框的样式

.select_box{background: #fff;width: 80%;margin: 30rpx auto;position: relative;
}
.select{box-sizing: border-box;width: 100%;height: 70rpx;border:1px solid #efefef;border-radius: 8rpx;display: flex;align-items: center;padding: 0 20rpx;
}
.select_text{font-size: 30rpx;flex: 1;
}
.select_img{width: 40rpx;height: 40rpx;display: block;transition:transform 0.3s;
}
.select_img_rotate{transform:rotate(180deg);
}
.option_box{position: absolute;top: 70rpx;width: 100%;border:1px solid #efefef;box-sizing: border-box;height: 0;overflow-y: auto;border-top: 0;background: #fff;transition: height 0.3s;z-index: 100;
}
.option{display: block;line-height: 40rpx;font-size: 30rpx;border-bottom: 1px solid #efefef;padding: 10rpx;
}

···········
下拉框数据
默认下拉列表未展开,设置下拉列表中每行数据的名称,默认的下拉列表选中为第一行

 data: {//新增--下拉框参数show:false,//控制下拉列表的显示隐藏,false隐藏、true显示selectData:['挑战杯','科技创新和未来产业','乡村振兴和脱贫攻坚','城市治理和社会服务','生态环保和可持续发展','文化创意和区域合作'],//下拉列表的数据index:0//选择的下拉列表下标},

···········
下拉框响应函数,响应下拉列表是否展开,下拉列表的点击响应

// 点击下拉显示框selectTap(){this.setData({show: !this.data.show});},// 点击下拉列表optionTap(e){let Index=e.currentTarget.dataset.index;//获取点击的下拉列表的下标this.setData({index:Index,show:!this.data.show,length:1});},
其他组件实现

按钮主要就是设定其为透明并设定背景图片并且边框为0,使其完全展示所放置的背景图片的样子。
横向布局使用flex横向布局,将需要的组件放在flex布局之间就可。
主要就是设定好长度、宽度,和其他组件之间的距离,达到合适的效果。
···········
组件居右,外套view,设定以下样式

.right_view{display: flex;flex-direction: row-reverse;
}

···········
设计一个组件在另一个组件之下
使用position: absolute;,并且在上面的组件的wxml代码要在下方组件的下面。
定位为absolute的层脱离正常文本流,所以可以实现叠加的效果。

功能实现

图片根据下拉框分类进行切换

首先注意就是下拉框的index值,它定义了选中下拉框列表中的哪一行,就可以对应显示相关的图片,需要处理好列表中各行名称和图片之间的关系,并且运用好index数值进行图片的显示和切换。
在之前的功能中,实现了点击左右按钮进行图片的切换,而这次是在该基础之上,对图片进行分类,下拉框选择好分类后需要显示该分类之下的图片,左右按钮可以进行切换查看。
运用index函数进行判断分类为哪一个,将对应图片放在一个block中,用wx:if,wx:elif判断index数值,判断是否显示。
···········
以下为其中一块代码,是一个分类中的图片显示,index为1时,显示其对应分类中所有图片,图片中再进行判断,根据左右按钮的点击,进行图片的切换。默认显示length为1所对应的图片

  <block wx:if="{{ index== 1}}"><image class="image_head" wx:if="{{length == 1}}"
src="../../images/1_2.png"></image>
<image class="image_head" wx:elif="{{length == 2}}"
src="../../images/1_1.png"></image></block>

左右按钮点击切换图片时,原理是通过length数值的增加和减少,使组件可以显示不同的图片,其中需要判断图片是否到达最右或者最左,这就需要获取图片的总数。而在该改进项目中,每个分类中的图片不同,length的最大值为该分类中图片的总数,所以需要根据index的值对length的最大值进行设置,之后进行最左最右的判断时才不会导致页面图片缺失或者显示不全的问题。
···········
number为每个分类的图片总数,通过index判断设定其数值

  //左切换图片previous: function(){var length = this.data.length;var index=this.data.index;var numberconsole.log(index+""+length)if(index==0)                 `!!!判断分类,进行图片总数的设置`{number=7;}else{number=2;}if(length==1){this.setData({length:number})}else{this.setData({length:length-1})}},//右切换图片next: function(){var length = this.data.length;var index=this.data.index;console.log(index+""+length)var numberif(index==0)                `!!!判断分类,进行图片总数的设置`{number=7;}else{number=2;}if(length==number){this.setData({length:1})}else{this.setData({length:length+1})}},

注意:若每个分类图片数量不相同,如分类1为5张,分类2为2张,那么分类1切换到3.4.5的图片时,再切换到分类2就会导致图片查询不到的问题,并且怎么切换,图片也不会再显示的问题,因为当前的length数值为3.4.5,但是分类2中本来就只有两张图片,也就是length最大只到2,会出现无法判断的情况。解决的办法就是每次下拉框切换分类成功时将length数值设置为默认的1,那么切换之后显示的都为第一张,就不会出现图片缺失的问题。

  optionTap(e){let Index=e.currentTarget.dataset.index;this.setData({index:Index,show:!this.data.show,length:1            `!!!设置length的数值为1,确保切换后图片不会缺失`});},

生成头像需要获取当前选择的头像框进行显示,所以需要传递index和length、参数到下一个界面,根据传递的参数对image组件的图片进行显示。

bindViewTap: function() {wx.navigateTo({url: '../logs/logs?length=' + this.data.length+ '&index=' + this.data.index})},

显示界面的判断显示和上方的功能实现–图片根据下拉框分类进行切换–中的wxml相同,使用block组件,判断index和length,显示不同分类下的不同图片。

微信小程序--证件照换底色项目前端修改+头像框项目前端页面实现修改相关推荐

  1. 微信小程序--证件照换底色UI及前端页面修改+札记与贺卡图片整理

    札记与贺卡 主要是进行所需要的海报的选择,修改和收集.因为是一个模板类的小程序,用户选择我们设定的模板之后,进行文字的添加,所以我们这边模板的多样性很重要,也因为是双节比较特别,就收集了各类的模板海报 ...

  2. 《微信小程序-证件照换底色》之二:用pycharm搭建django框架来接收微信小程序上传的图片

    用pycharm搭建django框架来接收微信小程序的图片 上一篇:微信云开发实现每个用户在云端上传并且下载自己对应的图片 链接: https://blog.csdn.net/qq_44933075/ ...

  3. 《微信小程序-证件照换底色》之三:微信小程序接收django的图片并部署到windows服务器上

    实现小程序接收django的图片并部署到windows服务器上 继上一篇:用pycharm搭建django框架接收微信小程序的图片后续 链接: https://blog.csdn.net/qq_449 ...

  4. 《微信小程序-证件照换底色》之四:完善证件照处理项目

    完善证件照处理项目 一.更换后台程序 因为原来的后台处理需要经费,所以我们改用百度AI进行证件照处理 首先我们导入百度云扣图的第三方库 打开我们的python的Terminal的输入 pip inst ...

  5. 微信小程序:2022虎年背景全新UI头像框制作

    2021马上就结束了,2022也马上到来了,虎年降至 给大家带来一款以2022虎年为主的一款头像制作小程序源码 前两天小编也分享过一款虎年头像框的小程序 不过那款为了美观,所以就没有给那款小程序添加流 ...

  6. 微信小程序:2022虎年背景全新UI头像框制作带安全检测

    不知不觉已经2022年了,记得上一次发布这款小程序还在2021 感叹时间过得还是挺快的,为什么小编又要重新发布一次这个小程序呢 因为有很多小伙伴说之前的没有安全内容检测,然后审核过不去 所以小编今天就 ...

  7. 新手入门微信小程序-从注册到开发(校庆头像框)

    微信公众号:数学建模与人工智能 GitHub - QInzhengk/Math-Model-and-Machine-Learning ​展示效果: 最近从网上找了一个开源的生成和校庆有关的微信头像小程 ...

  8. 微信小程序 实现换肤功能

    参考链接: (1)微信小程序实现换肤功能 https://www.jb51.net/article/136445.htm (2)微信小程序实现换肤功能 https://blog.csdn.net/qq ...

  9. 小程序服务器换肤,微信小程序实现换肤功能

    pc或者移动端实现换肤功能还是比较简单的,大致就是需要换肤的css,还有正常的css:把当前皮肤类型存入本地:然后通过js读取并判断当前应该加载哪套css. 由于微信小程序没有操作wxss的api,所 ...

最新文章

  1. pythonapi是什么_python接口自动化(一)--什么是接口、接口优势、类型(详解)...
  2. springboot redis 断线重连_Redis复制:部分同步PSYNC详解
  3. 抄袭一些别人工作中的小技巧
  4. python3:(unicode error) 'utf-8' codec can't decode
  5. 电信运营商占IDC市场65%:中国电信占行业半数以上
  6. idea 自动生成mybaits_IDEA利用mybatis-generator自动生成dao和mapper
  7. centos 最简单的服务程序
  8. 欧奈尔4个经典形态_股票K线图基础知识:图解4大经典K线组合形态
  9. linux系统硬盘数量,Linux ext4文件系统划分磁盘inode数量
  10. html 如何引入一个公共的头部和底部
  11. 观察者模式:推模型与拉模型
  12. CSS引用LCD 字体 简单倒计时功能
  13. 头条号如何提高文章推荐量和阅读量,头条号提高文章阅读量和推荐量的方法
  14. BUUCTF-[HDCTF2019]Maze
  15. s5pv210 linux,S5PV210-零基础体验uboot
  16. 华为鸿蒙亮利剑,华为P50pro亮利剑,鸿蒙OS+徕卡五摄+5400mAh,这才是华为
  17. Centos7中Docker安装Redis
  18. 如何用redis设计一个运动步数排行榜?
  19. 正则表达式限制非中文字符输入
  20. python转盘抽奖_Python使用Tkinter实现转盘抽奖器的步骤详解

热门文章

  1. 用链表做一个图书管理系统
  2. 关于Comparator使用说明
  3. 图片相似度对比-java
  4. linux中groupadd命令详解,Linux命令之groupadd详解
  5. 大理石瓷砖厂家网站源码 装修建材类织梦模板
  6. Scanner使用中缓冲区清空
  7. PUT和POST方法的区别-比较POST和PUT方法
  8. 如何添加共享打印机?
  9. 牛客网题库分享--final byte
  10. 如何快速删除公众号发布的文章?教你一键批量删除公众号文章【图文教程】