一题为话
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