【发布时间】:2012-01-01 16:10:09
【问题描述】:
我在 SO 上阅读了一些关于此主题的问题,但还没有真正找到可靠的答案。
我有一个框架布局,可以在其上堆叠多个自定义视图,但是 onTouch 事件仅适用于顶视图。 (自定义view都是同一个view,同一个onTouch事件,只是多个)
框架布局
- customView[2]
- 自定义视图[1]
- customView[0]
我正在 Android 2.2 上对其进行测试,我想知道下面的其他视图是否有任何方法可以知道触摸发生的位置?
编辑(添加一些代码)
我正在添加一些代码,希望能帮助解释我遇到问题的地方。起初我只是自动让onTouchEvent 返回真。这使得最后一个视图(在我的情况下为 customerView[2])将是唯一生成值的视图。
但是,一旦我添加了将onTouchEvent 设置为返回真或假的方法,现在返回生成值的唯一视图是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]);
}
}
}
我的看法:
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 view touch-event android-framelayout