我的这个view是一个TextureView它里面重写了public boolean onTouchEvent(MotionEvent event) { Log.e("setControlable", "onTouchEvent"); if (this.bControl) { return SimSendUDP.getInstance().onTouch((int)rawx, (int)rawy, event, this.controlIp, this.controlPort); } else { return super.onTouchEvent(event); } }方法
时间: 2024-03-13 11:43:51 浏览: 12
在 TextureView 中重写 onTouchEvent 方法并在其中处理触摸事件是一个常见的做法。在你的代码中,你处理了 onTouchEvent 事件并通过判断 bControl 来决定是否调用 SimSendUDP 的 onTouch 方法。
在移除 TextureView 时,如果 onTouchListener 仍然在执行,可能是因为 onTouch 事件正在处理动作。你可以尝试通过设置 bControl 为 false 来停止处理 onTouch 事件,例如:
```
// 停止处理 onTouch 事件
this.bControl = false;
// 移除 TextureView
parentView.removeView(textureView);
```
这样可以确保 onTouch 事件不会继续执行。如果问题仍然存在,可能需要检查代码中是否有其他地方在使用该 onTouchListener 对象,或者该对象是否被其他 View 引用。
相关问题
重写recyclerview中ontouchevent
我不知道具体情况,但是重写 RecyclerView 中的 onTouchEvent 通常是为了实现一些特殊的触摸行为,比如滑动删除、拖拽排序等。以下是可能的一些代码实现:
1. 滑动删除
```
@Override
public boolean onTouchEvent(MotionEvent e) {
switch (e.getAction()) {
case MotionEvent.ACTION_DOWN:
mIsSwiping = false;
mDownX = e.getX();
mDownY = e.getY();
return super.onTouchEvent(e);
case MotionEvent.ACTION_MOVE:
float dx = e.getX() - mDownX;
float dy = e.getY() - mDownY;
if (Math.abs(dx) > mTouchSlop && Math.abs(dy) < mTouchSlop) {
mIsSwiping = true;
int position = getChildAdapterPosition(findChildViewUnder(e.getX(), e.getY()));
if (position != RecyclerView.NO_POSITION) {
mSwipePosition = position;
}
}
return super.onTouchEvent(e);
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
if (mIsSwiping) {
if (dx > 0) {
// swiped right, perform delete action
mAdapter.deleteItem(mSwipePosition);
} else {
// swiped left, reset item view
mAdapter.notifyItemChanged(mSwipePosition);
}
mIsSwiping = false;
mSwipePosition = RecyclerView.NO_POSITION;
return true;
}
return super.onTouchEvent(e);
}
return super.onTouchEvent(e);
}
```
2. 拖拽排序
```
@Override
public boolean onTouchEvent(MotionEvent e) {
switch (e.getAction()) {
case MotionEvent.ACTION_DOWN:
mDragPosition = getChildAdapterPosition(findChildViewUnder(e.getX(), e.getY()));
if (mDragPosition != RecyclerView.NO_POSITION) {
mDraggedViewHolder = getChildViewHolder(findChildViewUnder(e.getX(), e.getY()));
mDragStartX = mDraggedViewHolder.itemView.getX();
mDragStartY = mDraggedViewHolder.itemView.getY();
mDragStartTouchX = e.getX();
mDragStartTouchY = e.getY();
if (mItemTouchHelper != null) {
mItemTouchHelper.startDrag(mDraggedViewHolder);
}
}
return super.onTouchEvent(e);
case MotionEvent.ACTION_MOVE:
return mDraggedViewHolder != null && mItemTouchHelper != null && mItemTouchHelper.onTouchEvent(e);
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
if (mDraggedViewHolder != null) {
mDraggedViewHolder.itemView.animate().x(mDragStartX).y(mDragStartY).setDuration(150).start();
mDraggedViewHolder = null;
mDragPosition = RecyclerView.NO_POSITION;
return true;
}
return super.onTouchEvent(e);
}
return super.onTouchEvent(e);
}
```
Android onTouchEvent中指定某一个控件之外的区域点击事件
在 Android 中,如果您想拦截除了某个指定控件之外的区域的点击事件,可以通过以下方法实现:
1. 在 `onTouchEvent` 方法中判断点击的位置是否在指定控件之外的区域。如果是,则处理该事件并返回 `true` 表示已经处理完毕;否则返回 `super.onTouchEvent(event)`,让事件继续向下传递。
```java
@Override
public boolean onTouchEvent(MotionEvent event) {
if (!isTouchInsideView(event, mTargetView)) {
// 处理指定控件之外的事件
return true;
}
return super.onTouchEvent(event);
}
```
其中,`isTouchInsideView` 方法用于判断点击的位置是否在指定控件之内。
```java
private boolean isTouchInsideView(MotionEvent event, View view) {
int[] location = new int[2];
view.getLocationOnScreen(location);
int x = location[0];
int y = location[1];
int width = view.getWidth();
int height = view.getHeight();
return event.getRawX() >= x && event.getRawX() <= x + width
&& event.getRawY() >= y && event.getRawY() <= y + height;
}
```
2. 在自定义的 `ViewGroup` 中,重写 `onInterceptTouchEvent` 方法,根据点击的位置是否在指定控件之外的区域,判断是否需要拦截事件。如果需要拦截事件,则返回 `true`;否则返回 `super.onInterceptTouchEvent(event)`,让事件继续向下传递。
```java
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
if (!isTouchInsideView(event, mTargetView)) {
// 处理指定控件之外的事件
return true;
}
return super.onInterceptTouchEvent(event);
}
```
需要注意的是,如果您拦截了指定控件之外的区域的点击事件,可能会影响用户的体验,因此建议仅在必要时使用此功能。