RecylerView页面滑动赢藏某个控件

一题为话
1.我想耶和华造就了亚当,夏娃,昼夜,天空,飞鸟….后来有了幸运的我们,坐着舒服的房子喝着咖啡茶水,兴奋的半夜敲着代码没有丁点儿睡意。《圣经》最早被所谓的犹太人记载着人类的智慧,我希望手指敲打出我对代码的认知和思考,帮助自己和别人。

二,如图所示:这样的界面也许会在项目中出现,下滑赢藏部分控件,上滑又出现

这里写图片描述

分析:我们可以看出这是一个列表控件这里RecylerView当然了ListView,ScrollView都可以了。
最好用RecylerView,RecylerView的出现解决了很多的难题,例如这里我们如果经常去看源码的时候,会发现
RecylerView提供了很好多接口,让我们可以获取到滑动的距离。二早期的ListView没有哦。
1.有滑动距离的接口。我们可以获取到活动的距离dy
2.我们能消失也能还原,我们可以想到属性

三,我们开始写代码

  通过查找RecylerVied的滑动监听方法,我们发现RecyclerView.OnScrollListener接口。
  那么我这里去写一个类继承它,在这里获取dy。代码如下:
  1.我们可以获取到dy我们如何来判断是隐藏还是出现呢?这里我们来设定一个THRESHOLE=20,
  如果向上滑动20那么就显示,如果向下滑动20就消失。
  2.这里我们需要确保执行的动画不能同时执行。所以我们添加一个标签来确定到底是哪一个动画在执行。
  3.我们这里写一个接口让MainActivity来回调。

  public class FabScrollListenner extends RecyclerView.OnScrollListener {
    private static final int THRESHOLE = 20;
    private int distance = 0;//滑动超过一定的距离那么就执行
    private HideScrollListenner hideScrollListenner;
    private boolean visible=true;//是否可见
    public FabScrollListenner(HideScrollListenner hideScrollListenner) {
        this.hideScrollListenner = hideScrollListenner;
    }

    @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);
        /*
        * dy:Y轴方向的增量
        * 有正负之分的。
        * 当真正执行动画的时候就不要执行其他动画了
        * */
        if (distance > THRESHOLE&&visible) {
            visible=false;
            //执行隐藏动画
            hideScrollListenner.onHide();
            distance = 0;
        } else if(distance<-20&&!visible){
            visible=true;
            //执行显示动画
            hideScrollListenner.onShow();

            distance = 0;
        }
        if(visible&&dy>0||(!visible&&dy<0)) {
            distance += dy;
        }
    }
}  

回调接口


public interface HideScrollListenner {
   void onHide();
   void onShow();
}

接下来我们已经写好了接口,那么我们去实现它,进行隐藏和显示的代码:
如果不知道属性动画以及不知道如何通过RelativeLayout.LayoutParams来获取控件一些边距的可以去多查查如何
使用。


public class MainActivity extends AppCompatActivity implements HideScrollListenner {
    private RecyclerView recyclerView;
    private Toolbar mToobar;
    private ImageButton imageButton;
    private ArrayList<String> mData;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        supportRequestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);
        recyclerView = (RecyclerView) findViewById(R.id.recylerView);
        imageButton = (ImageButton) findViewById(R.id.fab);
        mToobar = (Toolbar) findViewById(R.id.toolbar);
        //这样太臃肿了。我们还是自定义一个类
        recyclerView.addOnScrollListener(new FabScrollListenner(this));
        mData=new ArrayList<>();
        for (int i = 0; i <20 ; i++) {
            mData.add("item="+i);
        }
        RecylerViewApdater madapter=new RecylerViewApdater(this,mData);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerView.setAdapter(madapter);
        madapter.notifyDataSetChanged();
        mToobar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(MainActivity.this,ListViewActivity.class));
            }
        });


    }

    @Override
    public void onHide() {

        //赢藏--属性动画
        RelativeLayout.LayoutParams params= (RelativeLayout.LayoutParams) imageButton.getLayoutParams();
        imageButton.animate().translationY((imageButton.getHeight()+params.bottomMargin)).setInterpolator(new AccelerateInterpolator(3));
        //Toolbar
        RelativeLayout.LayoutParams params1= (RelativeLayout.LayoutParams) mToobar.getLayoutParams();
        mToobar.animate().translationY(-(mToobar.getHeight()+params1.bottomMargin)).setInterpolator(new AccelerateInterpolator(3));
    }

    @Override
    public void onShow() {
        //显示--属性动画
        imageButton.animate().translationY(0).setInterpolator(new DecelerateInterpolator(3));
        mToobar.animate().translationY(0).setInterpolator(new DecelerateInterpolator(3));
    }
}

晚安:github:https://github.com/luhenchang/FloatingActionBarStudy.git

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值