- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个图像 slider ,可以通过鼠标拖放或手指在触摸屏上滑动来移动到下一张或上一张图像。到目前为止,一切都很好。但是由于使用笔记本电脑触摸板滑动相当棘手,所以我毕竟想添加下一个/上一个按钮。现在我的问题是他们弄乱了触摸和鼠标手势的代码。
导致的错误是:
我使用 console.log
和开发工具来确定和检查这些错误。由于我发现这个 slider 的问题很难解释,所以我制作了一个代码示例。
// set --n (used for calc in CSS) via JS, after getting
// .container and the number of child images it holds:
const _C = document.querySelector(".slider-container"),
N = _C.children.length;
_C.style.setProperty("--n", N);
// detect the direction of the motion between "touchstart" (or "mousedown") event
// and the "touched" (or "mouseup") event
// and then update --i (current slide) accordingly
// and move the container so that the next image in the desired direction moves into the viewport
// on "mousedown"/"touchstart", lock x-coordiate
// and store it into an initial coordinate variable x0:
let x0 = null;
let locked = false;
function lock(e) {
x0 = unify(e).clientX;
// remove .smooth class
_C.classList.toggle("smooth", !(locked = true));
}
// next, make the images move when the user swipes:
// was the lock action performed aka is x0 set?
// if so, read current x coordiante and compare it to x0
// from the difference between these two determine what to do next
let i = 0; // counter
let w; //image width
// update image width w on resive
function size() {
w = window.innerWidth;
}
function move(e) {
if (locked) {
// set threshold of 20% (if less, do not drag to the next image)
// dx = number of pixels the user dragged
let dx = unify(e).clientX - x0,
s = Math.sign(dx),
f = +(s * dx / w).toFixed(2);
// Math.sign(dx) returns 1 or -1
// depending on this, the slider goes backwards or forwards
if ((i > 0 || s < 0) && (i < N - 1 || s > 0) && f > 0.2) {
_C.style.setProperty("--i", (i -= s));
f = 1 - f;
}
_C.style.setProperty("--tx", "0px");
_C.style.setProperty("--f", f);
_C.classList.toggle("smooth", !(locked = false));
x0 = null;
}
}
size();
addEventListener("resize", size, false);
// ===============
// drag-animation for the slider when it reaches the end
// ===============
function drag(e) {
e.preventDefault();
if (locked) {
_C.style.setProperty("--tx", `${Math.round(unify(e).clientX - x0)}px`);
}
}
// ===============
// prev, next
// ===============
let prev = document.querySelector(".prev");
let next = document.querySelector(".next");
prev.addEventListener("click", () => {
if (i == 0) {
console.log("start reached");
} else if (i > 0) {
// decrease i as long as it is bigger than the number of slides
_C.style.setProperty("--i", i--);
}
});
next.addEventListener("click", () => {
if (i < N) {
// increase i as long as it's smaller than the number of slides
_C.style.setProperty("--i", i++);
}
});
// ===============
// slider event listeners for mouse and touch (start, move, end)
// ===============
_C.addEventListener("mousemove", drag, false);
_C.addEventListener("touchmove", drag, false);
_C.addEventListener("mousedown", lock, false);
_C.addEventListener("touchstart", lock, false);
_C.addEventListener("mouseup", move, false);
_C.addEventListener("touchend", move, false);
// override Edge swipe behaviour
_C.addEventListener(
"touchmove",
e => {
e.preventDefault();
},
false
);
// unify touch and click cases:
function unify(e) {
return e.changedTouches ? e.changedTouches[0] : e;
}
/* parent of book-container & container (slider) */
main {
overflow: hidden;
display: flex;
justify-content: space-between;
}
/* wraps entire slider */
.slider-wrapper {
overflow: hidden;
width: 100%;
position: relative;
}
.slider-nav {
position: absolute;
top: 0;
left: 0;
width: 100%;
text-align: center;
margin: 0;
padding: 1%;
background: rgba(0,0,0,0.6);
color: #fff;
}
/* slider controls*/
.control {
position: absolute;
top: 50%;
width: 40px;
height: 10px;
color: #fff;
font-size: 3rem;
padding: 0;
margin: 0;
line-height: 0;
}
.prev,
.next {
cursor: pointer;
transition: all 0.2s ease;
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
background: rgba(0,0,0,0.3);
padding: 1rem;
}
.prev {
left: 1.1rem;
}
.next {
right: 1.1rem;
}
.prev:hover,
.next:hover {
transform: scale(1.5,1.5);
}
.slider-container {
/*
n variable holds number of images to make .container wide enough
to hold all its image children
that still have the same width as its parent
*/
display: flex;
align-items: center;
overflow-y: hidden;
width: 100%; /* fallback */
width: calc(var(--n)*100%);
height: 31vw;
max-height: 100vh;
transform: translate(calc(var(--i, 0)/var(--n)*-100% + var(--tx, 0px)));
}
/* transition animation for the slider */
.smooth {
/* f computes actual animation duration via JS */
transition: transform calc(var(--f, 1)*.5s) ease-out;
}
/* images for the slider */
img {
width: 100%; /* can't take this out either as it breaks Chrome */
width: calc(100%/var(--n));
pointer-events: none;
}
<div class="slider-wrapper">
<div class="slider-container">
<img src="https://source.unsplash.com/featured?technology">
<img src="https://source.unsplash.com/featured?dogs">
<img src="https://source.unsplash.com/featured?cats">
<img src="https://source.unsplash.com/featured?cake">
<img src="https://source.unsplash.com/featured?birds">
<img src="https://source.unsplash.com/featured?cities">
</div>
<div class="slider-controls">
<span class="control prev">←</span>
<span class="control next">→</span>
</div>
</div>
<!-- END slider-wrapper -->
如果有人能帮我解决这个问题,那就太好了,这样通过鼠标或触摸滑动幻灯片的代码就不会与下一个/前一个按钮的代码混淆。
最佳答案
我想我已经找到了为您修复代码的快速方法。
prev.addEventListener("click", () => {
if (i == 0) {
console.log("start reached");
} else if (i > 0) {
// decrease i as long as it is bigger than the number of slides
_C.style.setProperty("--i", --i);
}
});
next.addEventListener("click", () => {
if (i+1 < N) {
// increase i as long as it's smaller than the number of slides
_C.style.setProperty("--i", ++i);
console.warn(i);
}
});
您在增加计数器的逻辑时遇到了错误。它在“事后”增加和减少。这会导致您的按钮出现问题。
slider 卡住的问题可以通过缩小浏览器窗口、单击并拖动鼠标到窗口外并在窗口外释放来重现。
提示:您应该为 'mouseleave'
事件实现一个监听器。
附言
整个代码可能会简单得多,如果您需要帮助以“更好”地编写它,请随时联系我:) 我会在有空闲时间时尽力提供帮助:)
关于javascript - 触摸图像 slider : next/prev keys interfere with code for current slide,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59429425/
我该怎么做 touch R 中的文件(即更新其修改时间而不更改其内容)?我正在寻找一个跨平台的内置(或打包)等效于: system2("touch", file_name) 最佳答案 我找到了 an
我想在 android 中实现 body 部位选择。我的要求是,当我点击特定部分时,图像应用程序应该能够识别 body 部位并且所选部分的颜色应该改变。附上示例图像以供引用。 如有任何想法或建议,我们
我需要将3D模型加载到我的应用程序中(不是游戏,它没有任何区别),并检测用户何时触摸此模型的特定部分以采取不同的操作。 我怎样才能做到这一点?可能吗? 最佳答案 我不熟悉Rajawali,但GitHu
似乎连续触摸总是被它起源的控件捕获。是否有标准方法将触摸/手势传递给当前触摸结束的控件? 最佳答案 控件显示在 UIView 对象内部的屏幕上。 iOS 使用第一响应者的概念来处理 UIView 对象
我有一个 UIScrollView 实例,允许用户放大/缩小。我已经根据文档实现了一个委托(delegate)来处理这个问题。但是,我想知道用户触摸 ScrollView 的位置(相对于 Scroll
我正在创建一款射击游戏,您可以触摸屏幕,玩家可以射击。我遇到的问题是,当你触摸屏幕并按住它并拖动它时,它会快速射击。处理这个问题的最佳方法是什么? 我希望玩家能够按住手指并以稳定的速度射击,而手指向上
- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typ
这是我从触摸事件中获得的返回数据。明显缺少任何有用的触摸 X/Y 坐标 ( https://developer.mozilla.org/en-US/docs/Web/API/TouchEvent/ch
因此,我有一个屏幕,其中包含 0 到 6 个通过 XML 包含的相同用户界面组件。类似这样的东西: ...等等 每个包含的 UI 都是我重复使用的几个小部件和自定义组件的集
我希望能够更改文件的修改日期以便在 Web 应用程序中使用。目前我直接在命令行上测试这个。在我的 Mac 上工作正常,但是当我在 Linux 服务器上执行此操作时出现错误。 命令:/bin/touch
概念问题: 我在使用 touches 时遇到了一个非常简单的问题属性,自动更新依赖模型的时间戳;它正确地这样做了,但也应用了全局范围。 有什么办法可以关闭这个功能吗?或专门询问自动 touches忽略
我很难在一个简单的等距 Sprite Kit 游戏中实现点击处理。 我有一个包含多个 Tile 对象(SKSpriteNode)的 map (SKNode)的游戏场景(SKScene)。 这是 map
有没有办法在触摸事件后恢复 Flexslider 幻灯片的自动播放?现在看来,一旦我滑动导航,幻灯片就会停止...... 最佳答案 FLEXISLIDER 2 更新 resume()事件不再存在,正确
有些游戏有一些小图片作为 Sprite ,可以通过触摸来移动。如果 Sprite 是较大的图片,触摸是很正常的。我们可以使用函数CGRectContainsPoint检查 Sprite 。但是当 Sp
我有一个 View 覆盖到 iPhone 的相机 View 上。在此 View 中,我有一些 uibuttons,它们显示的位置取决于加速度计/指南针的值。当用户在 View 内触摸但没有在 uibu
我有一个 UIView 和一个 UIWebView。 UIWebView 是 UIView 的 subview 。 UIWebView 包含 YouTube 视频,并设置为让视频适合 UIWebVie
我是通过 XCode 使用 SDK 版本 5.0 进行 iOS 开发的新手。在我的应用程序中,我需要在按下按钮时更改按钮的标题。 假设在正常状态下它是“未推送”的。我所需要的是,当我按下按钮时,按钮标
我需要防止我的网络应用程序中的水平滚动。我尝试在 touchmove 事件上使用 PreventDefault(),但它也阻止垂直滚动。 有什么想法吗?^^ 我的尝试: $(document)
对于完全适合动画组方法的动画效果,如Brad Larson's answer here所示,我需要动画根据输入进行。特别是触摸和检测到的触摸的位置。处理 TouchMoved: 并为每次触摸设置元素的
我在屏幕上散布了一系列硬币。我想在触摸硬币时添加声音。 private Music coinSound; 在 show() 中: coinSound=assetManager.get(Assets.c
我是一名优秀的程序员,十分优秀!