- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
总结:当我在 Android 应用程序中触摸我的 WebView 时,我想停止嗡嗡声。我希望第一次触摸 webview 时没有延迟,并尽可能响应触摸。
编辑:我设法摆脱了嗡嗡声。它被称为触觉反馈。您可以通过将以下代码行放在我的 onCreate
的末尾来删除它功能:webview.setHapticFeedbackEnabled(false);
.
编辑 2:我现在发现第一次触摸检查缩放和东西时有 300 毫秒的延迟。这可以通过将以下内容放在 <head>
中来关闭。节html
文件:<meta name="viewport" content="width=device-width, user-scalable=no" />
.
所以这个问题得到了回答,除非有人知道任何其他提示。
我有一个非常基本的安卓应用程序。您可以使用仅使用 java 的“空 Activity ”在 Android Studio 中创建它。然后更新结果代码如下。
注意:它基本上是一个 WebView ,其中 index.html
文件包含在文件夹 assets/www
中.
蓝色 Blob 会响应您的触摸。当您按下它们时,它们会根据您触摸的每个圆圈的哪一侧变成青蓝色。 (一个是左/右按钮,一个是上/下按钮。)
问题一:第一次触摸屏幕时和松开手指后再次触摸屏幕时有烦人的嗡嗡声。我怎样才能在 Android 代码中删除它,只为这个应用程序?
问题 2:我还想让触摸响应尽可能快。还有什么我可以做的吗?我第一次触摸蓝色按钮时似乎有延迟。当我在蓝色按钮上左右移动手指时,响应似乎正常。
重要的html:
<!DOCTYPE html>
<html>
<head>
<title>Test Touch Screen</title>
</head>
<body onload="MyOnLoad();" style="width:100%; height: 100%; padding: 0 0 0 0; margin: 0 0 0 0; overflow: hidden;">
<div id="divMain" style="display: none;">
<br /><br /><br />
<button onclick="MyButton();" style="font-size:xx-large">Click</button>
</div>
<div id="divCanvas" style="display: block; width: 100%; height: 100%; min-height: 100vh; overflow-x: hidden; overflow-y: hidden;
margin: 0px 0px 0px 0px; padding: 0px 0px 0px 0px;">
<canvas id="mycanvas" oncontextmenu="return false;"></canvas>
</div>
<!-- JQuery -->
<script type="text/javascript" src="https://code.jquery.com/jquery-3.2.0.min.js"></script>
<script type="text/javascript">
var g_StopTouchAndMouseFiringTwice = true;
var g_PosUpDownX = 0;
var g_PosUpDownY = 0;
var g_PosLeftRightX = 0;
var g_PosLeftRightY = 0;
var g_PosReturnX = 0;
var g_PosReturnY = 0;
var g_Radius = 0;
var g_UpDown = 0; // -1, 0, 1
var g_LeftRight = 0; // -1, 0, 1
var g_TouchPoints = [];
function MyOnLoad() {
// The Resize code - need to add early due to maximize
addEventListener("resize", MyWindowResize, false);
if ((canv = document.getElementById("mycanvas")) !== null && typeof (canv) !== "undefined") {
canv.addEventListener("mousemove", mycanvasOnMouseMove, false);
canv.addEventListener("mousedown", mycanvasOnMouseDown, false);
canv.addEventListener("mouseup", mycanvasOnMouseUp, false);
canv.addEventListener("touchstart", mycanvasOnTouchStart, false);
canv.addEventListener("touchmove", mycanvasOnTouchMove, false);
canv.addEventListener("touchend", mycanvasOnTouchEnd, false);
canv.addEventListener("touchcancel", mycanvasOnTouchCancel, false);
}
// Prevent scrolling when touching the canvas
// Stops all mouse events as well
document.body.addEventListener("touchstart", function (e) {
if (g_StopTouchAndMouseFiringTwice && e.target.id === "mycanvas") {
e.preventDefault();
}
}, false);
document.body.addEventListener("touchend", function (e) {
if (g_StopTouchAndMouseFiringTwice && e.target.id === "mycanvas") {
e.preventDefault();
}
}, false);
document.body.addEventListener("touchmove", function (e) {
if (g_StopTouchAndMouseFiringTwice && e.target.id == "mycanvas") {
e.preventDefault();
}
}, false);
Layout();
setTimeout("Animate();", 50);
}
function Layout() {
var width, height;
width = $(window).width();
height = $(window).height();
var widthDoc = $(document).width(), heightDoc = $(document).height();
$("#divCanvas").css("overflow-x", "hidden");
$("#divCanvas").css("overflow-y", "hidden");
$("#divCanvas").width(width);
$("#divCanvas").height(height);
$("#mycanvas").css("overflow-x", "hidden");
$("#mycanvas").css("overflow-y", "hidden");
$("#mycanvas").width(width);
$("#mycanvas").height(height);
mycanvas.width = width;
mycanvas.height = height;
var buffer;
g_Radius = Math.floor(0.2 * Math.min(width, height));
buffer = Math.floor(1.1 * g_Radius);
g_PosUpDownX = width - buffer;
g_PosUpDownY = height - buffer;
g_PosLeftRightX = buffer;
g_PosLeftRightY = height - buffer;
g_PosReturnX = buffer;
g_PosReturnY = buffer;
}
function Animate() {
var border = 20, borderX2 = 2 * border, piX2 = 2 * Math.PI;
var i, start;
var width, height;
var c = document.getElementById("mycanvas");
var ctx = c.getContext("2d");
width = c.width;
height = c.height;
SetUpDownLeftRight();
ctx.fillStyle = "#FF0000";
ctx.fillRect(0, 0, width, height);
ctx.fillStyle = "#00FF00";
ctx.fillRect(border, border, width - borderX2, height - borderX2);
for (i = 0; i < 2; i++) {
start = i === 0 ? 0 : Math.PI;
ctx.fillStyle = ((i === 0 && g_UpDown < 0) || (i === 1 && g_UpDown > 0)) ? (Math.abs(g_UpDown) > 1 ? "#FFFFFF" : "#00FFFF") : "#0000FF";
ctx.beginPath();
ctx.arc(g_PosUpDownX, g_PosUpDownY, g_Radius, start, start + Math.PI);
ctx.closePath();
ctx.fill();
//ctx.closePath();
}
for (i = 0; i < 2; i++) {
start = i === 0 ? (0.5 * Math.PI) : (1.5 * Math.PI);
ctx.fillStyle = ((i === 0 && g_LeftRight < 0) || (i === 1 && g_LeftRight > 0)) ? (Math.abs(g_LeftRight) > 1 ? "#FFFFFF" : "#00FFFF") : "#0000FF";
ctx.beginPath();
ctx.arc(g_PosLeftRightX, g_PosLeftRightY, g_Radius, start, start + Math.PI);
ctx.closePath();
ctx.fill();
//ctx.closePath();
}
//ctx.fillStyle = "#0000FF";
//ctx.beginPath();
//ctx.arc(g_PosReturnX, g_PosReturnY, g_Radius, 0, 2 * Math.PI);
//ctx.closePath();
//ctx.fill();
////ctx.closePath();
setTimeout("Animate();", 50);
};
function SetUpDownLeftRight() {
var i, len, xDist, yDist, rXr;
g_LeftRight = 0
g_UpDown = 0;
rXr = g_Radius * g_Radius;
for (i = 0, len = g_TouchPoints.length; i < len; i++) {
xDist = g_TouchPoints[i].clientX - g_PosUpDownX;
yDist = g_TouchPoints[i].clientY - g_PosUpDownY;
if ((xDist * xDist + yDist * yDist) < rXr) {
// Do the + so see if multiple ones
g_UpDown += yDist < 0 ? 1 : -1; // Up is in the negative y direction
}
xDist = g_TouchPoints[i].clientX - g_PosLeftRightX;
yDist = g_TouchPoints[i].clientY - g_PosLeftRightY;
if ((xDist * xDist + yDist * yDist) < rXr) {
// Do the + so see if multiple ones
g_LeftRight += xDist > 0 ? 1 : -1;
}
}
}
function MyWindowResize(e) {
Layout();
};
function MyButton() {
var el;
if ((el = document.getElementById("divMain")) !== null && typeof (el) !== "undefined") {
el.style.display = "none";
}
if ((el = document.getElementById("divCanvas")) !== null && typeof (el) !== "undefined") {
el.style.display = "block";
Layout();
}
}
function mycanvasOnMouseMove(e) {
var found;
var i, len = g_TouchPoints.length;
//// Only add it if it is already there
//for (i = len - 1, found = false; i >= 0; i--) {
// if (g_TouchPoints[i].identifier === -1) {
// if (!found) {
// found = true;
// g_TouchPoints[i].clientX = e.clientX;
// g_TouchPoints[i].clientY = e.clientY;
// } else {
// g_TouchPoints.splice(i, 1);
// }
// }
//}
//if (!found) g_TouchPoints.push({ identifier: -1, clientX: 0, clientY: 0 });
// Only update it if it is already there
for (i = len - 1, found = false; i >= 0; i--) {
if (g_TouchPoints[i].identifier === -1) {
if (!found) {
found = true;
g_TouchPoints[i].clientX = e.clientX;
g_TouchPoints[i].clientY = e.clientY;
} else {
g_TouchPoints.splice(i, 1);
}
}
}
};
function mycanvasOnMouseDown(e) {
var i, len = g_TouchPoints.length;
// Remove any previous
for (i = len - 1; i >= 0; i--) {
if (g_TouchPoints[i].id === -1) {
g_TouchPoints.splice(i, 1);
}
}
g_TouchPoints.push({ identifier: -1, clientX: e.clientX, clientY: e.clientY });
};
function mycanvasOnMouseUp(e) {
var i, len = g_TouchPoints.length;
for (i = len - 1; i >= 0; i--) {
if (g_TouchPoints[i].identifier === -1) {
g_TouchPoints.splice(i, 1);
}
}
};
function touchesRedo(e) {
var i, len;
g_TouchPoints.length = 0; // Also gets rid of mouse ones
for (i = 0, len = e.touches.length; i < len; i++) {
g_TouchPoints.push({ identifier: e.touches[i].identifier, clientX: e.touches[i].clientX, clientY: e.touches[i].clientY });
}
}
function mycanvasOnTouchStart(e) {
touchesRedo(e);
};
function mycanvasOnTouchMove(e) {
touchesRedo(e);
};
function mycanvasOnTouchEnd(e) {
touchesRedo(e);
};
function mycanvasOnTouchCancel(e) {
touchesRedo(e);
};
</script>
</body>
</html>
主 Activity .java
package touchscreen.com.touchscreentest;
import android.os.Build;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.WindowManager;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
WebView webview = (WebView) findViewById(R.id.webView);
WebSettings settings = webview.getSettings();
settings.setJavaScriptEnabled(true);
webview.setWebChromeClient(new WebChromeClient());
webview.loadUrl("file:///android_asset/www/index.html?IsAndroidWebview=true"); // This is a cheat to tell the html we are calling in AndroidApp
// These things allegedly make it faster
settings.setLoadWithOverviewMode(true);
settings.setUseWideViewPort(true);
settings.setSupportZoom(true);
settings.setBuiltInZoomControls(false);
//settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
settings.setCacheMode(WebSettings.LOAD_NO_CACHE);
settings.setDomStorageEnabled(true);
webview.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
webview.setScrollbarFadingEnabled(true);
// NEW FOR Sound
settings.setAllowFileAccess(true);
if (Build.VERSION.SDK_INT > 17) {
settings.setMediaPlaybackRequiresUserGesture(false);
}
// NEW FOR Sound
settings.setAllowContentAccess(true);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
webview.setLayerType(View.LAYER_TYPE_HARDWARE, null);
} else {
webview.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}
}
}
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="touchscreen.com.touchscreentest">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
/* The android:configChanges="orientation|screenSize"
is needed to stop the program from reloading on an orientation change */
<activity android:name=".MainActivity" android:configChanges="orientation|screenSize">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
最佳答案
正如问题中提到的,我设法回答了它。
我已经设法摆脱了嗡嗡声。它被称为触觉反馈。您可以通过将以下代码行放在我的 onCreate
的末尾来删除它功能:webview.setHapticFeedbackEnabled(false);
.
我现在发现第一次触摸检查缩放和东西时有 300 毫秒的延迟。这可以通过将以下内容放入 html 文件的部分来关闭:<meta name="viewport" content="width=device-width, user-scalable=no" />
.
关于android - 使触摸屏立即响应 Html 查看器并停止 Android 在触摸屏上的振动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55550042/
我这里有这样的 slider :https://jsfiddle.net/args91L4/我如何让它在触摸屏上工作,更准确地说,在 vanilla js 或纯 jquery 上没有第三方插件的方式是
我正在使用 HP 触摸屏台式计算机开发一个简单的网站。我想防止用户同时用八个手指“捣碎”屏幕点击。 jQuery 有没有办法一次只允许注册一个触摸事件?这样,当第一个手指点击屏幕时,即注册了该手指,并
我有一个 Web 应用程序,需要有在自助服务终端样式、仅触摸屏环境中使用的选项。我想知道是否有任何我们可以使用的基于浏览器的好键盘。可能是基于 javascript 或 jquery 的东西。基本上,
我有一个 div,它在桌面浏览器上滚动得很好,但在带有触摸屏的移动设备上,滚动不起作用。 这是一个stripped down jsFiddle带有一些实际代码。滚动在您的移动浏览器中运行良好,但请相信
我有一台装有 Windows 7 的触摸屏电脑,我想禁用多点触控手势: 但即使我禁用它并应用更改,当我重新打开窗口时,该选项也会再次启用... 知道在哪里可以永久禁用它吗? (也许在注册表中...)
在移动设备(触摸屏)上缩放后,Highmap 数据点单击事件中断有什么建议吗? 最佳答案 tooltip.pointFormatter 与 useHTML 结合使用仍然期望一个字符串作为返回值,因此应
我正在用Java(使用Swing)为自动机开发一个基于触摸屏的应用程序,例如this 。由于操作系统会处理所有触摸事件,因此我只需开发一个桌面应用程序并在触摸设备上使用它即可。 如果有人可以帮助我,我
我会尽可能清楚地描述我的问题。我正在尝试让触摸屏设备与 Android 一起工作。该设备是一个 USB 设备,我让它在各种操作系统(Windows、Mac OS X、Ubuntu)中正常工作。在 An
我们有一个在 Win 7 上运行的 WPF 应用程序。在 Win 7 中启用触摸手势,当滚动 ListView 时,应用程序在到达列表末尾时在屏幕上“耸耸肩”。 这也可以在 Internet Expl
我需要在我的 Android 设备上禁用和启用触摸屏。我试过了 adb shell su rm -rf /dev/input/event2 和 adb shell su rm -rf /dev/inp
我有一台运行 Windows 10 的 PiPo x9(触摸屏)。Google Chrome 已加载,可以正确查看网页。通过 CefBrowser 加载的同一页面对鼠标事件做出奇怪的响应。我使用的是
我有一台运行 Windows 10 的 PiPo x9(触摸屏)。Google Chrome 已加载,可以正确查看网页。通过 CefBrowser 加载的同一页面对鼠标事件做出奇怪的响应。我使用的是
希望有人能帮我解决这个问题,为此我苦苦挣扎了一会儿。我需要为触摸设备上的最终用户提供“单击”下拉菜单以显示子菜单项的能力。就桌面体验而言,这显然是一种常见的 UX 构造,但对于移动或触摸设备而言,它并
我在这个网站上有一个菜单,它在标准 Windows 8.1 PC 上的 chrome 上运行正常,但在带有触摸屏的 Windows 8.1 笔记本电脑上的 chrome 上查看时出现奇怪的问题。 子菜
我正在用 Java 开发一个 Swing 应用程序。该程序将在专用的 Windows 7 触摸屏机器上运行,据我所知,在正常操作下,该程序应该是唯一在这些机器上运行的东西。 我注意到 Windows
目前我正在 STM32f4 板上开发 USB 触摸屏 HID 描述符(自定义 HID 描述符)。为此,我为单个联系人标识符(单手指触摸)实现了一个 HID 描述符,它对我有用。但是,我的要求是多点触摸
大家早上好。 我买了一个集成了电阻式触摸屏的液晶嵌入式显示器。TS 可通过 USB 连接。 我已将其连接到运行 Android 4.0.3 的设备,并且触摸被正确识别为外部 HID。问题:点击(按下)
我想知道是否可以在 microsoft Surface 触摸屏(例如 Samsung SUR40 不是 Surface 平板电脑)又名 pixelsense ? 我在互联网上搜索了一整天,但找不到任何
最近我正在开发基于谷歌地图的网站。它适用于大多数设备,但是当我在 MS Surface 触摸屏上安装 Chrome 浏览器后,我无法用手指捏合和缩放谷歌地图。但我可以使用 Chrome 浏览器在map
我是一名优秀的程序员,十分优秀!