2013-02-28 56 views
1

我的窗口调光有点问题。 基本上,我想将我的活动的dimAmount设置为零,只要我将其滑动到一个方向即可。设置窗口只能在onCreate()中工作

请注意,我的活动显示为对话框,并且可以向左或向右滑动。这工作非常好。但是,在滑动后调用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); 
} 

}

+0

*为什么它只在onCreate()中工作?可能是因为只有在调用setContentView()之前设置窗口标志并查看结果。至于一个快速修复,我想你可以有一个刷新活动,就像[this](http://stackoverflow.com/a/7658364/1815485)回答。 – 2013-02-28 22:23:40

+1

如果您查看我的onCreate代码,即使在设置内容视图后,您仍然可以将窗口设置为暗淡,并且它仍然有效。这就是为什么我如此困惑,在其他地方无法正常工作。 – 2013-02-28 22:26:54

回答

0

开始这个活动之后我改变窗口的朦胧终于做了工作。 不幸的是,现在屏幕在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(); 
    } 
}