Ich finde es schwierig, ein wahrscheinlich einfaches Feature zu implementieren. Ich habe ein FrameLayout, das ein Dropdown-Menü enthält (wie das in WhatsApp, wenn Sie auf das Symbol Anhang klicken). Ich möchte es schließen, wenn ich außerhalb des FrameLayout klicke.onTouchListener auf FrameLayout: Schließen Sie es, wenn Sie außerhalb klicken
Ich versuche, es mit einem onTouch-Ereignis zu implementieren, ohne Glück.
Mein Code:
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;
}
});
}
Die erste Log.d()
arbeitet, zeigt, dass der Zuhörer ausgelöst wird. Noch geht die Methode nicht innerhalb der switch
: Ich habe schon viele Flaggen, ohne Glück versucht. Ich habe über onInterceptTouchEvent
und onTouchEvent
gelesen, aber ich weiß nicht, wie man sie anstelle der OnTouchListener
verwendet.
Vielen Dank für jede Hilfe.
versuchen zu debuggen Sie programmieren und den Unterschied zwischen MotionEvent.ACTION_CANCEL und Wert innerhalb motionEvent.getAction() –
ACTION_CANCEL sehen hat eine id = 3, während ich nur eine ID für die FrameLayout sehen kann, wenn im Innern klicken davon (normalerweise sind ids gleich 0 und 1). – Davide3i