2015-02-28 52 views
12

Tôi vừa cài đặt thư viện FutureSimple cho các Nút Nổi Hành động và tôi nghĩ nó chỉ đẹp. Mặc dù nó không chứa biến mất trên logic cuộn, tôi thích nó. Tuy nhiên, tôi muốn triển khai mẫu Trả lại nhanh và tôi đang tìm cách đơn giản để thực hiện. Về cơ bản, tôi thiết lập một listener ObservableListView như vậy:Các Nút Hành động Nổi biến mất khi di chuyển

listView.setScrollViewCallbacks(new ObservableScrollViewCallbacks() { 
     @Override 
     public void onScrollChanged(int i, boolean b, boolean b2) { } 

     @Override 
     public void onDownMotionEvent() { } 

     @Override 
     public void onUpOrCancelMotionEvent(ScrollState scrollState) { } 
    }); 

Và tôi muốn biết nếu có một cách đơn giản để làm cho nút di chuyển của tôi với (với một button.animate nhanh() translationY (xx).) người nghe này.

Vì vậy, bất cứ khi nào tôi cuộn xuống, nó biến mất và sau đó nó xuất hiện trở lại khi tôi cuộn lên.

Tôi đã xem xét các triển khai khác nhau, nhưng tôi đã không hiểu rõ ý kiến ​​của chúng (đặc biệt là thư viện fab "chính thức" từ makovkastar).

PS: Tôi đang sử dụng thư viện FutureSimple vì nó có các menu.

Cảm ơn bạn rất nhiều, trước, vì sự giúp đỡ của bạn rất nhiều :)!

+0

Điểm nổi bật trong mã mẫu của bạn là gì? – uberchilly

+0

fam = fab của bạn. Tôi đang sử dụng một thư viện tùy chỉnh xử lý FloatingActionsMenu, nhưng trong bất kỳ ví dụ tiêu chuẩn nào, nó sẽ là một FloatingActionButton (từ Thư viện Hỗ trợ Thiết kế hoặc chỉ một ImageButton) và bạn sẽ gọi nó là fab. – Mehdi

+0

tnx theo kích thước của lalliga. – Setmax

Trả lời

3

tôi giải quyết vấn đề của tôi cách đây vài tuần, và tôi figured tôi có lẽ nên trả lời câu hỏi của riêng tôi ở đây :)

Sau nhiều ngày nghiên cứu, tôi đã phát hiện ra rằng cách tốt nhất để thực hiện điều này là sử dụng RecyclerView mới được giới thiệu bởi Android. Bạn có thể xử lý các thay đổi pixel nhỏ trong cuộn bằng RecyclerView, nhưng với ListView bạn hầu như không bao giờ có thể làm điều đó (chỉ có thể xử lý thay đổi "mục" được cuộn). Tôi đã thực hiện một scrollview Listener để RecyclerView của tôi như thế này:

public abstract class HidingScrollListener extends RecyclerView.OnScrollListener { 
private static final int HIDE_THRESHOLD = 20; 
private int scrolledDistance = 0; 
private boolean controlsVisible = true; 

@Override 
public void onScrolled(RecyclerView recyclerView, int dx, int dy) { 
    super.onScrolled(recyclerView, dx, dy); 

    int firstVisibleItem = ((LinearLayoutManager) recyclerView.getLayoutManager()).findFirstVisibleItemPosition(); 
    //show views if first item is first visible position and views are hidden 
    if (firstVisibleItem == 0) { 
     if(!controlsVisible) { 
      onShow(); 
      controlsVisible = true; 
     } 
    } else { 
     if (scrolledDistance > HIDE_THRESHOLD && controlsVisible) { 
      onHide(); 
      controlsVisible = false; 
      scrolledDistance = 0; 
     } else if (scrolledDistance < -HIDE_THRESHOLD && !controlsVisible) { 
      onShow(); 
      controlsVisible = true; 
      scrolledDistance = 0; 
     } 
    } 

    if((controlsVisible && dy>0) || (!controlsVisible && dy<0)) { 
     scrolledDistance += dy; 
    } 
} 

public abstract void onHide(); 
public abstract void onShow(); 

Mã này nhiều hơn là chỉ hiển thị hoặc ẩn FABs trên cuộn, nó thực sự xử lý một khá hoàn hảo "thanh hành động biến mất trên di chuyển" có hiệu lực. Nhưng, tôi không có thời gian để phù hợp với mã này theo nhu cầu của bạn, nhưng nó hiện hoạt động cho trường hợp của chúng tôi, tại đây.

Để quay trở lại mã của chúng tôi, sau khi tạo người nghe của chúng ta, chúng ta có thể thêm nó vào FABs của chúng tôi bằng cách thực hiện các giao diện của nó:

  recyclerView.setOnScrollListener(new HidingScrollListener() { 
     @Override 
     public void onHide() { 
        FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) fam.getLayoutParams(); 
    int fabBottomMargin = lp.bottomMargin; 
    fam.animate().translationY(fam.getHeight()+fabBottomMargin).setInterpolator(new AccelerateInterpolator(2)).start(); 
     } 

     @Override 
     public void onShow() { 
        toolbar.animate().translationY(0).setInterpolator(new DecelerateInterpolator(2)); 
    fam.animate().translationY(0).setInterpolator(new DecelerateInterpolator(2)).start(); 
     } 
    }); 

Voila!

Các vấn đề liên quan