iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Flutter如何自定义应用程序内键盘
  • 336
分享到

Flutter如何自定义应用程序内键盘

2023-07-02 08:07:00 336人浏览 独家记忆
摘要

这篇文章主要介绍“Flutter如何自定义应用程序内键盘”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Flutter如何自定义应用程序内键盘”文章能帮助大家解决问题。效果:创建关键小部件Flutte

这篇文章主要介绍“Flutter如何自定义应用程序内键盘”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Flutter如何自定义应用程序内键盘”文章能帮助大家解决问题。

效果:

Flutter如何自定义应用程序内键盘

Flutter如何自定义应用程序内键盘

创建关键小部件

Flutter的优点是,通过组合更简单的小部件,可以轻松构建键盘等复杂布局。首先,您将创建几个简单的按键小部件。

文本键

我已经圈出了由您首先制作的TexTKEy小部件制作的键。

Flutter如何自定义应用程序内键盘

显示文本键(包括空格键)的自定义写意红色圆圈

将以下TextKey小部件添加到您的项目中:

class TextKey extends StatelessWidget {  const TextKey({    Key key,    @required this.text,    this.onTextInput,    this.flex = 1,  }) : super(key: key);  final String text;  final ValueSetter<String> onTextInput;  final int flex;  @override  Widget build(BuildContext context) {    return Expanded(      flex: flex,      child: Padding(        padding: const EdgeInsets.all(1.0),        child: Material(          color: Colors.blue.shade300,          child: InkWell(            onTap: () {              onTextInput?.call(text);            },            child: Container(              child: Center(child: Text(text)),            ),          ),        ),      ),    );  }}

以下是有趣的部分:

  • flex属性允许您的按键均匀分布在一行之间,甚至占据行的更大比例(如上图中的空格键)。

  • 按下按键后,它将以anonTextInput回调的形式将其值传递给键盘。

Backspace键

您还需要一个与TextKey小部件具有不同外观和功能的退格键。

Flutter如何自定义应用程序内键盘

退格键

将以下小部件添加到您的项目中:

class BackspaceKey extends StatelessWidget {  const BackspaceKey({    Key? key,    this.onBackspace,    this.flex = 1,  }) : super(key: key);  final VoidCallback? onBackspace;  final int flex;  @override  Widget build(BuildContext context) {    return Expanded(      flex: flex,      child: Padding(        padding: const EdgeInsets.all(1.0),        child: Material(          color: Colors.blue.shade300,          child: InkWell(            onTap: () {              onBackspace?.call();            },            child: Container(              child: Center(                child: Icon(Icons.backspace),              ),            ),          ),        ),      ),    );  }

备注:

  • TextKey代码有点重复,因此一些重构是为了使其更加简介。

