2016-07-06 9 views
0

Мне сложно реализовать, возможно, просто функцию. У меня есть FrameLayout, содержащее выпадающее меню (например, тот, который отображается в WhatsApp, появляется, когда вы нажимаете значок «Вложение»). Я хочу закрыть его, когда я выхожу за пределы указанного FrameLayout.onTouchListener on FrameLayout: закройте его при нажатии на него

Я пытаюсь реализовать его, используя событие onTouch, без везения.

FrameLayout

Мой код:

public class MainActivity extends AppCompatActivity { 

private LinearLayout mRevealView; 
private FrameLayout mRevealFrame; 

... 

@Override 
protected void onCreate(Bundle savedInstanceState) { 

    ... 

    mRevealView = (LinearLayout) findViewById(R.id.rows); 
    mRevealFrame = (FrameLayout) findViewById(R.id.reveal_frame); 

    ... 

} 

// This method is called when I click on the right menu icon. 
public void fuelTypes() { 
    // Looking for X and Y coordinates. 
    int cx = (mRevealView.getLeft() + mRevealView.getRight()); 
    int cy = (mRevealView.getTop()); 

    // Looking for radius when icon is tapped for showing layout. 
    int startRadius = 0; 
    int endRadius = Math.max(mRevealView.getWidth(), mRevealView.getHeight()); 

    // Performing circular reveal when icon will be tapped. 
    Animator animator = ViewAnimationUtils.createCircularReveal(mRevealView, cx, cy, startRadius, endRadius); 
    animator.setInterpolator(new AccelerateDecelerateInterpolator()); 
    animator.setDuration(400); 

    // Reverse animation to find radius when icon is tapped again for hiding layout. 
    // The starting radius will be the radius or the extent to which circular reveal animation is to be shown. 
    int reverseStartRadius = Math.max(mRevealView.getWidth(), mRevealView.getHeight()); 

    // End - radius will be zero. 
    int reverseEndRadius = 0; 

    // Performing circular reveal for reverse animation. 
    Animator animate = ViewAnimationUtils.createCircularReveal(mRevealView, cx, cy, reverseStartRadius, reverseEndRadius); 

    if (hidden) { 
     // To show the layout when the icon is tapped. 
     mRevealView.setVisibility(View.VISIBLE); 
     mRevealFrame.setVisibility(View.VISIBLE); 
     animator.start(); 
     hidden = false; 
    } else { 
     mRevealView.setVisibility(View.VISIBLE); 
     mRevealFrame.setVisibility(View.VISIBLE); 

     // To hide layout on animation end. 
     animate.addListener(new AnimatorListenerAdapter() { 

      @Override 
      public void onAnimationEnd(Animator animation) { 
       super.onAnimationEnd(animation); 
       mRevealView.setVisibility(View.INVISIBLE); 
       mRevealFrame.setVisibility(View.INVISIBLE); 
       hidden = true; 
      } 

     }); 

     animate.start(); 
    } 

    mRevealFrame.setOnTouchListener(new FrameLayout.OnTouchListener() { 
     @Override 
     public boolean onTouch(View view, MotionEvent motionEvent) { 
      Log.d("MOTION_EVENT", "getAction(): " + motionEvent.getAction()); 

      switch (motionEvent.getAction()) { 

       case MotionEvent.ACTION_UP: 
        Log.d("REVEAL_FRAME", "motion event: " + "ACTION_UP"); 
        fuelTypes(); 
        return true; 

      } 

      return true; 
     } 
    }); 

} 

Первый Log.d() работает, показывая, что слушатель срабатывает. Тем не менее, метод не находится внутри switch: я уже пробовал много флагов, не повезло. Я читал о onInterceptTouchEvent и onTouchEvent, но я не знаю, как их использовать вместо OnTouchListener.

Благодарим за помощь.

+0

пытаются отладить программировать и увидеть разницу между MotionEvent.ACTION_CANCEL и значением внутри motionEvent.getAction() –

+0

ACTION_CANCEL имеет идентификатор = 3, в то время как я могу видеть только идентификатор для FrameLayout при нажатии внутри (обычно ids равны 0 и 1). – Davide3i

ответ

1

Ваше расположение:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:id="@+id/main_layout"  // give id here 
tools:context="com.myfuel.MainActivity"> 

<include layout="@layout/activity_main"/> 

<FrameLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:id="@+id/reveal_frame" 
    android:layout_marginTop="?attr/actionBarSize"> 

    // EVERYTHING INSIDE THIS WILL BE AS IT IS 

</FrameLayout> 

</FrameLayout> 

Ваша активность

public class MainActivity extends AppCompatActivity { 

private LinearLayout mRevealView; 
private FrameLayout mRevealFrame; 
private FrameLayout mMainLayout; 
... 

@Override 
protected void onCreate(Bundle savedInstanceState) { 

    ... 

    mRevealView = (LinearLayout) findViewById(R.id.rows); 
    mRevealFrame = (FrameLayout) findViewById(R.id.reveal_frame); 
    mMainLayout = (FrameLayout) findViewById(R.id.main_layout); 

    mMainLayout.setOnTouchListener(new FrameLayout.OnTouchListener() 
    { 
     @Override 
     public boolean onTouch(View view, MotionEvent motionEvent) { 
      Log.d("MOTION_EVENT", "getAction(): " + motionEvent.getAction()); 

        //Things changed here      

        if(!hidden) 
         fuelTypes(); 


      return false; 
     } 
    }); 
    ... 

} 

Как ваш mRevealFrame не определяет всю FrameLayout вашей деятельности мы не можем использовать, что для закрытия mRevealView. Смотрите, что я определил mMainLayout, который покрывает схему WHOLE, которая будет работать сейчас.

Попробуйте и сообщите мне, есть ли проблемы.

+0

Это не похоже на мою проблему, потому что, когда я выхожу за пределы FrameLayout, журнал не показывает никаких сообщений. Теперь мое меню исчезает только тогда, когда я нажимаю на сам FrameLayout. – Davide3i

+0

1. Мы установили сенсорный прослушиватель на 'mRevealFrame', если вы выберете сторону' mRevealFrame', очевидно, что он не будет генерировать какой-либо журнал. 2. ** Теперь мое меню исчезает только тогда, когда я нажимаю на сам FrameLayout ** для этого чувства, мне нужно понять все ваше требование не только 'touchListner'. –

+0

Я обновлю ответ с изображением. Я попытаюсь объяснить причину своей цели: закрыть раскрывающееся меню WhatsApp, когда я нажимаю на него вне рамки FrameLayout (= щелчок в любом другом месте моей активности). Благодарим вас за помощь. – Davide3i