Мне сложно реализовать, возможно, просто функцию. У меня есть FrameLayout, содержащее выпадающее меню (например, тот, который отображается в WhatsApp, появляется, когда вы нажимаете значок «Вложение»). Я хочу закрыть его, когда я выхожу за пределы указанного FrameLayout.onTouchListener on FrameLayout: закройте его при нажатии на него
Я пытаюсь реализовать его, используя событие onTouch, без везения.
Мой код:
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
.
Благодарим за помощь.
пытаются отладить программировать и увидеть разницу между MotionEvent.ACTION_CANCEL и значением внутри motionEvent.getAction() –
ACTION_CANCEL имеет идентификатор = 3, в то время как я могу видеть только идентификатор для FrameLayout при нажатии внутри (обычно ids равны 0 и 1). – Davide3i