Hãy xem xét việc bỏ rơi xin vui lòng (để hiểu rõ hơn về vấn đề của tôi). MotionEvent.ACTION_UP không được gọi là
Như bạn thấy, tôi đang xem xét chế độ xem danh sách được bao quanh bởi đệm. Bây giờ, nếu người dùng nhấn một mục listview, như là hành động tôi đã cung cấp nó màu nền xanh nhạt. Bây giờ, ứng dụng của tôi đang đối phó với sự kiện onTouch bản thân để xác định hành động như
- Bấm
- Trái sang Phải Swipe
- Quyền Left Swipe
Đây là mã của tôi.
public boolean onTouch(View v, MotionEvent event) {
if(v == null)
{
mSwipeDetected = Action.None;
return false;
}
switch (event.getActionMasked()) {
case MotionEvent.ACTION_DOWN: {
downX = event.getRawX();
downY = event.getRawY();
mSwipeDetected = Action.Start;
// Find the child view that was touched (perform a hit test)
Rect rect = new Rect();
int childCount = listView.getChildCount();
int[] listViewCoords = new int[2];
listView.getLocationOnScreen(listViewCoords);
int x = (int) event.getRawX() - listViewCoords[0];
int y = (int) event.getRawY() - listViewCoords[1];
View child;
for (int i = 0; i < childCount; i++) {
child = listView.getChildAt(i);
child.getHitRect(rect);
if (rect.contains(x, y)) {
mDownView = child;
break;
}
}
return false; // allow other events like Click to be processed
}
case MotionEvent.ACTION_MOVE: {
upX = event.getRawX();
upY = event.getRawY();
float deltaX=0,deltaY=0;
deltaX = downX - upX;
deltaY = downY - upY;
if(deltaY < VERTICAL_MIN_DISTANCE)
{
setTranslationX(mDownView, -(deltaX));
setAlpha(mDownView, Math.max(0f, Math.min(1f, 1f - 2f * Math.abs(deltaX)/listView.getWidth())));
return false;
}
else
{
forceBringBack(v);
}
return false;
}
case MotionEvent.ACTION_UP:
{
stopX = event.getX();
float stopValueY = event.getRawY() - downY;
float stopValue = stopX - downX;
if(!mDownView.isPressed())
{
forceBringBack(mDownView);
return false;
}
boolean dismiss = false;
boolean dismissRight = false;
if(Math.abs(stopValue)<10)
{
mSwipeDetected = Action.Start;
}
else
{
mSwipeDetected = Action.None;
}
String log = "";
Log.d(log, "Here is Y" + Math.abs(stopValueY));
Log.d(log, "First Comparison of Stop Value > with/4" + (Math.abs(stopValue) > (listView.getWidth() /4)));
Log.d(log, "Second Comparison " + (Math.abs(stopValueY)<VERTICAL_MIN_DISTANCE));
Log.d(log, "Action Detected is " + mSwipeDetected + " with Stop Value " + stopValue);
if((Math.abs(stopValue) > (listView.getWidth() /4))&&(Math.abs(stopValueY)<VERTICAL_MIN_DISTANCE))
{
dismiss = true;
dismissRight = stopValue > 0;
if(stopValue>0)
{
mSwipeDetected = Action.LR;
}
else
mSwipeDetected = Action.RL;
}
Log.d(log, "Action Detected is " + mSwipeDetected + " with Stop Value after dissmiss" + stopValue);
if(dismiss)
{
if(dismissRight)
mSwipeDetected = Action.LR;
else
mSwipeDetected = Action.RL;
animate(mDownView)
.translationX(dismissRight ? listView.getWidth() : - listView.getWidth())
.alpha(0)
.setDuration(mAnimationTime)
.setListener(new AnimatorListenerAdapter() {
public void onAnimationEnd(Animator animation)
{
}
});
}
else
{
animate(mDownView)
.translationX(0)
.alpha(1)
.setDuration(mAnimationTime)
.setListener(null);
}
break;
}
}
return false;
}
Như bạn có thể thấy, tôi xác định hành động được thực hiện trong MotionEvent.ACTION_UP và đặt giá trị của Hành động Enum cho phù hợp. Logic này hoạt động như một nét duyên dáng nếu người dùng không vượt qua ranh giới xem danh sách.
Bây giờ, nếu người dùng, trong khi trượt (hoặc cụ thể), di chuyển ngón tay dọc theo mục danh sách di chuyển từ màu xanh sang màu cam, MotionEvent.ACTION_UP sẽ không được cung cấp cho chế độ xem danh sách, khiến mã của tôi không đưa ra quyết định và do phương thức translationX() và setAlpha(), vì không có Hành động nào được xác định trong trường hợp này, mục danh sách cụ thể đó sẽ trống.
Sự cố không dừng lại ở đây, vì tôi không tăng lượt xem mỗi lần, cùng một dòng dịch() được tăng cao mỗi lần dẫn đến nhiều lần xảy ra mục danh sách trống/trắng.
Có bất kỳ điều gì có thể thực hiện được mà ngay cả khi tôi không gặp phải MotionEvent.ACTION_UP, tôi vẫn có thể thực hiện một số quyết định không?
Cảm ơn.
xem nếu điều này giải quyết câu hỏi của bạn: http://stackoverflow.com/questions/13283827/onintercepttouchevent-only-gets-action-down – user123321