我在iPhone上玩touchstart和touchend事件.我构建了一个具有div的示例页面,如果您触摸它并滚动页面,它应该返回开始和结束位置的y坐标.
jQuery:
var touchStartPos;
$('.theDiv')
.bind('touchstart', function(e){
touchStartPos = e.pageY;
})
.bind('touchend', function(e){
alert(touchStartPos + ' | ' + e.pageY)
})
Run Code Online (Sandbox Code Playgroud)
但是,当我在iPhone上加载该页面时,警报会将两个值都报告为零.有人看到我有什么问题吗?
更新:
我偶然发现了jQuery Mobile项目中的这段代码:https://github.com/jquery/jquery-mobile/issues/734
它的评论突出:
// (in iOS event.pageX and event.pageY are always 0 )
Run Code Online (Sandbox Code Playgroud)
它没有说明为什么会这样,但至少我发现其他人看到了同样的事情.将挖掘该页面上的示例代码以查看解决方案是否存在.
更新II:
好吧,在查看上面链接中的示例代码后,看起来这将返回一个实际值:
e.originalEvent.touches[0].pageY
Run Code Online (Sandbox Code Playgroud)
问题是,我现在意识到这不是我需要的.它将我附加事件的对象触摸区域的Y偏移返回到与HTML文档相关的...而不是浏览器窗口.
我的目标是弄清楚触摸开始的位置和结束位置......然后比较值.如果它们有点不同,那么我们就会进行滑动...而不是触摸.
更新III:
我也找到了这些例子的参考:
e.originalEvent.touches[0].pageX
event.targetTouches[0].pageY
Run Code Online (Sandbox Code Playgroud)
虽然我似乎无法让那些工作.两者都返回未定义的错误.
更新IV:
看起来一种解决方案是跟踪文档本身的offset().我可以将touchend事件应用于文档,然后检查它的偏移量.
这个问题是我的touchend事件将首先触发我页面上的元素,然后它会在文档上触发它(冒泡).因此,在我需要弄清楚如何对象touchend事件之前,我无法确定它是触摸还是滑动.
还在思考这一个......
从API 14开始,您可以SYSTEM_UI_FLAG_HIDE_NAVIGATION在Activity中的View上使用此标志,告诉系统您要隐藏导航栏,直到有用户交互(屏幕触摸).一旦用户点击屏幕,就会显示该栏.
我正在执行此操作的活动在用户触摸屏幕时执行一些操作(启动单独的活动),然后将上述标记添加到我的视图中,这非常有效.
添加该标志后,系统会截取第一个屏幕触摸,并通过显示导航栏对其做出反应.直到第二次触摸,我的任何视图或我的活动才会收到TouchEvents.
有没有人知道我可以设置一个监听器的方式,让我在第一次触摸屏幕时启动我的第二个活动,而不是在使用这个隐藏导航标志时需要双击?
我已经尝试了以下所有内容,当第一次触摸屏幕以显示导航栏时,我没有收到任何回调.
@Override
public void onUserInteraction(){
Log.i(myTag, "INTERACT");
}
@Override
public boolean onGenericMotionEvent(MotionEvent me){
Log.i(myTag, "GENERIC");
return true;
}
//I thought maybe the size change would lead to a callback here. No dice though.
@Override
public void onWindowAttributesChanged(WindowManager.LayoutParams params){
Log.i(myTag, "WINDOW CHANGE");
}
@Override
public boolean dispatchTouchEvent(MotionEvent me){
Log.i(myTag, "TOUCH");
return true;
}
Run Code Online (Sandbox Code Playgroud)
注意:我没有试图阻止导航栏在第一次触摸时显示,我只是想在该事件发生时采取一些其他操作.
我有一个66个视图的网格,如果一个视图被触摸或拖动/移动我想改变它的背景颜色.
我猜我需要在父ViewGroup上放置一个触摸侦听器,但是如何确定拖动/移动哪个子视图?
我决定发布这个问题并回答这个问题的评论:
如何处理子视图中的点击,并触摸父ViewGroups?
我将粘贴评论:
假设我想仅仅为了处理一些孩子而覆盖触摸事件,我可以在这个函数中做些什么让它工作?我的意思是,对于一些孩子来说,它会像往常一样工作,对于一些人来说,父母视图将决定他们是否会接触到触摸事件.
所以问题是这样的:我如何阻止父母onTouchEvent()重写某些子元素onTouchEvent(),同时让它覆盖其他子元素?
我想要做的是绘制一条跟随我的手指的线.我已经创建了一个自定义视图,我有一个onTouchEvent()可行的.
我可以onDraw()毫不费力地在方法中绘制静态线.
当我的手指移动时,我不确定如何画线.
public boolean onTouchEvent(MotionEvent event) {
super.onTouchEvent(event);
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN: {
Log.e(TAG, " - DOWN -");
Log.e(TAG, " getX: " + event.getX());
break;
}
case MotionEvent.ACTION_UP: {
Log.e(TAG, " - UP -");
Log.e(TAG, " getX: " + event.getX());
break;
}
}
return true;
}
Run Code Online (Sandbox Code Playgroud)
你曾经做过一段时间的任何提示可以给出什么?
我是否需要设置坐标onTouchEvent()并不断使视图无效,以便小线段绘制?
最后,我只想用手指在屏幕上进行基本涂鸦,以进行此实验.
我正在学习React JS,截至目前我在源代码,测试或官方文档上找不到任何示例.在文档上,touchStart事件被认为是支持但handleTouchStart不起作用.
我发现的唯一地方和实际工作的例子是反应式触摸项目.
以下代码有效,但这是唯一的绑定方式吗?对我来说,它看起来像是一种廉价的解决方法
var MyHeader = React.createClass({
handleTouchStart: function() {
console.log('handleTouchStart');
},
render: function() {
return this.transferPropsTo(
<header onTouchStart={this.handleTouchStart}>{title}</header>
);
}
};
Run Code Online (Sandbox Code Playgroud)
这样做的实际方法是什么?
上下文:MobileSafari/iPad上的Web应用程序,全屏和嵌入在iframe中
目标:技术,提供自定义事件处理程序按和点击,但不 捏(变焦)或拖动(滚动/锅).我们希望为Press提供自定义行为,但让Safari仍然可以处理滚动/平移/缩放.
问题:这两个目标似乎是相互排斥的.要防止Press手势的默认行为,必须立即响应ontouchstart调用event.preventDefault.但是,要让Drag上的默认行为继续,我们不能在初始ontouchstart上调用event.preventDefault.一旦调用了preventDefault,就无法在该手势序列中恢复默认行为(即直到所有手指都脱落).在发生某些移动之前,无法识别拖动.
拖动被说明是最简单的示例,但我们也关心获取Pinch和Double-tap的默认行为.我们从不想要"复制图像"的默认MobileSafari按行为或选择文本.
到目前为止的尝试:
我们有一套全功能的手势识别器(以Javascript,ontouch*为单位),采用Apple 原生iOS手势识别器的风格.我们没有识别任何手势的问题,我们只是不知道复制Safari免费提供的缩放/平移/双击行为的好方法.
我们不需要代码; 我们正在寻找任何理论解决方案(除了"只是自己实现平移/缩放",但如果你有一种光滑的方式来做我们感兴趣的话),这将导致合理的成功.我们也有兴趣了解其他类似尝试这样做 - 当然我们不可能是第一个尝试这样做的人吗?
备用TL; DR:有没有办法阻止默认按下(也称为点击并保持)而不是触摸开始?
在Android 3.x上有拖放机制的问题:在做了一些拖动(比如30次拖动)之后会产生异常(参见附件链接)
https://groups.google.com/forum/#!msg/android-platform/2APvO248NNY/rKI-5dCT8XcJ (我在日志中收到与该帖子相同的内容..)
android技术人员在那里回答它是API中的错误,并说避免问题的唯一方法是调用垃圾收集器.
我做的.异常没有被抛出,但过了一段时间(比如更多30-40次拖动)android停止从某种原因调用drop事件.
我尝试通过释放所有资源/画布/绘图缓存/回收位图来"刷新"所有视图并重新创建它们并没有帮助(不再抛出异常 - 但仍有一些拖拽掉落事件后'工作)
"帮助"唯一的事情是关闭活动并重新启动它.
有人以某种方式解决了这个问题,或者有一个简单的替代方案??? (旁边实现我自己的拖放功能..)
我想得到解决方案,不会强迫我重新启动或重新创建任何不想要的东西..
这里是演示错误的示例代码(没有演示我在使用System.GC后对drop事件的问题所说的部分):
public class DragandDropExampleActivity extends Activity {
private boolean mIsBeenDragged = false;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final ImageView imageViewToDRag = (ImageView) findViewById(R.id.image_view_to_drag);
imageViewToDRag.setClickable(true);
imageViewToDRag.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
mIsBeenDragged = true;
DragShadowBuilder shadowBuilder = new DragShadowBuilder(imageViewToDRag);
imageViewToDRag.startDrag(null, shadowBuilder, imageViewToDRag, 0);
} else if (event.getAction() == MotionEvent.ACTION_UP) {
mIsBeenDragged = false; …Run Code Online (Sandbox Code Playgroud) android drag-and-drop view touch-event illegalstateexception
视图之间有什么区别onTouchEvent:
public class MyCustomView extends View {
// THIS :
@Override
public boolean onTouchEvent(MotionEvent event) {
return super.onTouchEvent(event);
}
}
Run Code Online (Sandbox Code Playgroud)
及其onTouchListener:
MyCustomView myView = (MyCustomView) findViewById(R.id.customview);
myView.setOnTouchListener(new View.OnTouchListener() {
@Override
public void onClick(View arg0) {
// do something
}
});
Run Code Online (Sandbox Code Playgroud)
要么
public class MyCustomView extends View {
public MyCustomView(Context context, AttributeSet attrs) {
// THIS :
setOnTouchListener(new View.OnTouchListener() {
@Override
public void onClick(View arg0) {
// do something
}
});
}
@Override
public boolean onTouchEvent(MotionEvent event) …Run Code Online (Sandbox Code Playgroud) 我正在开发Android库,需要跟踪使用它的应用程序上的所有触摸事件.现在,用户应该dispatchTouchEvent()在他们的每项活动上覆盖他们的活动.如下所示
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
MyLib.dispatchTouchEvent(event);
return super.dispatchTouchEvent(event);
}
Run Code Online (Sandbox Code Playgroud)
但Appsee使用Appsee.start(“key”);集成在应用程序启动的第一个活动中的onCreate方法检测触摸事件.这怎么可能.任何帮助?
touch-event ×10
android ×7
android-view ×1
drawing ×1
interception ×1
ipad ×1
javascript ×1
jquery ×1
pagey ×1
parent-child ×1
reactjs ×1
view ×1
webkit ×1