使用AlloyFinger 的手势缩放,外部按钮操控缩放, 3D改为2D减少放大模糊

本文介绍了如何使用AlloyFinger和AlloyCrop结合,实现自由缩放图片,并解决在微信等WebView中因使用matrix3d导致的放大模糊问题。通过修改transform.js将matrix3d转换为matrix,实现了2D缩放,同时对可能出现的灰屏和安卓设备模糊问题进行了探讨。
摘要由CSDN通过智能技术生成

项目中需要手势放大图片,懒得自己写组件库~找了好久,决定用AlloyFinger,但是呐~光用AlloyFinger不满足要求,只能中心放大,后续加入了AlloyCrop来达到可以按照手势点击位置放大,最后发现有“微信”浏览器等有部分不兼容matrix3d的,会变模糊。最后改动transform.js变成matrix的2d缩放。


1.AlloyFinger的使用【中心放大图片,太粗糙,达不到PD小姐姐预期】

有react版本的。。但是莫名不好用。。所以用了原生的,引用3个文件

import AlloyFinger from './src/alloy_finger.js';
import { To } from './src/to.js';
import './src/transform.js';

html页面

                <div id="imgBox">
                    <img id="testImg" src={this.state.imageUrl} />
                </div>

                <div className="operater-do">
                    <div className="ratina-bd operater-plus  bd-b" onClick={this.tabPlus.bind(this)}>
                        <div className="inline-block plus-icon"> + </div>
                    </div>
                    <div className="operater-minus" onClick={this.tabMinus.bind(this)}>
                        <div className="inline-block minus-icon"> - </div>
                    </div>
                </div>

初始化 图片加载

    imageLoaded(selector, onload) {
        var img = new Image();
        var dom = document.querySelector(selector);
        img.onload = function() {
            //real_width,real_height
            onload.call(dom, this.width, this.height);
            img.onload = null;
            img = null;
        };
        img.src = dom.getAttribute("src");
    }

吸附屏幕效果

    //吸附屏幕效果
    stickEffect(el) {
        // 超出屏幕外,吸附动效返回
        // 当前屏幕位置
        let left = $("#testImg").offset().left;
        let top = $("#testImg").offset().top;
        // 图片宽高
        let imgWidth = $("#testImg").width();
        let imgHeight = $("#testImg").height();
        // 屏幕宽高,高度=屏幕高度
        let winWidth = window.innerWidth;
        let winHeight = window.innerHeight ;

        let skWidth = $("#testImg").width() * el.scaleX;
        let skHeight = $("#testImg").height() * el.scaleY;
        let setLeft = left;
        let setTop = top;

        if (left > 0 || top > 0 || skWidth + left < winWidth || skHeight + top - bannerHight < winHeight) {
            //console.log("超出屏幕范围");
            if (left > 0) {
                setLeft = 0;
            }
            if (top > 0) {
                setTop = bannerHight;
            }
            if (skWidth + left < winWidth) {
                setLeft = -(skWidth - winWidth);
            }
            if (skHeight + top - bannerHight < winHeight) {
                setTop = -(skHeight - winHeight - bannerHight);
            }

            console.log("before,top:" + $("#testImg").offset().top, "left:", $("#testImg").offset().left);
            console.log("stickEffect,top:" + Math.ceil(setTop), "left:", Math.ceil(setLeft));

            $("#testImg").offset({
     
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值