- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我在我的 MainActivity.class
中使用了一个 onTouchEvent
。它工作正常:如果用户用手指做一个双 L,我称之为 fragment 。我想在另一个 Activity
中使用此 onTouchEvent
,但我认为如果我复制我的所有代码,它会很脏。
现在我为此创建了一个工具 TouchListenerImpl
:
class TouchListenerImpl implements View.OnTouchListener {
private boolean movingDownL, movingDownR, movingLeft, movingRight, movingSuccessL, movingSuccessR = false;
private Point oldCoordsL, oldCoordsR, startPointL, startPointR = new Point(0, 0);
private boolean admin_touch = false;
private OnLTouch callback;
void setCallback(OnLTouch c) {
callback = c;
}
interface OnLTouch {
void lTouchSuccess();
}
@Override
public boolean onTouch(View v, MotionEvent event) {
Log.d("debugTouch", "onTouch");
int pIndexL = event.findPointerIndex(event.getPointerId(0));
int pIndexR = 0;
if(event.getPointerCount() > 1) pIndexR = event.findPointerIndex(event.getPointerId(1));
if(event.getPointerCount() > 1 && event.getX(pIndexL) > event.getX(pIndexR)) {
int tmp = pIndexR;
pIndexR = pIndexL;
pIndexL = tmp;
}
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
movingDownL = true;
movingDownR = true;
movingSuccessL = false;
movingSuccessR = false;
if(event.getPointerCount() > 1) {
startPointR = new Point((int) event.getX(pIndexR), (int) event.getY(pIndexR));
oldCoordsR = new Point((int) event.getX(pIndexR), (int) event.getY(pIndexR));
}
startPointL = new Point((int) event.getX(pIndexL), (int) event.getY(pIndexL));
oldCoordsL = new Point((int) event.getX(pIndexL), (int) event.getY(pIndexL));
break;
case MotionEvent.ACTION_MOVE:
int downMinDistance = 300;
int lnrInaccuracy = 10;
int downInaccuracy = 30;
if(event.getPointerCount() > 1) {
if(!movingDownR) {
if(Math.abs(oldCoordsR.x - event.getX(pIndexR)) < downInaccuracy &&
oldCoordsR.y < event.getY(pIndexR)) break;
if(Math.abs(oldCoordsR.y - event.getY(pIndexR)) < lnrInaccuracy &&
oldCoordsR.x > event.getX(pIndexR) && !movingRight) {
movingRight = true;
startPointR = new Point(new Point((int)event.getX(pIndexR), (int)event.getY(pIndexR)));
}
} else {
if (Math.abs(oldCoordsR.x - event.getX(pIndexR)) > downInaccuracy ||
oldCoordsR.y < event.getY(pIndexR)) {
movingDownR = false;
break;
} else if(findDistance(startPointR,
new Point((int)event.getX(pIndexR), (int)event.getY(pIndexR))) >= downMinDistance){
movingDownR = false;
}
}
}
if(!movingDownL) {
if(Math.abs(oldCoordsL.x - event.getX(pIndexL)) < downInaccuracy &&
oldCoordsL.y < event.getY(pIndexL)) break;
if(Math.abs(oldCoordsL.y - event.getY(pIndexL)) < lnrInaccuracy &&
oldCoordsL.x < event.getX(pIndexL) && !movingLeft) {
movingLeft = true;
startPointL = new Point(new Point((int)event.getX(pIndexL), (int)event.getY(pIndexL)));
}
}else {
if (Math.abs(oldCoordsL.x - event.getX(pIndexL)) > downInaccuracy ||
oldCoordsL.y > event.getY(pIndexL)) {
movingDownL = false;
break;
} else if(findDistance(startPointL,
new Point((int)event.getX(pIndexL), (int)event.getY(pIndexL))) >= downMinDistance){
movingDownL = false;
}
}
int lnrMinDistance = 50;
if(movingLeft) {
if (Math.abs(oldCoordsL.y - event.getY(pIndexL)) > lnrInaccuracy ||
oldCoordsL.x > event.getX(pIndexL)) {
movingLeft = false;
break;
} else if(findDistance(startPointL,
new Point((int)event.getX(pIndexL), (int)event.getY(pIndexL))) >= lnrMinDistance) {
movingLeft = false;
movingSuccessL = true;
}
}
if(movingRight) {
if (Math.abs(oldCoordsR.y - event.getY(pIndexR)) > lnrInaccuracy ||
oldCoordsR.x < event.getX(pIndexR)) {
movingRight = false;
break;
} else if(findDistance(startPointR,
new Point((int)event.getX(pIndexR), (int)event.getY(pIndexR))) >= lnrMinDistance) {
movingRight = false;
movingSuccessR = true;
}
}
if(movingSuccessL && movingSuccessR) {
if (!admin_touch)
{
admin_touch = true;
if (callback != null)
callback.lTouchSuccess();
}
}
oldCoordsL = new Point((int)event.getX(pIndexL), (int)event.getY(pIndexL));
oldCoordsR = new Point((int)event.getX(pIndexR), (int)event.getY(pIndexR));
break;
case MotionEvent.ACTION_UP:
movingDownL = false;
movingDownR = false;
movingLeft = false;
movingRight = false;
break;
default:
return false;
}
return true;
}
private double findDistance(Point p1, Point p2) {
return Math.sqrt(Math.pow(p1.x - p2.x, 2) + Math.pow(p1.y - p2.y, 2));
}
}
在我的 Activity 中,我这样调用该工具:
public class MainActivity extends AppCompatActivity implements View.OnTouchListener {
TouchListenerImpl imp = new TouchListenerImpl();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imp.setCallback(new TouchListenerImpl.OnLTouch() {
@Override
public void lTouchSuccess() {
Log.d("debugTouch", "WORKING !");
}
});
}
@Override
public boolean onTouch(View v, MotionEvent event) {
Log.d("debugTouch", "onTouch");
return imp.onTouch(v, event);
}
}
问题是我从不在我的日志中输入。它根本不起作用...
最佳答案
您可以使用 @DrilonBlakqori 解决方案,稍作修改。
制作一个包含通用代码的单独类,但使用回调使 View
可见。
class TouchListenerImpl implements OnTouchListener {
private OnLTouch callback;
@Override
public boolean onTouch(View v, MotionEvent event) {
// all your code
...
if (callback != null)
callback.lTouchSuccess();
...
}
void setCallback(OnLTouch c) {
callback = c;
}
interface OnLTouch {
void lTouchSuccess();
}
}
在您的 MainActivity
中,创建 TouchListenerImpl
和 setCallback
的新实例
TouchListenerImpl imp = new TouchListenerImpl();
imp.setCallback(new OnLTouch() {
public void lTouchSuccess() {
frameLayoutAdmin.setVisibility(View.VISIBLE);
getSupportFragmentManager().beginTransaction()
.replace(R.id.framelayout_admin,new AdminLoginFragment())
.commit();
img_close.setVisibility(View.VISIBLE);
}
});
并且在 MainActivity
中,您要在 View
集合上检测 double L 的 View
View
上的此监听器。
view.setOnTouchListener(imp);
我假设您想在主布局上检测double L。为此你可以做
findViewById(R.id.mylayout).setOnTouchListener(imp);
希望这能解决您的问题。
关于android - 在各种 Activity 中使用相同的 onTouchEvent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42232409/
我有一个自定义布局捏缩放代码作为父布局和一个处理点击功能的子布局。因此我使用了触摸拦截,但问题是它不知道什么时候点击或拖动。 @Override public boolean onInter
我正在制作一个简单逻辑电路的单屏应用程序。我正在使用 onTouchEvent 来处理用户交互。我现在正在使用 ACTION_UP、ACTION_MOVE 和 ACTION_DOWN,但这只允许我使用
我为 Android 创建了一个非常简单的乒乓应用程序。 看起来不错,但我有一个问题: 我尝试执行 onScreenTouch 事件,以便将 Racket 放置在用户的触摸位置。 我的问题是 - 在哪
我目前正在开发我的第一个多点触控 Android 应用程序,但在使用 onTouchEvent() 时遇到了一些困难。我使用了在线教程中的一些代码,这似乎为我提供了屏幕上每次触摸的正确指针 ID 信息
以下:https://developer.android.com/training/gestures/movement.html 用于处理onTouchEvent中的移动。我的问题是,即使按照链接的教
除了public class MySurfaceView extends SurfaceView Implements SurfaceHolder.Callback之外,是否可以在类中创建 OnTou
我正在尝试创建一个子类来扩展和覆盖 onTouchEvent 方法。但是,我无法这样做,因为我不完全确定如何去做。 我可以将重写放在扩展 Activity 的公共(public)类中,还是必须是扩展
My full code here 我正在学习 Android 开发,并且正在尝试创建一个简单的单词搜索游戏。首先,我创建了一个 LetterTile 类,它代表屏幕上的一个字母,这个类有自己绘制的方
我有简单的 Activity : public class MainActivity extends Activity { @Override protected void onCre
我有一个 View v2 扩展了另一个 View v1。父 View v1 有一个 onTouchEvent,但我希望 subview v2 不使用 onTouchEvent。 我在 subview
我在 Android Dialog 中实现了按钮的 onLongClickListener,它使用计时器自动减少数字。这是代码 myIncreaseTimer = new Timer(); final
当我运行下面的代码时,一切正常,这是一个简单的应用程序,带有三个可以移动的球... public class dragndrop extends Activity { /** Called w
我正在使用 MapView 创建 Android 应用程序。我需要对用户的触摸事件使用react。我尝试使用 dispatchTouchEvent 在 onTouchEvent 中处理一些操作。但是这
我的第一个布局没有显示任何内容。它上面有一个显示图像的第二个布局。如何将 onTouchEvent 添加到第二个布局?(我问这个是因为 OnTouchEvent 只影响我的第一个布局......)它是
我正在开发 Android 2.1 API 7 应用。 在我的 Activity 中,我添加了 onTouchEvent() 回调来处理 screen touch 事件: public class M
谁能向我解释为什么 onTouchEvent 执行了两次,我怎样才能将它设置为只运行一次?我找不到解释。谢谢。 @Override public void onCreate(Bundle savedI
在我的应用程序中,我需要同时处理移动和点击事件。 点击是一个 ACTION_DOWN Action 、几个 ACTION_MOVE Action 和一个 ACTION_UP Action 的序列。理论
我正在尝试触摸应用程序的区域以在屏幕上放置一个“与”门。因此,当我触摸与门区域,然后再次触摸将其放置在电路上时,门会在我触摸的位置绘制,但一旦我再次触摸,它就会消失。 我使用canvas.drawBi
我有 GraphicView ,它扩展了 SurfaceView 。我需要它来绘制图形。我还需要 onTouchEvent。但问题是......我不知道如何描述它:)这是我的代码: public cl
我正在创建一个 Android 游戏,并且有一个像这样的 onTouchEvent : @Override public boolean onTouchEvent(MotionEvent event
我是一名优秀的程序员,十分优秀!