2014-10-29 54 views
2

我正在嘗試使動畫工作,當我滾動我的ListView時。我想要的是,當用戶滾動查看列表中的更多條目時,其上方的佈局(A RelativeLayout)將縮小。我希望RelativeLayout只能在屏幕四分之一的範圍內移動,而且滾動時只能達到屏幕一半的大小。動畫列表查看大小增加

我現在的代碼是跳動,看起來不好。我需要一個更好的解決這個問題

這裏是我的代碼到目前爲止

@Override 
public void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, int totalItemCount) { 
    if(mLastFirstVisibleItem < firstVisibleItem){ 
     Display display = getActivity().getWindowManager().getDefaultDisplay(); 
     Point size = new Point(); 
     display.getSize(size); 
     int screenHeight = size.y; 

     System.out.println("Screen Height/2: " + (screenHeight/2)); 
     System.out.println("Balance Height 1: " + relBal.getHeight()); 
     if(relBal.getHeight() > (screenHeight/2)){ 
      newBalHeight = (screenHeight/2); 
     } 
     else { 
      newBalHeight = relBal.getHeight() + 100; 
     } 

     System.out.println("Balance Height 2: " + newBalHeight); 

     ResizeAnimation resize = new ResizeAnimation(relBal, relBal.getWidth(), relBal.getHeight(), relBal.getWidth(), newBalHeight); 
     relBal.startAnimation(resize); 
} 
if(mLastFirstVisibleItem > firstVisibleItem){ 
    Display display = getActivity().getWindowManager().getDefaultDisplay(); 
    Point size = new Point(); 
    display.getSize(size); 
    int screenHeight = size.y; 

    System.out.println("Screen Height/4: " + (screenHeight/4)); 
    System.out.println("Balance Height: " + relBal.getHeight()); 
    if(relBal.getHeight() < (screenHeight/4)){ 
        newBalHeight = (screenHeight/4); 
    } 
    else { 
        newBalHeight = relBal.getHeight() - 100; 
    } 

    System.out.println("Balance Height 2: " + newBalHeight); 
    ResizeAnimation resize = new ResizeAnimation(relBal, relBal.getWidth(), relBal.getHeight(), relBal.getWidth(), newBalHeight); 
    relBal.startAnimation(resize); 
} 
mLastFirstVisibleItem = firstVisibleItem; 

}

這是我的頁面的樣子

enter image description here

我想它看起來像這樣,當我滾動看到更多的項目

enter image description here

+1

您是否嘗試過在沒有動畫的情況下調整視圖的大小?應該經常調用onScroll來不需要動畫。 – dharms 2014-10-29 18:51:22

+0

@dcharms我認爲問題是滾動方向正確。當使用那個scrolllistener時,這並不好用 – BigT 2014-10-29 19:16:41

+0

有許多庫可以爲你的目的提供服務而無需編寫複雜的翻譯動畫: 你可以使用[Android Sliding Up Panel](https://github.com/umano/AndroidSlidingUpPanel),因爲它是docs說你可以使用setAnchorPoint在屏幕中間的某個位置設置一個錨點,以允許面板的中間展開狀態(類似於谷歌地圖)。 或使用[SlidingMenu](https://github.com/jfeinstein10/SlidingMenu)。 – 2014-11-05 17:31:29

回答

3

我都忍了一個示例項目在https://github.com/ramanadv/ShrinkingHeader。下面是我用過的邏輯,它有點不穩定,因爲我實際上並沒有太在意。這只是給你一個方向。不要使用動畫,因爲OnScroll被調用的次數足以讓您順利進行高度更改轉換。

list.setOnScrollListener(new OnScrollListener() { 

     @Override 
     public void onScrollStateChanged(AbsListView view, int scrollState) { 

     } 

     @Override 
     public void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, int totalItemCount) { 
      int scroll = getScroll(list); 
      changeHeight(price,scroll); 
      System.out.println("scroll "+scroll); 
     } 
    }); 

} 

protected int getScroll(ListView listView) {// as list recycles views , getscrollY wont give us how much it has scrolled, hence we use this hack 
    firstChildInList = listView.getChildAt(0); 
    if(firstChildInList == null)return 0; 
    return -firstChildInList.getTop() + listView.getFirstVisiblePosition() * firstChildInList.getHeight(); 
} 

protected void setHeightForView(View v ,int h){ // you need to set params to change height 
    LinearLayout.LayoutParams params = (LinearLayout.LayoutParams)v.getLayoutParams(); 
    params.height = h; 
    v.setLayoutParams(params); 
} 
protected void changeHeight(View view,int scroll) { // this is a simple logic , this is a little shaky , but its simple , you can smoothen from here 
    int priceHeight = price.getHeight(); 
    if(priceHeight>=screenHeight/4 && priceHeight<=screenHeight/2){ 
     setHeightForView(view, screenHeight/2-scroll); 
    } 
    else if(priceHeight < screenHeight/4){ 

    } 
} 
2

在OnScroll得到頂子的位置,然後根據該headingView的值更改上邊距:

private OnScrollListener scrollListener = new OnScrollListener() { 
     private boolean userScrolled = false; 

     public void onScrollStateChanged(AbsListView view, int scrollState) { 
      if (scrollState == 1) { 
       userScrolled = true; 
      } 
     } 

     public void onScroll(AbsListView view, int firstVisibleItem, 
       int visibleItemCount, int totalItemCount) { 

      if (userScrolled) { 
       secondChildFromTop = view.getChildAt(1).getTop();// From this value it is going to be easy to know if the scrolling is happening up or down 
      methodThatChangesTheTopMarginForYourView(secondChildFromTop); 
} 
} 
} 
private void methodThatChangesTheTopMarginForYourView(int value){ 
     ViewGroup.MarginLayoutParams params = 
     (ViewGroup.MarginLayoutParams)yourHeadingView.getLayoutParams(); 
     //some mathematical logic with the value param. 
     params.topMargin = //add negative value so the view goes outside of the screen, and the orginal value to get it back in original position 


}