我有需要处理onTouch手势和的onclick事件的视图。 什么是实现这一目标的正确方法?
我有一个onTouchListener
和onClickListener
在视图集。 每当我做触摸视图,首先onTouch
事件被触发,后来onClick
。 然而,从onTouch
事件处理我不得不返回无论是true
还是false
。 回到true
意味着事件被消耗,所以android的事件系统将不继续传播事件。
因此, onClick
是永远不会发生的事件,至少我onClick
当我返回监听器被触发从来没有true
在我onTouch
事件处理程序。 在另一方面,返回false
有不是一种选择,因为这防止了onTouch
听者接收任何进一步的事件,为了识别姿势是必要的。 什么是解决这个的通常方式?
在你GestureDetector,你可以调用callOnClick()直接。 注意View.callOnClick API需要API级别15.只要有一个尝试。
// Create a Gesturedetector
GestureDetector mGestureDetector = new GestureDetector(context, new MyGestureDetector());
// Add a OnTouchListener into view
m_myViewer.setOnTouchListener(new OnTouchListener()
{
@Override
public boolean onTouch(View v, MotionEvent event)
{
return mGestureDetector.onTouchEvent(event);
}
});
private class MyGestureDetector extends GestureDetector.SimpleOnGestureListener
{
public boolean onSingleTapUp(MotionEvent e) {
// ---Call it directly---
callOnClick();
return false;
}
public void onLongPress(MotionEvent e) {
}
public boolean onDoubleTap(MotionEvent e) {
return false;
}
public boolean onDoubleTapEvent(MotionEvent e) {
return false;
}
public boolean onSingleTapConfirmed(MotionEvent e) {
return false;
}
public void onShowPress(MotionEvent e) {
LogUtil.d(TAG, "onShowPress");
}
public boolean onDown(MotionEvent e) {
// Must return true to get matching events for this down event.
return true;
}
public boolean onScroll(MotionEvent e1, MotionEvent e2, final float distanceX, float distanceY) {
return super.onScroll(e1, e2, distanceX, distanceY);
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
// do something
return super.onFling(e1, e2, velocityX, velocityY);
}
}
如果你使用onTouchListener
,你不必使用onClickListener
。 在onClickListener
它的作用是让触摸事件,并检查事件动作和检测到点击。 所以,如果你想的时候做了一些工作onClick
。 你能做到这一点的onTouchListener
通过过滤的作用。
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
//this is touch
}
if (event.getAction() == MotionEvent.ACTION_UP) {
//this is click
}
return false;
}
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_MOVE:
layOutParams.x = initialX + (int) (event.getRawX() - initialTouchX);
layOutParams.y = initialY + (int) (event.getRawY() - initialTouchY);
break;
case MotionEvent.ACTION_DOWN:
initialX = layOutParams.x;
initialY = layOutParams.y;
initialTouchX = event.getRawX();
initialTouchY = event.getRawY();
if (initialTouchX == event.getRawX() && initialTouchY == event.getRawY()) {
return false;// to handle Click
}
break;
case MotionEvent.ACTION_UP:
if (initialTouchX == event.getRawX() && initialTouchY == event.getRawY()) {
return false;// to handle Click
}
break;
}
return true;
}
};
isMove = false;
case MotionEvent.ACTION_DOWN:
//Your stuff
isMove = false;
case MotionEvent.ACTION_UP:
if (!isMove || (Xdiff < 10 && Ydiff < 10 ) {
view.performClick; //The check for Xdiff <10 && YDiff< 10 because sometime elements moves a little
even when you just click it
}
case MotionEvent.ACTION_MOVE:
isMove = true;
另一种方法是使用线程。 这是ACTION_DOWN启动一个线程递增计数器。 在Action_UP的情况下:停止/中断线程。 寻找计数器,如果是小于2(说或阈值按您的应用程序)或!isMove然后调用点击功能
我们可以使用基于标记的实现。 其中,刷卡/拖动,我们可以在Action_Up处理,使标志真实和返回相同。 在点击的案例或点击相同的手柄ACTION_DOWN并设置标志为假而归。
touchAndSwipe=false;
switch(e.getAction()){
case MotionEvent.ACTION_MOVE:
break;
case MotionEvent.ACTION_DOWN:
x1 = e.getX();
break;
case MotionEvent.ACTION_UP:
x2 = e.getX();
float diff= x2-x1;
if(Math.abs(delta)>100){
// Swipe
touchAndSwipe=true;
}else{
touchAndSwipe=false;
}
break;
}
return touchAndSwipe;
我已经能够在自定义的键盘,我建立执行的OnClick和OnTouch在一起。 你可以看看这个代码并修改它根据你的情况下,因为你不包括一个代码示例,从工作。
如果您发布代码示例我可以修改我的这个样品来完成您使用相同的结果。 背景决定一切,当涉及到Android发展。 看看这个代码段,看看是否有帮助。 否则,发布自己的样品,我会作出修改和回信。
View DefaultphaseLay() {
LinearLayout mViewFirstPhase = (LinearLayout) getLayoutInflater().inflate(R.layout.layout_default_phase, parent);
ksOne_btn_LiLay = (LinearLayout) mViewFirstPhase.findViewById(R.id.ksOne_btn_LiLay);
ksOne_btn = (Button) mViewFirstPhase.findViewById(R.id.ksOne_btn);
ksOne_btn.setOnClickListener(mCorkyListener);
ksOne_btn.setFocusableInTouchMode(true);
ksOne_btn.setFocusable(true);
ksOne_btn.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
playClick(keyCode);
//v.startAnimation(animScale);
//key_sound.start();
xkeys_lay.setVisibility(View.GONE);
numkeys_lay.setVisibility(View.GONE);
if (Constants.HapticFeedbackConstant) {
myVib.vibrate(Constants.vibration_duration);
}
} else if (event.getAction() == MotionEvent.ACTION_UP) {
ksOne_btn.setFocusable(false); //Check This Added This In Attempt to Kill Selector on Action_Up
//playClick(-100);
//key_sound.pause();
}
return false;
}
});
ChangeKeyBackgroundMehods.initChange_Key_Background(ksOne_btn_LiLay);
ChangeFontStyle.initChange_fontStyle(ksOne_btn, getApplicationContext());
ChangeFont_size.initChange_fontSize(ksOne_btn, getApplicationContext());
这适用于型α或数字输出的情况下,如果事件正在发送或消耗一些其他方面就需要进行修改。
我同意JDX,如果你使用onTouchlistener你不需要使用onclicklistener,反之亦然,如果要触发按钮,图像的事件,或TextView的点击,然后刚刚火onClicklistener。 如果你想一些动画像拖动和旋转,然后使用ontouchlistener来获得表面的坐标感动