这篇文章用来记录我在使用ListView遇到的一些问题和经验。 虽然是写的ListView,不过TileView、ScrollBox组件大部分经验也能适用。
github工程
关于ListView的基本使用前人总结过不少:
关于ListView的滚动条(ScrollBar)
ListView的滚动条丑不拉几的,所以经常会有以下需求:
如何关闭滚动条的显示?
调用方法SetScrollBarVisibility。参数是ESlateVisiblity,设成Collapsed即可。
如何想要不运行就能在蓝图里预览,请连上EventPreConstruct。
如何自定义滚动条的样式?
UE自带的ListView不支持。
如果硬要做就必须改源码或者从头自己写一个ListView。(UE你给点劲儿啊,Unity的UGUI都比你好用多了。。。)
关于ListView的滚动功能
如何实现鼠标左键滚动?
ListView、TileView、ScrillBox这种带滚动条的自带鼠标右键滚动。但是我就是想左键滚动,也有办法。
方法1:
- 在ProjectSetting中勾选UseMouseForTouch。Touch就是手机、平板等设备的触屏功能。没错这些带滚动条的组件是支持触屏滚动的,所以只要把鼠标模拟Touch选上就行。勾上以后屏幕会出现一个很丑的虚拟摇杆,把DefaultTouchInterface设为空即可。
方法2:
- 调用SetScrollOffset函数可以设置滚动条偏移。然后检测鼠标是否在UI上,再根据滑动的值来增加或者减少这个偏移量。这个做起来就很麻烦了。时间有限我就只研究了下这个SetScrollOffset的参数是干嘛用的。这个偏移的取值范围是0到ListView子物体的个数。它的效果可以演示如下:
如果是TileView这种一行有多列的是这个情况:
如何让ListView子物体滚到视野中?
- 调用ScrollItemIntoView。将特定子物体滚到视野中
- 调用ScrollIndexIntoView。将第几个子物体滚到视野中。
子物体有Button导致ListView不能滚动了怎么办?
找到Button的Interaction里的ClickMethod和TouchMethod选择Precisexxx那个选项。意思是精确点击。也就是说当你点击Button然后进行滑动时这个时候不会触发Button事件而会触发滑动事件。而当你松开时才会触发Button事件。
基本上想到的就这些了,如果有别的以后还会补充。
顺便多说几句,关于用Touch来实现鼠标左键滑动的功能我是怎么想出来的。所谓授人以鱼不如授人以渔嘛。
一开始谷歌“ue leftclick scroll”也好,“ue scroll without scrollbar"都没有得到什么满意的结果。后来就开始看源码了。ListView引用了一个SListView,SListView又继承自STableViewBase。
然后在STableViewBase.h发现了这几个函数,
尝试断点,发现左键点击并不会走OnMouseEnter函数。然后看到OnTouch相关的函数。所以想到了用Touch来实现的思路。之后再搜索”"ue mouse touch**这几个关键词就得出了答案。
总结起来,开源真香。