Не удается обнаружить жест на FrameLayout в Android - PullRequest
1 голос
/ 13 января 2012

Я хочу реализовать глобальный виджет NavigationBar в Android, расширяет FrameLayout, чтобы его можно было просто объявить в макете XML, чтобы не включать в каждое действие.

Панель навигации имеет три компонента: логотип, заголовок,Кнопка При нажатии или отклонении на панели навигации (не включая кнопку) я что-то покажу. Но теперь мой жест onFling не может быть обнаружен (OnFling в SwipeGestureListener были протестированы), любой может помочь мне.

Класс NavigationBar:

public class NavigationBarWidget extends FrameLayout implements View.OnClickListener

private SwipeGestureListener mSwipeListener = new SwipeGestureListener();
private GestureDetector mGestureDetector;

NavigationBarWidget ():

mGestureDetector = new GestureDetector(mSwipeListener);
this.setOnTouchListener(new View.OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            Log.v("Nav", "onTouch");

            return mGestureDetector.onTouchEvent(event);
        }
    });

OnClick ():

@Override
public void onClick(View paramView)
{
    if(paramView.getId()== mShareIcon.getId()){
        AlertDialog.Builder builder = new AlertDialog.Builder(this.getContext());
        builder.setMessage("Are you sure you want to exit?")
        .setCancelable(false)
        .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int id) {
            }
        })
        .setNegativeButton("No", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int id) {
                dialog.cancel();
            }
        });
        AlertDialog alert = builder.create();
        alert.show();
    }else{
        Log.v("Nav", "onClick");
    }

}

onFling () в SwipeGestureListener:

@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
    Log.v("Nav", "onFling");
    try {
        if (Math.abs(e1.getX() - e2.getX()) > SWIPE_MAX_OFF_PATH)
        {
            return false;
        }
        else
        {
            if ((e2.getY() - e1.getY() > SWIPE_MIN_DISTANCE) && (Math.abs(velocityY) >   SWIPE_THRESHOLD_VELOCITY)) {
                this.mCallbackListener.onFlingDown();
                return true;
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return false;
}

Logcat: когда панель навигации Touch или Fling Down выдает «onTouch», но жест onFling не обнаруживается.

1 Ответ

1 голос
/ 14 января 2012

Я решил это сам, прочитав пост в блоге разработчиков Android: Ощущение мультитача .

Решение заключается в том, чтобы GestureDetector обрабатывал жест, вы можете обрабатывать событие касания, например, так:

    mGestureDetector = new GestureDetector(mSwipeListener);

    this.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            Log.v("Nav", "onTouch");

            mGestureDetector.onTouchEvent(event);
            final int action = event.getAction();

            switch (action) {
                case MotionEvent.ACTION_DOWN:{
                    Log.v("Nav", "onDown");
                    break;
                }
                case MotionEvent.ACTION_UP:{
                    Log.v("Nav", "onUp");
                    break;
                }
            }

            return true;
        }
    });

Когда я переверну виджет NavigationBarWidget, журнал будет: onTouch-> onDown-> onTouch (сколько onTouch и как долго вы нажимаете на экране) -> onFlingDown-> onUp

...