Ich habe diesen Code in meinem adapter
für RecyclerView
:Funktion genannt zu werden 2 mal in OnLongClickListener
holder.image.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
int[] loc = new int[2];
holder.image.getLocationInWindow(loc);
((FeedFragment) fragment).blurBackground(getBitmapFromView(holder.image), loc[0], loc[1]);
Toast.makeText(context.getApplicationContext(), "Long press started", Toast.LENGTH_SHORT).show();
isLongPressed = true;
return true;
}
});
holder.image.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
v.onTouchEvent(event);
// We're only interested in when the button is released.
if (event.getAction() == MotionEvent.ACTION_UP) {
// We're only interested in anything if our speak button is currently pressed.
if (isLongPressed) {
// ((FeedFragment) fragment).removeBlur();
((FeedFragment) fragment).showAllGalleries(String.valueOf(photo.getPk()));
Toast.makeText(context.getApplicationContext(), "Long press ended", Toast.LENGTH_SHORT).show();
// Do something when the button is released.
isLongPressed = false;
}
}
return false;
}
});
Also, was ich tun möchte, ist: sobald die langen Klick beginnt, möchte ich eine Methode aufrufen Verwischen Sie den Bildschirm mit Ausnahme des Bildes, bei dem ein langer Klick auftritt, und diese Unschärfe (Änderung des Alphas des Hintergrunds) erfolgt in 400 ms. Das Problem besteht darin, dass die blurBackground()
-Methode zweimal aufgerufen wird. Wenn ich also die Unschärfe in onActivityResult
entferne, entferne ich nur die letzte hinzugefügte Ebene, während eine andere Ebene der Unschärfe vorhanden ist, weil die Methode zweimal aufgerufen wird. Ich erwarte, dass die Methode blurBackground()
nur einmal aufgerufen wird.
Was ist die Ursache für dieses Verhalten und wie kann es behoben werden?
Hier sind andere Methoden:
public void blurBackground(Bitmap bitmapFromView, int left, int top) {
LogUtil.i(TAG, "blurBackground called");
int statusBarHeight = (int) Math.ceil(25 * getActivity().getResources().getDisplayMetrics().density);
RelativeLayout overlay = new RelativeLayout(getActivity());
ID_OVERLAY = ViewIDGenerator.generateViewId();
LogUtil.i(TAG, "ID = " + ID_OVERLAY);
overlay.setId(ID_OVERLAY);
overlay.setBackgroundColor(Color.parseColor("#000000"));
RelativeLayout.LayoutParams overlayParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT);
overlay.setLayoutParams(overlayParams);
ImageView snapshot = new ImageView(getActivity());
snapshot.setImageBitmap(bitmapFromView);
RelativeLayout.LayoutParams snapshotParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
snapshotParams.setMargins(left, top-statusBarHeight, 0, 0);
snapshot.setLayoutParams(snapshotParams);
overlay.addView(snapshot);
container.addView(overlay);
AlphaAnimation alphaAnimation = new AlphaAnimation(0.0f, 0.7f);
alphaAnimation.setDuration(400);
alphaAnimation.setFillAfter(true);
overlay.startAnimation(alphaAnimation);
}
public void removeBlur() {
LogUtil.i(TAG, "removeBlur called");
LogUtil.i(TAG, "ID = " + ID_OVERLAY);
View namebar = container.findViewById(ID_OVERLAY);
((ViewGroup) namebar.getParent()).removeView(namebar);
}
Stehen Sie Ihre Zuhörer in der getView() -Methode in Ihrem Adapter Registrierung? Da Sie RecyclerView verwenden, ruft der Algorithmus sie möglicherweise zweimal auf. – Lazai
@Lazai aber es würde nicht jedes Mal aufgerufen werden, wenn 'getView()' aufgerufen wird. Es wird nur aufgerufen, wenn Sie diese Ansicht berühren. –