Я прочитал несколько вопросов по этой теме на SO, но на самом деле не нашел на него твердого ответа.
У меня есть макет фрейма, на который я складываю несколько пользовательских представлений, однако событие onTouch работает только с видом сверху. (все настраиваемые представления - это одно и то же представление с одним и тем же событием onTouch, только несколько из них)
FrameLayout
Я тестирую его на Android 2.2, и мне интересно, есть ли способ для других представлений ниже узнать, где произошло касание?
РЕДАКТИРОВАТЬ (Добавление кода)
Я добавляю код, чтобы, надеюсь, помочь объяснить, где я сталкиваются с проблемами. Сначала у меня просто автоматически onTouchEvent
возвращалось значение true. Это сделало так, что последнее представление (в моем случае 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;
}
}