SOに関するこのトピックに関するいくつかの質問を読みましたが、それに対する確かな答えは実際には見つかりませんでした。
複数のカスタムビューをスタックするフレームレイアウトがありますが、onTouchイベントはトップビューでのみ機能します。(カスタムビューは、同じonTouchイベントを持つすべて同じビューであり、それらの複数だけです)
FrameLayout
- customView [2] <---これは最後に追加されたビューであり、イベントを受信する唯一のビューです
- customView [1]
- customView [0]
私はAndroid2.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]);
}
}
}
私の見解:
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;
}
}