html5双击图层放大,flutter实现可缩放可拖拽双击放大的图片功能

flutter_drag_scale

可缩放可拖拽的功能,可实现图片或者其他widget的缩放已经拖拽

并支持双击放大的功能

我们知道官方提供了双击缩放,但是不支持拖拽的功能,我们要实现向百度地图那样可以缩放又可以拖拽的功能,官方的方法就不支持了。

下面先演示下功能:

12ee9456eb2e

sample.gif

参数只有两个:

1、child ,是一个widget,可以是图片或者任意的widget

2、doubleTapStillScale,默认是true,意思是双击一直放大,还是只放大一次,再次双击缩小到原图片的大小,如果为false,第一次双击放大图片2倍,再次双击回位。

用法很简单:

1、导入依赖库

dependencies:

flutter:

sdk: flutter

flutter_drag_scale:

git: https://github.com/LiuC520/flutter_drag_scale.git

2、引入库:

import 'package:flutter_drag_scale/flutter_drag_scale.dart';

3、如下的用法:

import 'package:flutter/material.dart';

import 'package:flutter_drag_scale/flutter_drag_scale.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {

@override

Widget build(BuildContext context) {

return Container(

height: 400.0,

width: 400,

child: Center(

child: DragScaleContainer(

doubleTapStillScale: true,

child: new Image(

image: new NetworkImage(

'http://h.hiphotos.baidu.com/zhidao/wh%3D450%2C600/sign=0d023672312ac65c67506e77cec29e27/9f2f070828381f30dea167bbad014c086e06f06c.jpg'),

),

),

),

);

}

}

wechat :674668211 加微信进flutter微信群

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个Flutter自绘组件的示例代码,可以实现图片展示在屏幕正中间,图片宽高自适应,图片可拖动,放大缩小的功能: ```dart import 'package:flutter/material.dart'; import 'package:flutter/gestures.dart'; import 'dart:math' as math; class ImageEditor extends StatefulWidget { final ImageProvider imageProvider; ImageEditor({Key key, this.imageProvider}) : super(key: key); @override _ImageEditorState createState() => _ImageEditorState(); } class _ImageEditorState extends State<ImageEditor> { double _scale = 1.0; double _previousScale = 1.0; Offset _offset = Offset.zero; Offset _previousOffset = Offset.zero; Size _imageSize; @override Widget build(BuildContext context) { return GestureDetector( onScaleStart: _handleScaleStart, onScaleUpdate: _handleScaleUpdate, onScaleEnd: _handleScaleEnd, child: CustomPaint( painter: _ImagePainter( imageProvider: widget.imageProvider, scale: _scale, offset: _offset, imageSize: _imageSize, ), child: SizedBox.expand(), ), ); } void _handleScaleStart(ScaleStartDetails details) { _previousScale = _scale; _previousOffset = _offset; } void _handleScaleUpdate(ScaleUpdateDetails details) { setState(() { _scale = _previousScale * details.scale; _offset = _previousOffset + (details.focalPoint - details.localFocalPoint) / _scale; }); } void _handleScaleEnd(ScaleEndDetails details) { _previousScale = 1.0; _previousOffset = _offset; } @override void initState() { super.initState(); Image image = Image(image: widget.imageProvider); image.image.resolve(ImageConfiguration()).addListener( ImageStreamListener((info, _) { setState(() { _imageSize = Size( info.image.width.toDouble(), info.image.height.toDouble(), ); }); }), ); } } class _ImagePainter extends CustomPainter { final ImageProvider imageProvider; final double scale; final Offset offset; final Size imageSize; _ImagePainter({ this.imageProvider, this.scale, this.offset, this.imageSize, }); @override void paint(Canvas canvas, Size size) async { Paint paint = Paint(); paint.isAntiAlias = true; paint.filterQuality = FilterQuality.high; Rect rect = Offset.zero & size; canvas.clipRect(rect); if (imageSize != null) { double width = imageSize.width * scale; double height = imageSize.height * scale; double x = offset.dx + (size.width - width) / 2; double y = offset.dy + (size.height - height) / 2; Rect imageRect = Rect.fromLTWH(x, y, width, height); ui.Image image = await imageProvider.resolve( ImageConfiguration( size: Size(imageRect.width, imageRect.height), ), ); canvas.drawImage(image, imageRect.topLeft, paint); } } @override bool shouldRepaint(_ImagePainter oldDelegate) { return oldDelegate.scale != scale || oldDelegate.offset != offset || oldDelegate.imageSize != imageSize; } } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值