鸿蒙Next1000万点赞以内最好的图片裁剪组件鸿蒙Next1000万点赞以内最好的图片裁剪组件,冰箱彩电都有才

简单讲下鸿蒙平台的实现,用2个Canvas组成的,一个负责绘制图片,一个负责绘制裁剪框。

Stack(){Canvas(this.imageContext)Canvas(this.cropLayerContext)}值得注意的是与Flutter不同,鸿蒙中Canvas的位置坐标系是基于本身的,也就是说是(0,0)开始的,不是基于整个屏幕。

使用GestureGroup包含了PinchGesture和PanGesture两种手势。PinchGesture是控制图片缩放;PanGesture是控制图片的移动,也控制裁剪框的移动。

.gesture(GestureGroup(GestureMode.Exclusive,PinchGesture({}).onActionStart((event:GestureEvent)=>{this.handleScaleStart(event,false,);}).onActionUpdate((event:GestureEvent)=>{this.handleScaleUpdate(event,false);}),PanGesture().onActionStart((event:GestureEvent)=>{this.handleScaleStart(event,true);}).onActionUpdate((event:GestureEvent)=>{this.handleScaleUpdate(event,true);}).onActionEnd((event:GestureEvent)=>{if(this._cropRectMoveType!=null){this._cropRectMoveType=null;//movetocenterletoldScreenCropRect=this._actionDetails!.cropRect!;//notmoveif(OffsetUtils.isSame(oldScreenCropRect.center,this._actionDetails!.cropRectLayoutRectCenter)){return;}letcenterCropRect=getDestinationRect(this._actionDetails!.cropRectLayoutRect!,oldScreenCropRect.size,);this._startCropRectAutoCenterAnimation(oldScreenCropRect,centerCropRect);}})))手势和移动的代码处理跟Flutter平台一样,感兴趣的小伙伴可以自行查看。

要确定是裁剪框移动还是图片移动,我们需要判断是否手势点击是在裁剪框的范围内。在onTouch做处理,通过点击的点是否在裁剪框的区域内部来判断,由touchOnCropRect方法完成。

.onTouch((event)=>{if(event.type==TouchType.Down){this._pointerDown=true;if(event.touches.length==1){lettouch=event.touches[0];this._cropRectMoveType=this.touchOnCropRect(newgeometry.Offset(touch.x,touch.y));}this._drawLayer();}elseif(event.type==TouchType.Up||event.type==TouchType.Cancel){if(this._pointerDown){this._pointerDown=false;this._drawLayer();this._saveCurrentState();}}})具体处理为,判断是否在裁剪框+-hitTestSize之后的内外框范围,当我们点击在屏幕上面的时候判断是否点击在了裁剪框的区域里面。

CanvasRenderingContext2D的绘制,只支持Matrix2D。导致最终实现镜像效果的时候,我只能对Canvas组件进行matrix4transform

所以这部分,直接从Flutter中移植了过来。值得注意的是比较的时候精度问题,定义一个precisionErrorTolerance,当2者差距的绝对值小于precisionErrorTolerance的时候认为相等。

staticprecisionErrorTolerance=1e-10;Matrix4Matrix4Transit的实现跟Flutter中的Matrix4,效果不一样,而也没办法修改,所以从Flutter中移植Matrix4过来。

Matrix4是整个边界计算和最终图片输出的核心。

_startCropRectAutoCenterAnimation(begin:geometry.Rect,end:geometry.Rect):void{letoptions:AnimatorOptions={duration:this._config!.cropRectAutoCenterAnimationDuration,easing:"linear",delay:0,fill:"forwards",direction:"normal",iterations:1,begin:0,end:1,};this._cropRectAutoCenterRect=newRectTween(begin,end);this._cropRectAutoCenterAnimator=animator.create(options);this._cropRectAutoCenterAnimator!.onFrame=(value)=>{this._isAnimating=true;if(this._cropRectAutoCenterRect!=undefined){this._updateUIIfNeed(()=>{this._doCropAutoCenterAnimation(this._cropRectAutoCenterRect!.transform(value));});}};this._cropRectAutoCenterAnimator.onFinish=this._cropRectAutoCenterAnimator.onCancel=()=>{this._cropRectAutoCenterAnimator=undefined;this._cropRectAutoCenterRect=undefined;this._isAnimating=false;this._saveCurrentState();};this._cropRectAutoCenterAnimator.play();}Colorarkts中有各种Color,组件的颜色是ResourceColor

declaretypeResourceColor=Color|number|string|Resource;其中

支持rgb或者argb。示例:0xffffff,0xffff0000。number无法识别传入位数,格式选择依据值的大小,例如0x00ffffff作rgb格式解析

示例:'#ffffff','#ff000000','rgb(255,100,255)','rgba(255,100,255,0.5)'。

而Canvas的颜色为下面类型。

string|number|CanvasGradient|CanvasPattern;if(typeofcolor==="string"||typeofcolor==="number"){returncolor;}特别注意的是:sys.color.brand在被打成静态har包之后,会获取到错误的resourceid1,发生{"code":9001001,"message":"GetColorByIdfailedstate"}错误,code解释为:InvalidresourceID.解决方案是通过onWillApplyTheme中得到的Theme来获取正确的ID。即(theme.colors.brandasResource).id,正确的ID应该125830976。

.transform(matrix4.identity().rotate({y:this._rotationYRadians!=01:0,x:0,z:0,angle:NumberUtils.degrees(this._rotationYRadians),}))ChangeNotifier不管在什么平台,我对EventBus是无感的,鸿蒙也有类似的。ChangeNotifier直接从Flutter中移植过来,用于监听变化,组件中用于通知裁剪历史变化。

我在本地例子里面是使用import*asimage_cropperfrom"@candies/image_cropper";

image_cropper.ImageCropper({image:this.image,config:this.config,})本地运行正常,但是通过ohpminstall@candies/image_cropper安装之后,运行报错。

1ERROR:ArkTS:ERRORFile:】MyApplication4/entry/src/main/ets/pages/Index.ets:24:9'image_cropper.ImageCropper({image:this.image,config:this.config,})'doesnotmeetUIcomponentsyntax.COMPILERESULT:FAIL{ERROR:2WARN:5}>hvigorERROR:BUILDFAILEDin479ms解决方案是引用方式改下下面的方法:

import{ImageCropper}from"@candies/image_cropper";

使用如下:

import*asimage_cropperfrom"@candies/image_cropper";import{ImageCropper}from"@candies/image_cropper";import{image}from'@kit.ImageKit';@Entry@ComponentstructIndex{@Stateimage:image.ImageSource|undefined=undefined;privatecontroller:image_cropper.ImageCropperController=newimage_cropper.ImageCropperController();@Stateconfig:image_cropper.ImageCropperConfig=newimage_cropper.ImageCropperConfig({maxScale:8,cropRectPadding:image_cropper.geometry.EdgeInsets.all(20),controller:this.controller,initCropRectType:image_cropper.InitCropRectType.imageRect,cropAspectRatio:image_cropper.CropAspectRatios.custom,});build(){Column(){if(this.image!=undefined){ImageCropper({image:this.image,config:this.config,})}}}}安装你可以通过下面的命令安装改组件。

ohpminstall@candies/image_cropper

exportclassCropAspectRatios{///Noaspectratioforcrop;free-formcroppingisallowed.staticcustom:number|null=null;///Thesameastheoriginalaspectratiooftheimage.///ifit'sequalorlessthan0,itwillbetreatedasoriginal.staticoriginal:number=0.0;///Aspectratioof1:1(square).staticratio1_1:number=1.0;///Aspectratioof3:4(portrait).staticratio3_4:number=3.0/4.0;///Aspectratioof4:3(landscape).staticratio4_3:number=4.0/3.0;///Aspectratioof9:16(portrait).staticratio9_16:number=9.0/16.0;///Aspectratioof16:9(landscape).staticratio16_9:number=16.0/9.0;}裁剪图层Painter你现在可以通过覆写[ImageCropperConfig.cropLayerPainter]里面的方法来自定裁剪图层.

exportclassImageCropperLayerPainter{///Painttheentirecroplayer,includingmask,lines,andcorners///Therectmaybebiggerthansizewhenwerotatecroprect.///Adjusttherecttoensurethemaskcoversthewholeareaafterrotationpublicpaint(config:ImageCropperLayerPainterConfig):void{//Drawthemasklayerthis.paintMask(config);//Drawthegridlinesthis.paintLines(config);//Drawthecornersofthecropareathis.paintCorners(config);}///DrawcornersofthecropareaprotectedpaintCorners(config:ImageCropperLayerPainterConfig):void{}///DrawthemaskoverthecropareaprotectedpaintMask(config:ImageCropperLayerPainterConfig):void{}///DrawgridlinesinsidethecropareaprotectedpaintLines(config:ImageCropperLayerPainterConfig):void{}}裁剪控制器ImageCropperController提供旋转,翻转,撤销,重做,重置,重新设置裁剪比例,获取裁剪之后图片数据等操作。

exportinterfaceFlipOptions{animation:boolean,duration:number,}flip(options:FlipOptions)controller.flip();旋转参数描述默认animation是否开启动画falseduration动画时长200millisecondsdegree旋转角度90rotateCropRect是否旋转裁剪框true当rotateCropRect为true并且degree为90度时,裁剪框也会跟着旋转。

exportinterfaceRotateOptions{degree:number,animation:boolean,duration:number,rotateCropRect:boolean,}rotate(options:RotateOptions)controller.rotate();重新设置裁剪比例重新设置裁剪框的宽高比

controller.updateCropAspectRatio(CropAspectRatios.ratio4_3);撤消撤销上一步操作

//判断是否能撤销boolcanUndo=controller.canUndo;//撤销controller.undo();重做重做下一步操作

//判断是否能重做boolcanRedo=controller.canRedo;//重做controller.redo();重置重置所有操作

controller.reset();历史//获取当前是第几个操作controller.getCurrentIndex();//获取操作历史controller.getHistory();//保存当前状态controller.saveCurrentState();//获取当前操作对应的配置controller.getCurrentConfig();裁剪数据获取裁剪之后的图片数据,返回一个PixelMap对象

controller.getCroppedImage();获取状态信息controller.getActionDetails();controller.rotateDegrees;controller.cropAspectRatio;controller.originalCropAspectRatio;controller.originalCropAspectRatio;结语PoorArkTS,NoExtension,NoOperator,NoNamedParameters。

在迁移过程中,你需要面对的主要是不同语言的差异化,不能说谁好谁不好,只是大家更习惯谁而已。

目前在鸿蒙平台,总共迁移了5个库过去,如果你也想贡献鸿蒙平台,欢迎加入HarmonyCandies,一起共建鸿蒙平台社区生态。

THE END
1.100000万是多少解:10000x100000二1000000000。1000000000÷100000000二10(亿)。100000万是1000000000,用万作单位是10万万,用亿作单位是10亿。100000万https://edu.iask.sina.com.cn/jy/lv8j4txK0T.html
2.富婆花1000万举办派对,帅哥各个八块腹肌,有钱人的快乐想象不到“勤俭是我们的传家宝,什么时候都不能丢掉” 三峡能源:控股股东拟增持公司股份 中国诚通宣布增持1000亿元 商务部新闻发言人就美对华关税发表谈话 西安一无人快递车拖行电动车 中国版平准基金横空出世 南京地铁回应乘客看到诡异人脸 欧冠联赛1/4决赛前瞻 中国的高水平开放,面向全世界 TCL董事长提议回购股份激励员工 一https://m.163.com/v/video/VLUSF5T6A.html
3.1000万在上海买了房子,还贷压力大吗,听听扬州婆婆会怎么说视频加载失败, 点击再次加载 00:00 00:001000万在上海买了房子,还贷压力大吗,听听扬州婆婆会怎么说 2025-04-20 00:00 · 0次播放 发布于:江西省 拳击那点事 +订阅 +1 评论 全部 还没有人评论过,快来抢首评 抢首评相关推荐 查看更多精彩内容 https://m.sohu.com/a/886669068_100114195
4.价值1000万的奔驰大G6x6,玩起越野是什么感觉新浪视频秒拍 打开新浪新闻 发现更多精彩 打开当前浏览器不支持最新的video播放 00:00 00:23 00:23价值1000万的奔驰大G6x6,玩起越野是什么感觉雪落轻夜 说说你的看法 0 打开APP https://k.sina.cn/article_7062240855_m1a4f13e5700100o13m.html
5.任推邦官方邀请码是多少?(附2025邀请码获取及填写指南)超级详细任推邦平台的客服资源有限,通过邀请码1000 0000注册的用户可以更快获得客服响应,解决各类操作问题。 总的来说,使用官方邀请码1000 0000注册任推邦,不仅能获得更高收益,还能在任务推广、客服支持等方面享受更多优势。如果你正考虑加入任推邦,建议通过此邀请码注册,确保获取最大化的收益和便利!https://www.jianshu.com/p/c59fa20b13ef
6.雅马哈生产年代与番号●●序列号前带有U字标记的YAMAHA钢琴由YAMAHA在密西根的工厂生产。该厂1973年开始生产,1986年关闭。 1974-U101000 1975-U102000 1976-U107000 1977-U110000 1978-U117000 1979-U124000 1980-U132000 1981-U141000 1982-U150000 1983-U160000 1984-U167000 1985-U174000 https://www.meipian.cn/2dqn056s
7.卢说数学万级上全是零的数怎么读?64 0000 1000 很明显 亿级上是64 万级上全是0 而个级上是1000 怎么读呢 有两种不同的看法 一种是读成六十四亿零一千 一种是读成六十四亿一千 很明显 区别是万级上的零读不读 2. 读不读呢 双方都是讲道理的 一方的道理是 根据大数的读法规定 http://www.360doc.com/content/17/1018/15/27856359_696094485.shtml
8.最终幻想14(FF14)金币担保担保1,0000万金【担保】1,0000万金 商品价格:¥450.0 商品单价:1元=22.2 金币-担保 单价数量:1,0000金数量 商品类型:金币-担保 游戏区服:全服通用 操作系统:PC - PC端 保障服务: 卖家发起交易,买家付款后,由交易猫先为买家保管货款,待买家确认收货后,交易猫再将货款给到卖家。https://www.jiaoyimao.com/jg1008204-5/1657251842023188.html
9.范冰冰与王思聪前女友直播卖面膜,销售额轻松破1000万!范冰冰与王思聪前女友直播卖面膜,销售额轻松破1000万! 00:00 00:36 吃瓜娱乐社 大风号 吃瓜娱乐社,分享娱乐八卦 来自山东省 范冰冰与王思聪前女友直播卖面膜,销售额轻松破1000万! 范冰冰与王思聪前女友直播卖面膜,销售额轻松破1000万!https://ishare.ifeng.com/c/s/v002HSO5oM7IzTdnGBqOk1OUsYvA2nIJLg4HVQA0jxtLihcnXVS1FPJy7xhJHC0j85l5lqW6ZgnQRThz80Gw3Wu7cg____
10.一千万万等于多少亿?一千万万等于多少亿? 扫码下载作业帮搜索答疑一搜即得 答案解析 查看更多优质解析 解答一 举报 一千亿,1000,0000,0000元 解析看不懂?免费查看同类题视频解析查看解答 相似问题 152451约等于多少亿 1893370000 约等于多少亿 请问:9990100000 约等于多少亿 https://qb.zuoyebang.com/xfe-question/question/9367f50dfb4016d461a5ae768660c0f9.html
11.涉案流水1000万!海南警方捣毁“跑分”洗钱团伙,抓了6人!丨海上夜涉案流水1000万!海南警方捣毁“跑分”洗钱团伙,抓了6人!丨海上夜闻·视听汇 海上夜闻?视听汇20220425 00:0000:00 阅读提示:标题新闻在《海南新闻》第14条 1 近日,海南发布《海南热带雨林国家公园优先保护物种名录(草案)》,并号召公众积极参与评选活动。详细>>>https://newscdn.hndnews.com/hb/html/mobile/526221.html
12.广汇煤炭清洁炼化有限责任公司1000万吨年煤炭分级提质综合利用020.040.00002883加氢系统280×1900.250.010.54污水处理250×1500.20.0151.765罐区485×2359.56装卸车系统510×1802.22合计t/a60.360.3240111.80.00023168.5.2总量控制指标根据“关于新疆广汇煤炭清洁炼化有限责任公司1000万吨/年煤炭分级提质综合利用项目环境影响报告书的批复”(新环评价函【2014】1170号),批复中明确1000万吨/https://www.renrendoc.com/paper/319899473.html
13.Elasticsearch与OpenSearch:解开向量搜索性能差距对于 k:100 和 n:1000(standalone-search-knn-100-1000-single-client 和 standalone-search-knn-100-1000-multiple-clients),Elasticsearch 平均比 OpenSearch 快 2 到 7 倍。 详细结果显示了比较的具体案例和向量引擎: 召回率 1000 万个向量,96 个维度 (dense_vector)https://my.oschina.net/u/3343882/blog/11402412