Sta*_*ovy 5 android view touch-event android-framelayout
我已经在SO上阅读了关于这个主题的几个问题,但还没有找到一个可靠的答案.
我有一个framelayout,我堆叠多个自定义视图,但onTouch事件只适用于顶视图.(自定义视图与具有相同onTouch事件的所有视图相同,只是其中的多个)
的FrameLayout
我正在Android 2.2上测试它,我想知道下面的其他视图是否有任何方法可以知道触摸发生在哪里?
编辑(添加一些代码)
我正在添加一些代码,以帮助解释我遇到问题的地方.起初我只是自动onTouchEvent返回true.这使得最后一个视图(在我的情况下是customerView [2])将是唯一一个生成值的视图.
但是,一旦我添加了设置onTouchEvent为返回true或false的方法,现在返回生成值的唯一视图是customView [0].
我希望这能解决我所要求的问题.我对此很陌生,我很感谢你花时间解释它(当然我感谢你的耐心等待).
此外,我意识到我的TextView不会更新每个touchEvent的值,我正在努力修复它.
我的活动:
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]);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的看法:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
Dee*_*eeV 15
Android将级联调用onTouchEvent每个视图的视图,直到它true从其中一个接收到.如果您希望所有人都处理触摸事件,则返回false直到它到达最后一个.
编辑:
好.如果我理解正确,你就会有一个顶层视图,其中包含一层深层的子视图.我原来的答案是假设你有三个自定义视图在ViewGroup的层次结构中相互叠加(View3是View2的子视图.View2是View1的子视图.View1是ParentView的子视图).您希望父视图上的用户触摸事件被发送给所有子视图.
如果是这种情况,AFAIK,Android的API中没有允许的视图.所以,你必须制作一个自定义视图.
好的,我没有对此进行过测试,所以请告诉我它是否有效以及它是否正在尝试.创建一个扩展任何对象的自定义类frame,然后覆盖这样的onTouch方法.
@Override
public boolean onTouchEvent(MotionEvent ev) {
for(int i = 0; i < this.getChildCount(); i++){
this.getChildAt(i).dispatchTouchEvent(ev);
}
return true;
}
Run Code Online (Sandbox Code Playgroud)
现在,保持与自定义视图相同的逻辑,除非它们都应该返回,false因为您的父视图不会收到onTouch事件,除非它们按照我之前的回答中的说明执行
注意:使用此实现,用户实际触摸的子视图将触发两次,因为逻辑将触发子触摸事件 - >返回false - >触发父触摸事件 - >再触发子触摸事件
| 归档时间: |
|
| 查看次数: |
14061 次 |
| 最近记录: |