Передача сенсорных событий на экран под текущим видом - Android - PullRequest
0 голосов
/ 09 октября 2018

У меня есть класс, расширенный из представления

public class SideLightView extends View {
...
...
...
@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    width = getWidth();
    height = getHeight();

    if (GlobalValues.DEBUG_MODE) Log.e(TAG, "Screen Width : " + width + "  
    Height : " + height);

    paint.setAntiAlias(true);
    paint.setStyle(Paint.Style.STROKE);
    paint.setStrokeWidth(strokeWidth);
//        paint.setColor(color);

    path.moveTo(0, 0);
    path.lineTo(0, height);
    path.lineTo(width, height);
    path.lineTo(width, 0);
    path.lineTo(0, 0);

    paint.setShader(new LinearGradient(0, 0, 0, height, top_color, 
    bottom_color, Shader.TileMode.CLAMP));
    canvas.drawPath(path, paint);

}

@Override
public boolean onTouchEvent(MotionEvent event) {
//        super.onTouchEvent(event);
    return false;
}

@Override
public boolean dispatchTouchEvent(MotionEvent event) {
//        super.dispatchTouchEvent(event);
    return false;
}
}

Я добавляю это представление в класс обслуживания с помощью диспетчера окон, как показано ниже:

mWindowManager = (WindowManager) mContext.getSystemService(WINDOW_SERVICE);


    int LAYOUT_FLAG;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        LAYOUT_FLAG = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;  
// for solving error window type 2006
    } else {
        LAYOUT_FLAG = WindowManager.LayoutParams.TYPE_PHONE;  // for solving 
error window type 2038
    }

    WindowManager.LayoutParams params = new WindowManager.LayoutParams(
            ViewGroup.LayoutParams.MATCH_PARENT,
            ViewGroup.LayoutParams.MATCH_PARENT,
            LAYOUT_FLAG,
            WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
//                        | WindowManager.LayoutParams.FLAG_FULLSCREEN
                    | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
                    | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
                    | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                    | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
                    | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
            PixelFormat.TRANSPARENT);


    params.gravity = Gravity.LEFT;


    sideLightView = new SideLightView(mContext);
    sideLightView.setClickable(false);
    sideLightView.setFocusable(false);

    mWindowManager.addView(sideLightView, params);
    Animation fade_in_out_animation = AnimationUtils.loadAnimation(mContext, 
R.anim.fade_in_and_out);
    fade_in_out_animation.setDuration(800);

    sideLightView.setStrokeWidth(40);

    sideLightView.startAnimation(fade_in_out_animation);

    Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            removeView();
        }
    }, utility.getSideLigthDuration() * 1000); //adding 3 sec delay

Моя цель - показать это представлениена экране блокировки пользователю потребовалось несколько секунд по сравнению с другими приложениями, но поскольку он имеет только прямоугольную рамку с размером обводки вокруг экрана и абсолютно ничего другого в центральной части, которая остается пустой или прозрачной, и она отображается правильно, но также она потребляет мои сенсорные события.

Как и всякий раз, когда этот вид отображается на экране, он использует сенсорные события, и пользователь чувствует, что телефон завис на несколько секунд.

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

Что я пробовал:

  • Я переопределил onTouchEvent и dispatchTouchEvent методы представления и вернул false для него - без изменений.
  • вернул true для обоих переопределенных методов - без изменений
  • Я установилClickable и Focusable на false - без изменений
  • Я попытался удалить и добавить флаги: FLAG_NOT_TOUCH_MODAL, FLAG_NOT_FOCUSABLE, FLAG_WATCH_OUTSIDE_TOUCH - без изменений

Если кто-нибудь может выяснить этот случай.Заранее спасибо.

1 Ответ

0 голосов
/ 10 октября 2018

Вы можете сначала попытаться установить focusable= "false" и enabled="false для родительского макета.

Теперь внедрите OnTouchListener поверх дочернего представления, а после получения события Touch просто верните true из дочернего.

child_view.setOnTouchListener(new OnTouchListener(){

    @Override
    public boolean onTouch(View arg0, MotionEvent arg1) {
        // your code here.
              return true;
        }
    });
...