  • onBackspaceVoidCallback,因为不需要将任何文本传递回键盘。

将按键组成键盘

一旦有了按键,键盘就很容易布局,因为它们只是列中的行。

Flutter如何自定义应用程序内键盘

包含三行的列

这是代码。我省略了一些重复的部分,以便简洁。不过,你可以在文章的末尾找到它。

class CustomKeyboard extends StatelessWidget {  CustomKeyboard({    Key? key,    this.onTextInput,    this.onBackspace,  }) : super(key: key);  final ValueSetter<String>? onTextInput;  final VoidCallback? onBackspace;  void _textInputHandler(String text) => onTextInput?.call(text);  void _backspaceHandler() => onBackspace?.call();  @override  Widget build(BuildContext context) {    return Container(      height: 160,      color: Colors.blue,      child: Column(        children: [          buildRowOne(),          buildRowTwo(),          buildRowThree(),          buildRowFour(),          buildRowFive()        ],      ),    );  }  Expanded buildRowOne() {    return Expanded(      child: Row(        children: [          TextKey(            text: '坚',            onTextInput: _textInputHandler,          ),          TextKey(            text: '果',            onTextInput: _textInputHandler,          ),          TextKey(            text: '祝',            onTextInput: _textInputHandler,          ),        ],      ),    );  }  Expanded buildRowTwo() {    return Expanded(      child: Row(        children: [          TextKey(            text: 'I',            onTextInput: _textInputHandler,          ),          TextKey(            text: 'n',            onTextInput: _textInputHandler,          ),          TextKey(            text: 'f',            onTextInput: _textInputHandler,          ),          TextKey(            text: 'o',            onTextInput: _textInputHandler,          ),          TextKey(            text: 'Q',            onTextInput: _textInputHandler,          ),        ],      ),    );  }  Expanded buildRowThree() {    return Expanded(      child: Row(        children: [          TextKey(            text: '十',            onTextInput: _textInputHandler,          ),          TextKey(            text: '五',            onTextInput: _textInputHandler,          ),          TextKey(            text: '周',            onTextInput: _textInputHandler,          ),          TextKey(            text: '年',            onTextInput: _textInputHandler,          ),        ],      ),    );  }  Expanded buildRowFour() {    return Expanded(      child: Row(        children: [          TextKey(            text: '生',            onTextInput: _textInputHandler,          ),          TextKey(            text: '日',            onTextInput: _textInputHandler,          ),          TextKey(            text: '快',            onTextInput: _textInputHandler,          ),          TextKey(            text: '乐',            onTextInput: _textInputHandler,          ),          TextKey(            text: '!',            onTextInput: _textInputHandler,          ),        ],      ),    );  }  Expanded buildRowFive() {    return Expanded(      child: Row(        children: [          TextKey(            text: ' ????',            flex: 2,            onTextInput: _textInputHandler,          ),          TextKey(            text: ' ????',            flex: 2,            onTextInput: _textInputHandler,          ),          TextKey(            text: '????',            flex: 2,            onTextInput: _textInputHandler,          ),          TextKey(            text: '????',            flex: 2,            onTextInput: _textInputHandler,          ),          BackspaceKey(            onBackspace: _backspaceHandler,          ),        ],      ),    );  }}

有趣的部分:

  • 键盘收集按键的回调并传递它们。这样,任何使用CustomKeyboard的人都会收到回调。

  • 您可以看到第三行如何使用flex。空格键的弯曲为4,而退格的默认弯曲为1。这使得空格键占用了后空键宽度的四倍。

在应用程序中使用键盘

现在,您可以像这样使用自定义键盘小部件:

Flutter如何自定义应用程序内键盘

代码看起来是这样的:

CustomKeyboard(  onTextInput: (myText) {    _insertText(myText);  },  onBackspace: () {    _backspace();  },),

处理文本输入

以下是_insertText方法的样子:

void _insertText(String myText) {  final text = _controller.text;  final textSelection = _controller.selection;  final newText = text.replaceRange(    textSelection.start,    textSelection.end,    myText,  );  final myTextLength = myText.length;  _controller.text = newText;  _controller.selection = textSelection.copyWith(    baseOffset: textSelection.start + myTextLength,    extentOffset: textSelection.start + myTextLength,  );}

_controllerTextFieldTextEditinGController。你必须记住,可能有一个选择,所以如果有的话,请用密钥传递的文本替换它。

感谢这个,以提供帮助。*

处理退格

您会认为退格很简单,但有一些不同的情况需要考虑:

  • 有一个选择(删除选择)

  • 光标在开头(什么都不要做)

