Android Studio отправляет пользовательское представление сенсорного события с фрагментами - PullRequest
0 голосов
/ 01 октября 2018

Здравствуйте, я работаю с пользовательскими представлениями.Этот класс работает, и вы можете использовать его, чтобы провести фрагмент, который был установлен в этом макете, вниз, чтобы закрыть его.Это мой первый пользовательский вид, который я когда-либо делал.Я действительно не знаю, должно ли это быть сделано, но я столкнулся с проблемой.Когда структура кадра содержит фрагмент, и этот фрагмент также содержит эту структуру кадра.Мне нужен способ, как правильно отправить событие на текущий видимый вид для пользователя.Теперь оба метода dispatchTouchEvents () были вызваны.Но это не то, что я хочу.Это должен быть только метод из текущего видимого фрагмента для пользователя.Таким образом, вам придется провести 2 раза, чтобы закрыть оба, а не только 1 раз и его закрытие одновременно.И я думаю, что я неправильно использую систему касания Android.

public class DragableViewFragment extends FrameLayout
{
    private AppCompatActivity activity;
    private FragmentManager fragmentManager;
    private static final float KILL_WEIGHT = 0.50f;
    private static final float SENSITIVITY = 1.5f;
    private static float IGNORED_CASE; //Pixels

    public DragableViewFragment(Context context) {
        super(context);
        initDimensions(context);
    }

    public DragableViewFragment(Context context, AttributeSet attrs) {
        super(context, attrs);
        initDimensions(context);
    }

    public DragableViewFragment(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initDimensions(context);
    }

    @RequiresApi(21)
    public DragableViewFragment(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        initDimensions(context);
    }

    private float max_height;
    private float down_WeightPercent;

    private void initDimensions(Context context)
    {
        if(context instanceof AppCompatActivity)
        {
            this.activity = (AppCompatActivity) context;
            this.fragmentManager = this.activity.getSupportFragmentManager();
        }
        else
        {
            throw new IllegalArgumentException("View is not used in a Activity context.");
        }

        final ViewConfiguration configuration = ViewConfiguration.get(context);
        DragableViewFragment.IGNORED_CASE = configuration.getScaledPagingTouchSlop();

        WindowManager wm = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
        if(wm != null)
        {
            Display defaultDisplay = wm.getDefaultDisplay();
            Point point = new Point();
            defaultDisplay.getSize(point);
            max_height = point.y;
            down_WeightPercent = (float) (max_height - (max_height * DragableViewFragment.KILL_WEIGHT));
        }
        else
        {
            throw new NullPointerException("WindowManager_service NULL");
        }
    }

    private boolean isDragging = false;
    private float lastRawY = -1;
    private float lastRawX = -1;
    private float lastDragDistance;
    private float firstTouchPos;

    @Override
    public boolean dispatchTouchEvent(MotionEvent event)
    {
        if(this.getChildCount() <= 0)
        {
            Log.i(getClass().getName(), "View is not moving: " + this.getId());
            return super.dispatchTouchEvent(event);
        }

        if(event.getAction() == MotionEvent.ACTION_DOWN)
        {
            firstTouchPos = event.getRawY();
        }
        else if(event.getAction() == MotionEvent.ACTION_MOVE)
        {
            float dx = event.getRawX() - lastRawX;
            float dy = event.getRawY() - lastRawY;
            lastRawX = event.getRawX();
            lastRawY = event.getRawY();
            if (Math.abs(dx) > Math.abs(dy)) {
                // Scrolling horizontally, so ignore
                return super.dispatchTouchEvent(event);
            }

            float rawY = event.getRawY();
            float dragDistance = (rawY - firstTouchPos) * DragableViewFragment.SENSITIVITY;
            if(rawY > lastRawY) //Dragging up, set scale factor.
            {
                System.out.println("DRAGING DOWN: " + dragDistance);
            }
            else
            {
                System.out.println("DRAGING UP: " + dragDistance);
            }

            lastDragDistance = dragDistance;

            if(dragDistance > IGNORED_CASE || isDragging)
            {
                if(!isDragging)
                {
                    isDragging = true;
                    event.setAction(MotionEvent.ACTION_CANCEL);
                    super.dispatchTouchEvent(event);
                }

                if(dragDistance >= 0)
                {
                    this.setTranslationY(dragDistance);
                    return true;
                }
            }
        }
        else if(event.getAction() == MotionEvent.ACTION_UP)
        {
            isDragging = false;
            float calculatedPecentage = (max_height - (lastDragDistance));

            if(calculatedPecentage <= down_WeightPercent)
            {
                if(fragmentManager != null)
                {
                    this.animate().translationY(max_height).setListener(new Animator.AnimatorListener() {
                        @Override
                        public void onAnimationStart(Animator animation) {

                        }

                        @Override
                        public void onAnimationEnd(Animator animation) {
                            resetView();
                        }

                        @Override
                        public void onAnimationCancel(Animator animation) {
                            resetView();
                        }

                        @Override
                        public void onAnimationRepeat(Animator animation) {

                        }
                    });
                    fragmentManager.popBackStack();
                }
                else
                {
                    throw new NullPointerException("FragmentManager not set in dragable view.");
                }
            }
            else
            {
                this.animate().translationY(0);
            }
        }
        return super.dispatchTouchEvent(event);
    }

    private void resetView()
    {
        this.setTranslationY(0f);
    }
}
...