IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Flutter 自定义Widget 圆角矩形加三角指示器 -> 正文阅读

[移动开发]Flutter 自定义Widget 圆角矩形加三角指示器

一般app设计中都会有气泡提示,这个时候就需要用到切图了,在flutter中不管你信不信 反正对于.9的这块还是很不友好的,使用起来特别麻烦。要是安卓中这或许会很简单。
但即使支持.9 如果气泡样式很多,对于app的包大小占用其实还是有那么一丢丢的影响的。
我采用了是用代码的方式实现了圆角矩形带三角指示器
现看看效果吧
在这里插入图片描述
上面就是ui给出的效果,其中底部的三角形距离左边的位置还是动态可变,背景颜色还是渐变的。
使用了CustomPaint方式实现一套圆角矩形加指示器的控件,下面是代码实现

ExRoundTriangleWidget

import 'dart:math';

import 'package:flutter/material.dart';

import 'ex_text.dart';

/// 圆角矩形 + 三角提示布局
class ExRoundTriangleWidget extends StatelessWidget {
  /// 子布局
  final String data; // 文案
  final TextStyle textStyle;
  final double roundRadius; // 圆角半径
  final double triangleWidth; // 三角形的宽度
  final double triangleHeight; // 三角形的高度
  final double triangleDistance; // 三角形距离左边的距离
  final bool triangleFromLeft; // 从左边计算距离
  final LinearGradient gradient; // 渐变颜色

  ExRoundTriangleWidget(
      {this.data,
      this.textStyle,
      this.roundRadius,
      this.triangleWidth,
      this.triangleHeight,
      this.triangleDistance,
      this.triangleFromLeft,
      this.gradient});

  @override
  Widget build(BuildContext context) {
    return CustomPaint(
      painter: ExRoundTrianglePainter(
          roundRadius: roundRadius ?? 12,
          triangleWidth: triangleWidth ?? 12,
          triangleHeight: triangleHeight ?? 12,
          triangleDistance: triangleDistance ?? 8,
          triangleFromLeft: triangleFromLeft ?? true,
          gradient: gradient),
      child: Container(
        height: (roundRadius ?? 12) * 2 + (triangleHeight ?? 12),
        margin: EdgeInsets.only(left: roundRadius ?? 12),
        alignment: Alignment.topLeft,
        child: Container(
          height: (roundRadius ?? 12) * 2,
          alignment: Alignment.center,
          child: ExText(data, textStyle),
        ),
      ),
    );
  }
}

/// 圆角矩形 带有三角指示器
class ExRoundTrianglePainter extends CustomPainter {
  Paint _paint;
  final double roundRadius; // 圆角半径
  final double triangleWidth; // 三角形的宽度
  final double triangleHeight; // 三角形的高度
  final double triangleDistance; // 三角形距离左边的距离
  final bool triangleFromLeft; // 从左边计算距离
  LinearGradient gradient; // 渐变颜色

  ExRoundTrianglePainter(
      {this.roundRadius = 12,
      this.triangleWidth = 12,
      this.triangleHeight = 12,
      this.triangleDistance = 16,
      this.triangleFromLeft = true,
      this.gradient}) {
    _paint = Paint()
      ..strokeCap = StrokeCap.butt
      ..isAntiAlias = true //是否启动抗锯齿
      ..style = PaintingStyle.fill //绘画风格,默认为填充
      ..filterQuality = FilterQuality.high //颜色渲染模式的质量
      ..strokeWidth = 15.0; //画笔的宽度

    if (gradient == null) {
      gradient = LinearGradient(colors: [Color(0xFFFF6D2A), Color(0xFFFF0094)]);
    }
  }

  @override
  void paint(Canvas canvas, Size size) {
    final rect = new Rect.fromLTWH(0.0, 0.0, size.width, size.height);
    _paint.shader = gradient.createShader(rect);

    Path path = Path();
    // 左半圆
    path.addArc(new Rect.fromLTWH(0, 0, roundRadius * 2, roundRadius * 2), 90.0 * (pi / 180.0), 180.0 * (pi / 180.0));
    path.lineTo(size.width, 0);
    // 右半圆
    path.addArc(new Rect.fromLTWH(size.width - roundRadius, 0, roundRadius * 2, roundRadius * 2), 270.0 * (pi / 180.0),
        180.0 * (pi / 180.0));

    double reallyTriangleStartDistance; // 三角形的x轴的起始距离 根据triangleFromLeft计算 从右到左开始的
    double reallyTriangleCenterDistance; // 三角形的x轴的中见点距离 根据triangleFromLeft计算 从右到左开始的
    double reallyTriangleEndDistance; // 三角形的x轴的结束距离 根据triangleFromLeft计算 从右到左开始的
    if (triangleFromLeft) {
      reallyTriangleStartDistance = roundRadius + triangleDistance + triangleWidth;
      reallyTriangleCenterDistance = reallyTriangleStartDistance - triangleWidth / 2;
      reallyTriangleEndDistance = reallyTriangleCenterDistance - triangleWidth / 2;
    } else {
      reallyTriangleStartDistance = size.width - roundRadius - triangleDistance;
      reallyTriangleCenterDistance = reallyTriangleStartDistance - triangleWidth / 2;
      reallyTriangleEndDistance = reallyTriangleCenterDistance - triangleWidth / 2;
    }

    path.lineTo(reallyTriangleStartDistance, roundRadius * 2);
    // 三角形
    path.lineTo(reallyTriangleCenterDistance, roundRadius * 2 + triangleHeight);
    path.lineTo(reallyTriangleEndDistance, roundRadius * 2);

    path.lineTo(roundRadius, roundRadius * 2);

    canvas.drawPath(path, _paint);
  }

  @override
  bool shouldRepaint(CustomPainter oldDelegate) {
    return true;
  }
}
  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-08-17 15:30:31  更:2021-08-17 15:30:53 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 10:18:41-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码