gpt4 book ai didi

android - 是否可以将 onTouchEvent 传递给 Android 中的多个 View ?

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:57:19 25 4
gpt4 key购买 nike

我已经在 SO 上阅读了一些关于这个主题的问题,但还没有真正找到可靠的答案。

我有一个框架布局,我在上面堆叠了多个自定义 View ,但是 onTouch 事件只适用于顶 View 。 (自定义 View 都是具有相同 onTouch 事件的相同 View ,只是其中的多个)

框架布局

  • customView[2] <--- 这是最后添加的 View ,也是唯一接收事件的 View
  • 自定义 View [1]
  • 自定义 View [0]

我正在 Android 2.2 上测试它,想知道下面的其他 View 是否有任何方法可以知道触摸发生的位置?


编辑(添加一些代码)

我正在添加一些代码,希望能帮助解释我遇到问题的地方。起初我只是自动让 onTouchEvent 返回 true。这使得最后一个 View (在我的例子中是 customerView[2])将是唯一生成值的 View 。

但是,一旦我添加了将 onTouchEvent 设置为返回 true 或 false 的方法,现在返回生成值的唯一 View 是 customView[0]

我希望这能解决我的问题。我对此很陌生,感谢您花时间解释它(当然也感谢您的耐心等待)。

另外,我意识到我的 TextView 没有更新每个 touchEvent 的值,我正在努力解决这个问题。

我的 Activity :

public class MyActivity extend Activity {

CustomView[] customView;
TextView[] textView;
int numViews 3;
//FrameLayout and Params created

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

for(int i = 0; i < numViews; i++) {
customView[i] = new CustomView(this, i);


//Allows the onTouch to be handled by all Views - View[0] is the bottom view
if(i == 0) {
customView[i].setTouchBool(true); //set view's onTouch to return true
} else {
customView[i].setTouchBool(false); //set view's onTouch to return false
}

//Set TextView to display the number generated by the CustomView
textView[i].setText(Double.toString(customView[i].getGeneratedNumber()));

//Add views to main layout
frame.addView(textView[i]);
frame.addView(customView[i]);
}
}
}

我的观点:

public class CustomView extends View {

boolean onTouchHandler = true;
int xVal = 0, yVal = 0;
int index;
double generatedNum = 0;

public CustomView(Context context) {
this(context, 0);
this.index = 0;
}

public CustomView(Context context, int index) {
super(context);
this.index = index;
}


@Override
public boolean onTouchEvent(MotionEvent ev) {
final int action = ev.getAction();

switch(action) {
case MotionEvent.ACTION_DOWN: {
//do logic
}

case MotionEvent.ACTION_MOVE: {
//do logic
}

case MotionEvent.ACTION_UP: {
xVal = (int) ev.getX();
yVal = (int) ev.getY();

generateNumber(xVal, yVal, index);

break;
}
}
return onTouchHandler;
}


private void generateNumber(int x, int y, int index) {
if(index == 0) {
generatedNum = (x / 2) * (y / 2) + 64;
} else {
generatedNum = (x / 2) * (y / 2) + (index * 128);
}
}

public double getGeneratedNumber() {
return generatedNum;
}

public boolean setTouchBool(boolean b) {
this.onTouchHandler = b;
}
}

最佳答案

Android 将级联调用 onTouchEvent 的 View ,直到它从其中一个收到 true 。如果您希望所有触摸事件都被处理,则返回 false 直到它到达最后一个。

编辑:

好的。如果我理解正确的话,你有一个顶 View ,其中包含一层深的一堆 subview 。我最初的回答是假设您有三个自定义 View ,它们在 ViewGroup 的层次结构中彼此重叠(View3 是 View2 的子级。View2 是 View1 的子级。View1 是 ParentView 的子级)。您希望将用户在父 View 上的触摸事件发送给它的所有 subview 。

如果是这样的话,AFAIK,Android 的 API 中没有允许这样做的 View 。因此,您必须制作一个执行此操作的自定义 View 。

好吧,我还没有测试过这个,所以请告诉我它是否有效以及它是否是您正在尝试的。创建一个扩展任何对象 frame 的自定义类,然后像这样覆盖 onTouch 方法。

@Override 
public boolean onTouchEvent(MotionEvent ev) {
for(int i = 0; i < this.getChildCount(); i++){
this.getChildAt(i).dispatchTouchEvent(ev);
}
return true;
}

现在,保持与您的自定义 View 相同的逻辑,除了它们都应该返回 false,因为您的父 View 将不会收到 onTouch 事件,除非它们按照我之前的回答中的说明进行操作

注意:使用此实现,用户实际触摸的 subview 将触发两次,因为逻辑将继续触发子触摸事件 -> 返回 false -> 触发父触摸事件 -> 再次触发子触摸事件

关于android - 是否可以将 onTouchEvent 传递给 Android 中的多个 View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8190157/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com