• MornUI 源码阅读笔记


    1. label的mouseChildren属性为true,但label本身是不需要监听textfield的任何事件的,

      个人猜测是为了给TextInput, TextArea用的,因为后两者需要监听textfield的事件。

      所以,我觉得最好的处理方式还是lable的mouseChildren属性设置为false,在TextInput中再设置mouseChildren为true

    2.DragMangager中找出drop对象的方式比较巧妙,通过value.hasEventListener(DragEvent.DRAG_DROP)带判断是否是合适的对象!

      这个很值得借鉴。当项目中还有一个需求时,当拖动某个display时,还需要目标target闪烁以告知用户往哪儿脱。

      目前的DragManager似乎还无法很好的解决这个需求,如果需要处理的话,需要写在

        _dragInitiator.dispatchEvent(new DragEvent(DragEvent.DRAG_START, dragInitiator, data));

      中,但这又会才生耦合。这个问题还需要好好考虑。

      还有一点是,drag是在display是在mouseDown事件中触发的,如果盖在mouseMove中是不是更好?

      即是,在mouseDown事件中注册stage的mouseMove的监听,如果有移动,则startDrag,当然了,这里还需要要给标识,标识是否已经start。不知道这样是否更好!

      就目前的实现来说,每次mouseDown都触发DragEvent.DRAG_START事件,我觉得有些浪费。

      当然,这个触发也仅仅针对是可拖动的对象,如果不是可拖动的对象,mouseDown就不会调用DragManager的doDrag方法,理论上也不会浪费很多。

    3.TipManager是监听stage上的tip事件来触发的,这也是一个比较好的思路!

    4.RenderManager中在invalidate在一个标识,而不是每次调用都addEventListener来判断是不是会更高效?

    5.对于子对象的event似乎处理的不够好。以TextInput为例,捕获到textfield的Input事件时,又重新抛出这个事件。

      如果用户在使用的过程中,监听了TextInput的事件,那么事件响应代码会被执行两次,一个是textfield抛出的,还有一次是TextInput抛出的。

      所以个人绝对在TextInput内部,捕获到textfield事件后,应该调用事件的stopImmediatePropagation方法。然后再抛出。

    6.查看2.3和2.5版本的list,list的item只能是runtime和box这两种,如果list的内容是单单某个组件就会报错,一定要把组件转换成box。

      2.3版本的list解析在view中有特殊处理,

        if (comp is List && node.@name == "render")  {
          if (node.name() == "Box")  {

      2.5版本中,list内容又有处理,

        cell = _itemRender is XML ? View.createComp(_itemRender) as Box : new _itemRender();

        var cell:Box = getChildByName("item" + i) as Box;

      不知道为什么非要这样设计。

    7.View的XML解析和runtime概念真的超赞!!!

      不知道是不是借鉴了bit101的MinimalComps的MinimalConfigurator,而mornui中的var和minimalComps中的idMap也有异曲同工之妙。

      但minimalComps中的prop赋值时,有一个specialProps,这里面的属性赋值时机是在其他prop之后,这个没懂。mornui中也不存在有优先级的prop。

      MinimalComps的源码很早前就看到,印象最深的是它的延迟渲染的理念,却没想到MinimalConfigurator也是很值得参考的东东。惭愧。

    8.配合MornBuilder使用,真的超级方便!再赞一个!

    2014.04.09补充

    9.自定义morn组件时,会编写该组件的xml的信息,每个属性有一个默认值。当编辑器发布页面的时候,如果编辑器中属性值和默认值相同,则发布出来的页面不带该属性,否则会带有该属性修改后的值。

    这样也减少了一些不必要的运算!做到这点很细心!

    2014.04.11

    关于drag比较好的一种实现:

    监听targer的mouse_over事件,如果e.buttondown为true,则调用dragManger的dodrag方法

  • 相关阅读:
    【leetcode】1020. Partition Array Into Three Parts With Equal Sum
    【leetcode】572. Subtree of Another Tree
    【leetcode】123. Best Time to Buy and Sell Stock III
    【leetcode】309. Best Time to Buy and Sell Stock with Cooldown
    【leetcode】714. Best Time to Buy and Sell Stock with Transaction Fee
    【leetcode】467. Unique Substrings in Wraparound String
    【leetcode】823. Binary Trees With Factors
    【leetcode】143. Reorder List
    【leetcode】1014. Capacity To Ship Packages Within D Days
    【leetcode】1013. Pairs of Songs With Total Durations Divisible by 60
  • 原文地址:https://www.cnblogs.com/tianlanliao/p/3627043.html
Copyright © 2020-2023  润新知