博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
自绘制HT For Web ComboBox下拉框组件
阅读量:6379 次
发布时间:2019-06-23

本文共 3639 字,大约阅读时间需要 12 分钟。

传统的HTML5的下拉框select只能实现简单的文字下拉列表,而通用组件中不仅能够实现传统HTML5下拉框效果,而且可以在文本框和下拉列表中添加自定义的小图标,让整个组件看起来更直观,今天我就如何制定自定义下拉框做一番探讨。

首先我们先来目睹下效果:

 

看起来跟普通的好像也没什么特殊的,是的,按照规范的设计,完全可以实现同样的效果,但是今天的主要任务并不是讨论有多少实现方案,今天的首要任务是介绍自定义下拉列表的用法。

那么接下来就开始具体的方案介绍,废话不多说,上代码:

function createGradientComboBox(dataModel){    var sm = dataModel.sm(),        gradientComboBox = new ht.widget.ComboBox(),        gradients = ['linear.southwest','linear.southeast','linear.northwest','linear.northeast',            'linear.north','linear.south','linear.west','linear.east',            'radial.center','radial.southwest','radial.southeast','radial.northwest','radial.northeast',            'radial.north','radial.south','radial.west','radial.east',            'spread.horizontal','spread.vertical','spread.diagonal','spread.antidiagonal',            'spread.north','spread.south','spread.west','spread.east'],        gradientImages = [],        indent = gradientComboBox.getIndent(),        height = 18,        padding = 2;    gradients.forEach(function (gradient) {        gradientImages[gradient] = {            width: indent,            height: height,            comps: [                {                    type: 'rect',                    rect: [padding, padding, indent - 2 * padding, height - 2 * padding],                    background: 'red',                    gradient: gradient,                    gradientColor: 'white'                }            ]        };    });    gradientComboBox.setValues(gradients);    gradientComboBox.setValue('linear.southwest');    gradientComboBox.setWidth(90);    gradientComboBox.setDropDownWidth(140);    gradientComboBox.drawValue = function(g, value, selected, x, y, w, h){        var self = this,            indent = self.getIndent(),            label = self.toLabel(value),            icon = gradientImages[value];        if(icon){            ht.Default.drawCenterImage(g, icon, x+indent/2, y+h/2);            x += indent;        }        if(label){            ht.Default.drawText(g, label, self.getLabelFont(value, selected), self.getLabelColor(value, selected), x, y, 0, h);        }    };    gradientComboBox.onValueChanged = function(oldValue, newValue){        onComboBoxValueChanged(dataModel, oldValue, newValue, 'shape.gradient', this);    };    return gradientComboBox;}

这是背景渐变效果列表的具体构建代码,我来描述下具体的设计思路:

  1. 支持的渐变效果组合起来放在一个叫gradient的数组变量中;
  2. 通过遍历gradient数组来动态创建gradient对应的矢量图,并将矢量图存放在gradientImages的数组变量中;
  3. gradient文本值作为value,并设置的相关参数;
  4. 通过重载drawValue方法来实现自定义下拉列表;
  5. drawValue方法中需要传入的参数有:g(画笔),value(对应comboBoxvalues),selected(是否被选中),xy(画笔的其实绘制坐标xy),wh(画笔绘制的宽高wh);
  6. 通过ht.Default.drawCenterImage()方法将数量图元绘制到指定位置;
  7. 通过ht.Default.drawText()方法将要显示的的值绘制到指定的位置;
  8. 最后重载onValueChanged()方法来监听的属性变化,并按照要求做对应的业务处理。

整体思路就是这样子的,相应的图形ComboBox组件也是如此的设计思路,接下来我们来了解下网络拓扑图组件的联动效果实现吧。

 

通过两张图的对比,我相信大家都能够感受到变化吧。前一张是GraphView的初始状态,后一张是通过选中图元后修改gradient渐变选择框后的效果,我们来看看具体的代码实现,的创建我就不在这多说了,直接上事件处理的具体实现代码:

function onComboBoxValueChanged(dataModel, oldValue, newValue, style, scope){    var sm = dataModel.sm();    if(sm.size() === 0){        dataModel.each(function(data){            data.setStyle(style, newValue);        }, scope);    }else{        sm.each(function(data){            data.setStyle(style, newValue);        }, scope);    }}

代码很简单,做的事情也很简单,接下来我们就来分析下代码的具体实现:

  1. 方法的入参:dataModel(数据容器),oldValuecomboBox老值), newValuecomboBox新值), style(要改变的样式名称), scope(方法调用者);
  2. dataModel中获取相应的selectionModel sm
  3. 根据sm.size()来判断在GraphView中选取了多少个data,如果一个都没选中,则修改dataModel中的所有data的属性;如果有选中的data,则只修改所选中data的属性。

到此自绘制 下拉框组件的介绍就结束了,通用组件的灵活性和易用性还不止如此,在本文中涉及到矢量、ComboBox、拓扑图组件等几个关键的知识点,在后续的文章中会做具体的阐述,欢迎大家届时关注。

转载于:https://www.cnblogs.com/xhload3d/p/4332878.html

你可能感兴趣的文章
用pythonturtle写名字_去年爆款新生儿名字,家长自以为起的不错,却有“棺材”的意思...
查看>>
句子分类_语法微课句子的分类+文本讲解
查看>>
图形化分析工具_推荐一款基于小米 soar 的开源 sql 分析与优化的 web 图形化工具...
查看>>
485 工控机 接线方式_RS485温湿度传感器的接线方式及注意事项
查看>>
u3d游戏开发视频潭州_unity3d教程视频-unity3d教程中文零基础入门/u3d游戏开发/特效案例/项目实战V2.0 最新版 - 极光站...
查看>>
c++区块链实例_cpp 区块链模拟示例(二)工程代码解析
查看>>
java 接口的本质_Java基本概念:接口
查看>>
java死锁的解决_java中常见的死锁以及解决方法代码
查看>>
java菜单栏不下拉_我java代码中的下拉列表设好后为什么无法下拉?
查看>>
java传递引用类型的实质_java的引用类型以及值传递
查看>>
java策略模式使用场景,Java设计模式—策略模式
查看>>
RHEL6.3实现基于加密的用户认证验证访问
查看>>
SCCM2012 R2实战系列之十一:解决OSD分发Windows7 系统盘盘符为’D’问题
查看>>
经验分享:我是如何在网店无货源情况下快速出单?
查看>>
限免的Mac App套件,工程师绝对不可错过
查看>>
Skype for Business Server 2015-05-监控和存档服务器-配置
查看>>
浅谈物化视图
查看>>
安装SQL Server 2017
查看>>
超融合超越企业传统存储绕不开的六个问题
查看>>
医院CIO的一幅工作对联
查看>>