Question

I have a little problem with my Window dimming. Basically, I want to set the dimAmount of my Activity to zero as soon as I swipe it into one direction.

Please be aware that my Activity is displayed as a dialog, and can be swiped to the left or right. This works perfectly fine. But the setWindowDim() method has no effect when called after swipe.

If i call the setWindowDim inside my onCreate method, it works perfectly fine. I have no idea why it doesnt work anywhere else.

public class FinishDialog extends Activity {

private FrameLayout frame = null;
private GestureDetector gd = null;
private int displaywidth = 0;

private int original_x = 0;
private int dialog_width = 0;

private final int POS_LEFT = -1;
private final int POS_MID = 0;
private final int POS_RIGHT = 1;

/** the dialogs current position, POS_MID on startup */
private int current_pos = POS_MID;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    this.requestWindowFeature(Window.FEATURE_NO_TITLE);
    this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
    //this.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);

    frame = new FrameLayout(this);
    gd = new GestureDetector(this, new TouchManager(this));

    // fill the challenge layout into the framelayout
    frame.addView(LayoutInflater.from(getBaseContext()).inflate(R.layout.finishdialog, null));

    setContentView(frame);      

    FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) frame.getLayoutParams();

    GameLogic g = new GameLogic();

    displaywidth = g.getDisplayWidth(this);

    lp.width = displaywidth - displaywidth / 6;
    lp.gravity = Gravity.CENTER_HORIZONTAL | Gravity.CENTER_VERTICAL;

    LinearLayout llFinish = (LinearLayout) findViewById(R.id.llFinishDialog);

    LinearLayout.LayoutParams lpLL = (LinearLayout.LayoutParams) llFinish.getLayoutParams();
    lp.height = lpLL.height;

    frame.setLayoutParams(lp);

    // setWindowDim(0.0f); ---> if i set the dim here, it works perfectly fine

    original_x = (int) frame.getX();
    dialog_width = lp.width;
}   

private void setWindowDim(float dim) {

    Log.i("FinishDialog", "Setting window dim to " + dim + ".");

    WindowManager.LayoutParams lpWin = getWindow().getAttributes();
    lpWin.dimAmount = dim;
    getWindow().setAttributes(lpWin);
}

/**
 * move the dialog, depending on the swipe direction and the
 * current position of the dialog
 * @param action
 */
public void interpretTouch(int action) {

    switch(action) {
    case TouchManager.MOVE_DIALOG_RIGHT:

        if(frame != null) {

            if(current_pos == POS_MID) {

                swipeDialog(600, frame, 0, dialog_width, 0, 0);
                current_pos = POS_RIGHT;
                setWindowDim(0.0f); // here setting the dim has no effect

            } else if (current_pos == POS_LEFT) {

                swipeDialog(600, frame, - dialog_width, original_x, 0, 0);
                current_pos = POS_MID;
                setWindowDim(0.9f); // here setting the dim has no effect

            } else if (current_pos == POS_RIGHT) {
                // if we are on the right and swipe right, nothing happens
            }
        }

        Log.i("Challenge", "Moving dialog to the right.");
        break;
    case TouchManager.MOVE_DIALOG_LEFT:

        if(frame != null) {

            if(current_pos == POS_MID) {

                swipeDialog(600, frame, 0, -dialog_width, 0, 0);
                current_pos = POS_LEFT;
                setWindowDim(0.0f); // here setting the dim has no effect

            } else if (current_pos == POS_LEFT) {

                // if we are on the left and swipe left, nothing happens
            } else if (current_pos == POS_RIGHT) {

                swipeDialog(600, frame, dialog_width, original_x, 0, 0);
                current_pos = POS_MID;
                setWindowDim(0.9f); // here setting the dim has no effect
            }
        }

        Log.i("Challenge", "Moving dialog to the left.");
        break;
    }
}

@Override
public boolean onTouchEvent(MotionEvent event) {    

    return gd.onTouchEvent(event);
}

private void swipeDialog(int time, View framelayout, int fromDeltaX, int toDeltaX, int fromDeltaY, int toDeltaY) {

    Log.i("FinishDialog", "Dialog swiped.");

    TranslateAnimation trans = new TranslateAnimation(fromDeltaX, toDeltaX,
            fromDeltaY, toDeltaY);

    trans.setFillAfter(true);
    trans.setFillEnabled(true);
    trans.setDuration(time);
    framelayout.startAnimation(trans);  
}

}

Was it helpful?

Solution

Starting this activity right after I change the Window dim finally did the job. Unfortunately, now the Screen flashes pretty "ugly" when the RefreshActivity gets started, does anyone have a solution for that?

import android.app.Activity;
import android.os.Bundle;

public class RefreshActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);

        finish();
    }
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top