2012-12-29 77 views
3

我在RelativeLayout中有兩個視圖,它們都填滿了屏幕,所以視圖B位於視圖A的頂部。我還定義了一個動畫,可以將視圖B部分移到屏幕外顯示在底下查看A.動畫效果很好,但我有一個經典問題,即視圖邊界不隨視圖移動,因此我用來觸發動畫的按鈕(位於視圖B上)只能從其原始位置點擊,而不是問題B位於哪裏。我遇到的問題是,在動畫結束後,當我設置佈局參數時,它將導致視圖B再次被重新繪製,從動畫結束位置開始翻譯。作爲一個具體的例子,視圖B的左邊緣最初在x = 0處,在x = 450處有按鈕。當按下按鈕時,動畫將視圖移動到x = -400。此功能正常工作 - 視圖部分偏離屏幕左側,並且該按鈕現在位於x = 50處,因此它仍在屏幕上。按鈕的點擊區域雖然仍是在x = 450。所以,現在我設定的佈局PARAMS的觀點B:移動Android視圖點擊動畫後的邊界

RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) viewB.getLayoutParams(); 
lp.rightMargin = 400; 
viewB.setLayoutParams(lp); 

一旦新PARAMS設置,視圖得到填充400像素右側,移動整個視圖到x = -800。雖然按鈕的可點擊區域現在在x = 50處正確,所以看起來好像我可以讓它看起來正確或行爲正確。任何想法我做錯了什麼?這是如何設置動畫。

Animation anim = null; 
anim = new TranslateAnimation(0, -400, 0, 0); 
anim.setAnimationListener(this); 
anim.setDuration(duration); 
viewB.startAnimation(anim); 

回答

2

我能得到的東西由之前或之後的動畫布局變更PARAMS工作,酌情:

private int marginOffsets; 

public void triggerAnimation(boolean show, offset) 
{ 
    int curX = 0; 
    int newX = 0; 
    Animation anim = null; 

    this.showingPanel = show; 
    if(show) 
    { 
     curX = 0 - offset; 

     android.widget.RelativeLayout.LayoutParams lp = new android.widget.RelativeLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT); 
     lp.rightMargin = 0; 
     rootPanel.setLayoutParams(lp); 
    } 
    else 
    { 
     newX = 0 - offset; 
    } 

    marginOffsets = newX < 0 ? 0 - offset : offset; 

    anim = new TranslateAnimation(curX, newX, 0, 0); 
    anim.setAnimationListener(this); 
    anim.setDuration(duration); 
    startAnimation(anim);   
} 

public void onAnimationEnd(Animation anim) 
{ 
    //This prevents flicker when the view is moving onscreen. 
    clearAnimation(); 

    if(!showingPanel) 
    { 
     //Move the margin to move the actual bounds so click events still work. 
     RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT); 
     lp.rightMargin = 0 - marginOffsets; 
     rootPanel.setLayoutParams(lp); 
    }  
}