前不久有一朋友问我如何仿照微信顶部小程序下拉列表,我大致描述了一下流程,最后大手一挥,说网上应该多得是,给糊弄了。后来自己上网搜索了一下,只找到一篇(点击打开链接),感到心中有愧,故又写了一个demo,给别人一些思路吧。
国际惯例,先上图:
写之前我考虑了两种方法,第一种,依附于ScrollView、ListView等带有滑动的控件,判断是否滚动到顶部,然后在控件的滚动监听事件中做处理,但这种方法由于种种限制被我否决了(小伙伴们可以看看这种方法到底可不可行...);第二种,就是用dispatchTouchEvent方法,监听手势,个人觉得这个很靠谱,哈哈哈。
主要的思路如下:
1.开始下拉,三个小圆点出现,并分散
2.下拉到一定距离,震动,出现菜单栏,并且小圆点消失
一句话概括,主要是根据手指滑动距离动态改变控件高度,再配合位移动画达到效果
还是看代码吧,最直观
java代码:
public class MainActivity extends AppCompatActivity {
ScrollView scrollView;
RelativeLayout rel_top, rel_dot, rel_menu;
View dot_1, dot_2, dot_3;
float scale;
float firstY, lastY;
int height;
boolean isPullDown = false;//是否是向下滑动 true 是
boolean isAnimation = false;//动画是否已开启过 true 是
final int HEIGHT=180;//菜单布局正常高度
final int HEIGHT_DOT=120;//三个小球布局正常高度
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
scale = this.getResources().getDisplayMetrics().density;
scrollView = findViewById(R.id.scrollView);
rel_top = findViewById(R.id.rel_top);
rel_menu = findViewById(R.id.rel_menu);
rel_dot = findViewById(R.id.rel_dot);
dot_1 = findViewById(R.id.dot_1);
dot_2 = findViewById(R.id.dot_2);
dot_3 = findViewById(R.id.dot_3);
}
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
firstY = even