  • 其他任何事情(删除之前的角色)

以下是_backspace方法的实现:

void _backspace() {  final text = _controller.text;  final textSelection = _controller.selection;  final selectionLength = textSelection.end - textSelection.start;  // There is a selection.  if (selectionLength > 0) {    final newText = text.replaceRange(      textSelection.start,      textSelection.end,      '',    );    _controller.text = newText;    _controller.selection = textSelection.copyWith(      baseOffset: textSelection.start,      extentOffset: textSelection.start,    );    return;  }  // The cursor is at the beginning.  if (textSelection.start == 0) {    return;  }  // Delete the previous character  final previousCodeUnit = text.codeUnitAt(textSelection.start - 1);  final offset = _isUtf16Surrogate(previousCodeUnit) ? 2 : 1;  final newStart = textSelection.start - offset;  final newEnd = textSelection.start;  final newText = text.replaceRange(    newStart,    newEnd,    '',  );  _controller.text = newText;  _controller.selection = textSelection.copyWith(    baseOffset: newStart,    extentOffset: newStart,  );}bool _isUtf16Surrogate(int value) {  return value & 0xF800 == 0xD800;}

即使删除之前的角色也有点棘手。如果您在有表情符号或其他代理对时只回退单个代码单元这将导致崩溃。作为上述代码中的变通办法,我检查了上一个字符是否是UFT-16代理,如果是,则后退了两个字符。(我从Flutter TextPainter源代码中获得了_isUtf16Surrogate方法。)然而,这仍然不是一个完美的解决方案,因为它不适用于像????????或????&zwj;????&zwj;????这样的字素簇,它们由多个代理对组成。不过,至少它不会

以下是象形文字和表情符号键盘作为演示:

Flutter如何自定义应用程序内键盘

????????????&zwj;????&zwj;

如果您对此有意见,请参阅此堆栈溢出问题。

防止系统键盘显示

如果您想将自定义键盘与aTextField一起使用,但系统键盘不断弹出,那会有点烦人。这毕竟是默认行为。

防止系统键盘显示的方法是将TextFieldreadOnly属性设置为true

TextField(  ...  showCursor: true,  readOnly: true,),

此外,将showCursor设置为true,使光标在您使用自定义键盘时仍然可以工作。

在系统键盘和自定义键盘之间切换

如果您想让用户选择使用系统键盘或自定义键盘,您只需为readOnly使用不同的值进行重建。

Flutter如何自定义应用程序内键盘

以下是演示应用程序中TextField的设置方式:

class _KeyboardDemoState extends State<KeyboardDemo> {  TextEditingController _controller = TextEditingController();  bool _readOnly = true;  @override  Widget build(BuildContext context) {    return Scaffold(      resizeToAvoidBottomInset: false,      body: Column(        children: [          ...          TextField(            controller: _controller,            decoration: ...,            style: TextStyle(fontSize: 24),            autofocus: true,            showCursor: true,            readOnly: _readOnly,          ),          IconButton(            icon: Icon(Icons.keyboard),            onPressed: () {              setState(() {                _readOnly = !_readOnly;              });            },          ),

有趣的部分:

  • 当按下键盘IconButton时,更改_readOnly的值,然后重建布局。这会导致系统键盘隐藏或显示。

  • Scaffold上的resizeToAvoidBottomInset设置为false,允许系统键盘覆盖自定义键盘。另一个选项是在显示系统键盘时隐藏自定义键盘。然而,当我在实验中这样做时,我发现我必须使用单独的布尔值来隐藏自定义键盘,这样我就可以延迟显示它,直到系统键盘消失。否则,它会跳到系统键盘顶部一秒钟。

就这样!如您所见,制作自己的应用程序内键盘并不难。

完整代码

以下是我在本文中使用的演示应用程序的完整代码:

import 'package:flutter/material.dart';void main() => runApp(MyApp());class MyApp extends StatelessWidget {  @override  Widget build(BuildContext context) {    return MaterialApp(      home: KeyboardDemo(),    );  }}class KeyboardDemo extends StatefulWidget {  @override  _KeyboardDemoState createState() => _KeyboardDemoState();}class _KeyboardDemoState extends State<KeyboardDemo> {  TextEditingController _controller = TextEditingController();  bool _readOnly = true;  @override  Widget build(BuildContext context) {    return Scaffold(      appBar: AppBar(        title: Text("大前端之旅的自定义键盘"),      ),      resizeToAvoidBottomInset: false,      body: Column(        children: [          Text("微信:xjg13690"),          SizedBox(height: 50),          TextField(            controller: _controller,            decoration: InputDecoration(              border: OutlineInputBorder(                borderRadius: BorderRadius.circular(3),              ),            ),            style: TextStyle(fontSize: 24),            autofocus: true,            showCursor: true,            readOnly: _readOnly,          ),          IconButton(            icon: Icon(Icons.keyboard),            onPressed: () {              setState(() {                _readOnly = !_readOnly;              });            },          ),          Spacer(),          CustomKeyboard(            onTextInput: (myText) {              _insertText(myText);            },            onBackspace: () {              _backspace();            },          ),        ],      ),    );  }  void _insertText(String myText) {    final text = _controller.text;    final textSelection = _controller.selection;    final newText = text.replaceRange(      textSelection.start,      textSelection.end,      myText,    );    final myTextLength = myText.length;    _controller.text = newText;    _controller.selection = textSelection.copyWith(      baseOffset: textSelection.start + myTextLength,      extentOffset: textSelection.start + myTextLength,    );  }  void _backspace() {    final text = _controller.text;    final textSelection = _controller.selection;    final selectionLength = textSelection.end - textSelection.start;    // There is a selection.    if (selectionLength > 0) {      final newText = text.replaceRange(        textSelection.start,        textSelection.end,        '',      );      _controller.text = newText;      _controller.selection = textSelection.copyWith(        baseOffset: textSelection.start,        extentOffset: textSelection.start,      );      return;    }    // The cursor is at the beginning.    if (textSelection.start == 0) {      return;    }    // Delete the previous character    final previousCodeUnit = text.codeUnitAt(textSelection.start - 1);    final offset = _isUtf16Surrogate(previousCodeUnit) ? 2 : 1;    final newStart = textSelection.start - offset;    final newEnd = textSelection.start;    final newText = text.replaceRange(      newStart,      newEnd,      '',    );    _controller.text = newText;    _controller.selection = textSelection.copyWith(      baseOffset: newStart,      extentOffset: newStart,    );  }  bool _isUtf16Surrogate(int value) {    return value & 0xF800 == 0xD800;  }  @override  void dispose() {    _controller.dispose();    super.dispose();  }}class CustomKeyboard extends StatelessWidget {  CustomKeyboard({    Key? key,    this.onTextInput,    this.onBackspace,  }) : super(key: key);  final ValueSetter<String>? onTextInput;  final VoidCallback? onBackspace;  void _textInputHandler(String text) => onTextInput?.call(text);  void _backspaceHandler() => onBackspace?.call();  @override  Widget build(BuildContext context) {    return Container(      height: 160,      color: Colors.blue,      child: Column(        children: [          buildRowOne(),          buildRowTwo(),          buildRowThree(),          buildRowFour(),          buildRowFive()        ],      ),    );  }  Expanded buildRowOne() {    return Expanded(      child: Row(        children: [          TextKey(            text: '坚',            onTextInput: _textInputHandler,          ),          TextKey(            text: '果',            onTextInput: _textInputHandler,          ),          TextKey(            text: '祝',            onTextInput: _textInputHandler,          ),        ],      ),    );  }  Expanded buildRowTwo() {    return Expanded(      child: Row(        children: [          TextKey(            text: 'I',            onTextInput: _textInputHandler,          ),          TextKey(            text: 'n',            onTextInput: _textInputHandler,          ),          TextKey(            text: 'f',            onTextInput: _textInputHandler,          ),          TextKey(            text: 'o',            onTextInput: _textInputHandler,          ),          TextKey(            text: 'Q',            onTextInput: _textInputHandler,          ),        ],      ),    );  }  Expanded buildRowThree() {    return Expanded(      child: Row(        children: [          TextKey(            text: '十',            onTextInput: _textInputHandler,          ),          TextKey(            text: '五',            onTextInput: _textInputHandler,          ),          TextKey(            text: '周',            onTextInput: _textInputHandler,          ),          TextKey(            text: '年',            onTextInput: _textInputHandler,          ),        ],      ),    );  }  Expanded buildRowFour() {    return Expanded(      child: Row(        children: [          TextKey(            text: '生',            onTextInput: _textInputHandler,          ),          TextKey(            text: '日',            onTextInput: _textInputHandler,          ),          TextKey(            text: '快',            onTextInput: _textInputHandler,          ),          TextKey(            text: '乐',            onTextInput: _textInputHandler,          ),          TextKey(            text: '!',            onTextInput: _textInputHandler,          ),        ],      ),    );  }  Expanded buildRowFive() {    return Expanded(      child: Row(        children: [          TextKey(            text: ' ????',            flex: 2,            onTextInput: _textInputHandler,          ),          TextKey(            text: ' ????',            flex: 2,            onTextInput: _textInputHandler,          ),          TextKey(            text: '????',            flex: 2,            onTextInput: _textInputHandler,          ),          TextKey(            text: '????',            flex: 2,            onTextInput: _textInputHandler,          ),          BackspaceKey(            onBackspace: _backspaceHandler,          ),        ],      ),    );  }}class TextKey extends StatelessWidget {  const TextKey({    Key? key,    @required this.text,    this.onTextInput,    this.flex = 1,  }) : super(key: key);  final String? text;  final ValueSetter<String>? onTextInput;  final int flex;  @override  Widget build(BuildContext context) {    return Expanded(      flex: flex,      child: Padding(        padding: const EdgeInsets.all(1.0),        child: Material(          color: Colors.blue.shade300,          child: InkWell(            onTap: () {              onTextInput?.call(text!);            },            child: Container(              child: Center(child: Text(text!)),            ),          ),        ),      ),    );  }}class BackspaceKey extends StatelessWidget {  const BackspaceKey({    Key? key,    this.onBackspace,    this.flex = 1,  }) : super(key: key);  final VoidCallback? onBackspace;  final int flex;  @override  Widget build(BuildContext context) {    return Expanded(      flex: flex,      child: Padding(        padding: const EdgeInsets.all(1.0),        child: Material(          color: Colors.blue.shade300,          child: InkWell(            onTap: () {              onBackspace?.call();            },            child: Container(              child: Center(                child: Icon(Icons.backspace),              ),            ),          ),        ),      ),    );  }}

关于“Flutter如何自定义应用程序内键盘”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网精选频道,小编每天都会为大家更新不同的知识点。

--结束END--

本文标题: Flutter如何自定义应用程序内键盘

本文链接: https://www.lsjlt.com/news/340856.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Flutter如何自定义应用程序内键盘
    这篇文章主要介绍“Flutter如何自定义应用程序内键盘”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Flutter如何自定义应用程序内键盘”文章能帮助大家解决问题。效果:创建关键小部件Flutte...
    99+
    2023-07-02
  • 详解Flutter自定义应用程序内键盘的实现方法
    目录创建关键小部件文本键Backspace键将按键组成键盘在应用程序中使用键盘处理文本输入处理退格防止系统键盘显示在系统键盘和自定义键盘之间切换完整代码本文将向您展示如何创建自定义键...
    99+
    2024-04-02
  • flutter聊天界面-自定义表情键盘实现
    flutter聊天界面-自定义表情键盘实现 flutter 是 Google推出并开源的移动应用开发框架,主打跨平台、高保真、高性能。开发者可以通过 Dart语言开发 App,一套代码同时运行在 iO...
    99+
    2023-09-05
    flutter flutter聊天界面 自定义表情 聊天界面
  • 微信小程序自定义关键词如何做
    本文小编为大家详细介绍“微信小程序自定义关键词如何做”,内容详细,步骤清晰,细节处理妥当,希望这篇“微信小程序自定义关键词如何做”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。  自定义推广关键词常见问题  1、提...
    99+
    2023-06-26
  • 详解Flutter如何完全自定义TabBar
    目录前言实现过程完整代码总结前言 在App中TabBar形式交互是非常常见的,但是系统提供的的样式大多数又不能满足我们产品和UI的想法,这篇就记录下在Flutter中我在实现自定义T...
    99+
    2024-04-02
  • 小程序如何自定义组件
    本文小编为大家详细介绍“小程序如何自定义组件”,内容详细,步骤清晰,细节处理妥当,希望这篇“小程序如何自定义组件”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一 小程序提供了很多api和基础组件,但为减少代码的复...
    99+
    2023-06-26
  • Springboot应用如何自定义Banner
    Springboot应用如何自定义Banner,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。这个小功能据说是Springboot2.x的小...
    99+
    2024-04-02
  • 小程序自定义tabbar如何实现
    小编给大家分享一下小程序自定义tabbar如何实现,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!tabBar如果小程序是一个多 tab 应用(客户端窗口的底部或顶...
    99+
    2023-06-26
  • java应用程序如何自定义log4j配置文件的位置
    目录自定义log4j配置文件的位置使用log4j很方便log4j因配置文件放置位置出错自定义log4j配置文件的位置 使用log4j很方便 1、添加依赖的log4j-1.2.8.ja...
    99+
    2024-04-02
  • Java Swing中如何定义键盘事件
    这篇文章给大家分享的是有关Java Swing中如何定义键盘事件的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。在jdk1.2中,分别针对Jcomponent和Text类的对象定制了不同的处理键盘事件的方法:在Jc...
    99+
    2023-06-03
  • C++应用程序中的自定义图形显示
    在 c++++ 应用程序中创建自定义图形显示背景,需要创建自定义窗口类,创建并显示窗口,并在窗口渲染方法中执行绘图操作,具体步骤如下:创建自定义窗口类,处理窗口创建和渲染;创建自定义窗口...
    99+
    2024-05-10
    c++
  • prometheus client_go为应用程序自定义监控指标
    目录使用prometheus client_go为应用程序添加监控指标原因去掉Proc和Go指标使用prometheus client_go为应用程序添加监控指标 使用promet...
    99+
    2023-02-15
    prometheus client_go监控指标 go监控指标
  • Java开发Spark应用程序自定义PipeLineStage详解
    目录引言背景知识介绍定义一个Transformer1. 场景介绍2. 代码实现2.1 定义并封装成员变量2.2 实现抽象方法3. Pipeline的存储文件小结引言 在Spark中...
    99+
    2023-02-01
    Java Spark自定义PipeLineStage Java Spark
  • 小程序如何自定义索引菜单
    本文小编为大家详细介绍“小程序如何自定义索引菜单”,内容详细,步骤清晰,细节处理妥当,希望这篇“小程序如何自定义索引菜单”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。<view class=&qu...
    99+
    2023-07-02
  • 详解Android Flutter如何自定义动画路由
    目录简介自定义跳转使用flutter动画基础实现一个自定义的route总结简介 flutter中有默认的Route组件,叫做MaterialPageRoute,一般情况下我们在flu...
    99+
    2023-05-16
    Android Flutter自定义动画路由 Flutter自定义动画路由 Android Flutter 动画
  • C#对桌面应用程序自定义鼠标光标
    有的时候,一个自定义的鼠标光标能给你的程序增色不少。本文这里介绍一下如何在.net桌面程序中自定义鼠标光标。由于.net的桌面程序分为WinForm和WPF两种,这里分别介绍一下。 ...
    99+
    2024-04-02
  • 小程序如何实现自定义通用toast组件
    这篇文章主要为大家展示了“小程序如何实现自定义通用toast组件”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“小程序如何实现自定义通用toast组件”这篇文章吧...
    99+
    2024-04-02
  • 利用python自定义构建交互式SSH应用程序
    这篇文章主要介绍“利用python自定义构建交互式SSH应用程序”,在日常操作中,相信很多人在利用python自定义构建交互式SSH应用程序问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”利用python自定义...
    99+
    2023-06-05
  • 微信小程序中如何使用自定义字体
    这篇文章主要介绍了微信小程序中如何使用自定义字体的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇微信小程序中如何使用自定义字体文章都会有所收获,下面我们一起来看看吧。技术难点1. 微信限制大家开发过微信小程序的应...
    99+
    2023-06-29
  • 如何使用小程序自定义scroll-view滚动条
    小编给大家分享一下如何使用小程序自定义scroll-view滚动条,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!小程序自定义 scroll-view 滚动条效果图...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作