设置Window Dim仅适用于onCreate()

时间:2013-02-28 22:19:08

标签: android window frame android-windowmanager

我的Window调光有点问题。 基本上,我想在将其滑动到一个方向时将我的活动的dimAmount设置为零。

请注意,我的活动显示为对话框,可以向左或向右滑动。这完全没问题。但是,在滑动后调用时,setWindowDim()方法无效。

如果我在onCreate方法中调用setWindowDim,它可以正常工作。 我不知道为什么它在其他任何地方都不起作用。

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);  
}

}

1 个答案:

答案 0 :(得分:0)

在我更改Window dim之后立即开始此活动最终完成了这项工作。 不幸的是,现在当RefreshActivity开始时屏幕闪烁非常“丑陋”,是否有人有解决方案呢?

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();
    }
}