问题标签 [snapping]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
arrays - 使用数组将多个对象捕捉到多个位置
在制作涉及用彩色图块覆盖网格的简单游戏时遇到问题。我已经使用 Arrays 来建立拖放功能,但找不到一种方法可以轻松地将它们捕捉到网格上的位置。我已将网格上的位置制作成影片剪辑,其名称为 snapA1 到 snapJ10,所有这些都以 10 个字母为一组,并具有要匹配的实例名称,但这些剪辑已从数组中删除,因为它们不需要移动。我一直遇到的问题是,我使用的任何功能都只能用于允许捕捉到单个位置。基本上,我只是在寻找一种快捷方式,以允许两组或更多组对象相互捕捉,最好不必使用蛮力代码,我不骗你,相同代码的 20,000 个实例。下面是我到目前为止只允许一个捕捉目标位置的代码
android - RecyclerView 将其捕捉到中心后如何获取中心项目?
我正在实现一个水平RecyclerView
,在滚动后将项目捕捉到中心,例如 Google play App 水平列表。这是一篇评论。
我的代码如下:
RecyclerView
将中心项目(位置)卡到中心后如何获取中心项目(位置) ?没有任何监听器实现吗?此外,当触摸项目视图时,我想将其对齐到中心。我怎样才能做到这一点?
vba - 向 Excel VBA 用户窗体添加网格线
有没有办法在 Excel VBA 用户窗体中添加网格线并将对象捕捉到网格线?
我在 Excel VBA 中生成一个带有大量文本框和标签的用户窗体。对齐它们,即使使用自动对齐和分组工具也是相当乏味和耗时的。如果可以使用水平和垂直网格线将对象捕捉到(想想 AutoCAD),则该过程将加快。默认用户窗体有网格点,但没有线,必须为每个对象手动启用捕捉;它不是所有对象的内置默认值。
android - 如何捕捉 RecyclerView 项目,以便将每个 X 项目视为一个要捕捉的单元?
背景
可以使用以下方法将 RecyclerView 捕捉到其中心:
例子:
MainActivity.kt
activity_main.xml
也可以将其捕捉到其他方面,就像在某些库中所做的那样,例如这里。
还有一些库允许拥有可以像 ViewPager 一样工作的 RecyclerView,例如这里。
问题
假设我有一个包含许多项目的 RecyclerView(在我的情况下是水平的),并且我希望它将每个 X 项目(X 是常数)视为一个单元,并捕捉到每个单元。
例如,如果我稍微滚动一下,它可能会捕捉到 0 项或 X 项,但不会捕捉到它们之间的某个东西。
在某种程度上,它的行为类似于普通 ViewPager 的情况,只是每个页面中都有 X 项。
例如,如果我们从我上面写的示例代码继续,假设 X==3 ,捕捉将从这个空闲状态开始:
到这个空闲状态(如果我们滚动得足够多,否则会保持以前的状态):
应该像在 ViewPager 上一样处理更多的投掷或滚动,就像我上面提到的库一样。
滚动更多(沿相同方向)到下一个捕捉点将到达项目“6”、“9”,依此类推......
我试过的
我试图搜索替代库,并且我还尝试阅读有关此的文档,但我没有找到任何可能有用的东西。
使用 ViewPager 也有可能,但我认为这不是最好的方法,因为 ViewPager 不能很好地回收它的项目,而且我认为它在如何捕捉方面不如 RecyclerView 灵活。
问题
是否可以将 RecyclerView 设置为捕捉每个 X 项目,将每个 X 项目视为要捕捉的单个页面?
当然,这些项目会平均占用整个 RecyclerView 的空间。
假设有可能,当 RecyclerView 即将捕捉到某个项目(包括拥有该项目)时,我将如何在它被捕捉之前获得回调?我问这个是因为它与我在这里问的同一个问题有关。
Kotlin 解决方案
基于“Cheticamp”答案(此处)的有效 Kotlin 解决方案,无需验证您是否具有 RecyclerView 大小,并且在示例中可以选择使用网格而不是列表:
MainActivity.kt
SnapToBlock.kt
更新
即使我已将答案标记为已接受,因为它工作正常,但我注意到它存在严重问题:
平滑滚动似乎不能正常工作(不能滚动到正确的位置)。只有滚动该工作是这样的(但具有“涂抹”效果):
当切换到诸如希伯来语(“עברית”)之类的 RTL(从右到左)语言环境时,它根本不允许我滚动。
我注意到这
onCreateViewHolder
被称为很多。事实上,每次我滚动时都会调用它,即使它应该回收 ViewHolders 的时候也是如此。这意味着视图创建过多,也可能意味着存在内存泄漏。
我试图自己解决这些问题,但到目前为止失败了。
如果这里有人知道如何解决它,我将给予额外的新赏金
更新:由于我们修复了 RTL/LTR,我在这篇文章中更新了 Kotlin 解决方案。
更新:关于第 3 点,这似乎是因为 recyclerView 有一个视图池,它很快就被填满了。为了解决这个问题,我们可以简单地扩大池的大小,通过使用recyclerView.getRecycledViewPool() .setMaxRecycledViews(viewType, Integer.MAX_VALUE)
我们在其中的每个视图类型。奇怪的是,这确实是必需的。我已经将它发布到谷歌(这里和这里)但被拒绝,默认情况下池应该是无限的。最后,我决定至少要求有一个更方便的功能来为所有视图类型执行此操作(此处)。
android - 如何在解决 RecyclerView 和 ViewPager 上的捕捉功能时获得即将被选中的页面
背景
ViewPager
在您执行一些滚动后捕捉到视图RecyclerView
,如果您使用以下内容,也可以:
或者通过使用库来捕捉到某个边缘,如此库所示。ViewPager
如果您愿意,它几乎可以完全模仿,如 CommonsWare在这里提到的这个库所示。
如果需要,它们都可以以相同的方式运行(捕捉到单个视图,可选择占用整个可用空间),所以这个问题是关于它们的。
ViewPager 有一些回收视图的问题,但可以修复这些问题,例如使用这个库。
问题
只要 RecyclerView/ViewPager 即将在滚动中空闲,我就需要更新新显示视图的 UI。
当然,由于用户仍然可以触摸它,因此知道将要发生什么是一个问题,因此我需要在设置滚动状态时也阻止触摸事件。
这意味着,例如,当用户从第 0 页翻到第 1 页时,一旦开始捕捉,触摸事件就会被阻止,我将能够知道它捕捉到第 1 页并更新它页。
这里的问题是 RecyclerView 和 ViewPager 都不提供这个功能。我只能在它停止滚动后才能获得选择的项目,而不是在它稳定时。
我试过的
对于ViewPager
,适配器只有setPrimaryItem,所以很遗憾它告诉我在完成设置后选择了哪个项目。我确实有addOnPageChangeListener函数,它告诉我在任何给定时间的滚动位置(使用onPageScrolled),但它没有告诉我我去哪个方向(左/右),我不知道哪些数据和哪个 viewHolder即将被选中。addOnPageChangeListener
还提供滚动的状态(空闲、稳定、拖动)。
因为RecyclerView
我可以得到滚动状态的回调,它什么时候要稳定,什么时候它变得空闲,但我看不到如何获取它即将稳定的项目。
关于阻止触摸事件,我想我可以在它稳定时在它上面放置一个可点击的视图(没有内容,所以它对用户不可见),并GONE
在它空闲时隐藏它(将可见性设置为 ),但我想知道是否有个更好的方法。
我尝试使用setOnTouchListener
空闲RecyclerView
和稳定状态,但是当我尝试在它稳定时触摸时,它卡在了当前的滚动位置。
因此,RecyclerView
完成ViewPager
这一切都有障碍......
这是我目前的工作:
浏览器:
回收站视图:
我尝试过的 POC 代码(ViewPager
和RecyclerView
):
MainActivity.kt
单元格.xml
activity_main.xml
gradle 文件“非标准”依赖项,来自这里和这里
问题
如何获取 ViewPager/RecyclerView 何时稳定的回调,包括即将捕捉到的项目?
如何阻止触摸事件从它稳定到空闲的时间?有没有比我写的更好的方法(在顶部有一个可点击的视图)?
更新:
似乎对于 ViewPager,我可以使用onPageSelected回调来获取它即将解决的项目。想知道以这种方式获取其页面的 ViewHolder 的最佳方法是什么。我可以保存所需的数据,onBindViewHolder
然后自己检查,但我想知道是否有更好的方法。
现在缺少的是如何做到这一点RecyclerView
以及如何阻止触摸事件(如果有比我写的更好的方法)。该库有一个名为 的函数addOnPageChangedListener
,但它是在设置完成后调用的,因此在这里无济于事。
javascript - 使用 Javascript getBoundingClientRect 将项目捕捉到网格
编辑:我已经将代码(在下面和小提琴中)简化为需要解决的主要问题,以期创造更多的可读性。
我已经实现了 Bader 的解决方案,以正确使用getBoundingClientRect
value 并使用来获取函数所需document.querySelector
的类名和标签。html
我现在想转到以 . 开头的代码的最后五行var = style
。
我现在已经更正了最后两个变量的数学运算。
→ 我正在尝试实现创建一个捕捉功能,以便与基线网格 Sass 插件Plumber一起使用。
基本上,我有一个垂直居中的弹性项目,它需要——而不是完全居中——向上对齐最近的网格线。这将使我能够在基于移动设备的自定义体验中在幻灯片之间保持一致的垂直节奏。
我getBoundingClientRect
用来计算对象底部和窗口顶部之间的距离。
然后我用Math.floor
四舍五入到我的 rem 值的最接近的倍数。
然后我使用这个新值在 flex-centered 容器上创建一个 CSS 底部边距,用于对齐修复。
$(document).ready
(然后完成,我想在窗口调整大小时加载这个函数。)
我很可能在这里遇到语法问题,非常感谢帮助。
谢谢!
unity3d - Snapped GO 的旋转无法正常工作
我目前正在尝试将对象(立方体、金字塔、圆环)捕捉在一起。我为对象边界框的每个面分配了一个“允许捕捉”变量,并在碰撞时尝试找到彼此最近的两侧。然后我将主要对象移动到碰撞侧并相应地旋转它。
代码如下:
我可以通过变换方向向量、应用对象当前的旋转和位置来找到边界框的每个中点(参见 GetWorldPositionFace() )。找到最佳组合后,ApplyToOther() 将对象移动到某个位置并根据选定的面法线旋转它。到目前为止一切顺利,但结果不一致。如您所见,正面并不朝向同一方向,即我想将上部立方体围绕 transform.up 轴旋转这个量。这将是我想要的结果。
但是,如果我添加
到 RotateSides() 函数,结果是this。旋转轴不对。
使用
也没有工作。
我错过了什么?谢谢你的帮助!