2013-02-28 2 views
1

У меня есть небольшая проблема с моим затемнением. В принципе, я хочу, чтобы dimAmount моей активности был равен нулю, как только я провёл его в одном направлении.Настройка окна Dim только работает в onCreate()

Обратите внимание, что моя активность отображается в виде диалогового окна и может быть выведена влево или вправо. Это прекрасно работает. Но метод setWindowDim() не действует при вызове после прокрутки.

Если я вызываю setWindowDim внутри моего метода onCreate, он работает отлично. Я понятия не имею, почему он не работает нигде.

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

The * «почему это работает только в OnCreate()» *, вероятно, потому что вы можете только установить флаги окна и увидеть результат, если вы установите их перед вызовом 'setContentView()'. Что касается быстрого исправления, я думаю, вы могли бы активировать обновление, например [this] (http://stackoverflow.com/a/7658364/1815485). –

+1

Если вы посмотрите на мой код onCreate, вы увидите, что я могу установить тусклое окно даже после того, как я установил представление содержимого, и он все еще работает. Вот почему я так запутался, что он не работает нигде. –

ответ

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