有这样一个ListVIEw,要求在屏幕底部有一个筛选排序的浮动框:
1、手指下拉隐藏,上滑显示 ;
2、如果没做任何 *** 作,2S之后,要自动显示;
3、滑动到最底部,始终显示。
首先看其效果图:
实现上述效果,其实现原理如下:
1、在屏幕顶部固定一个BottomVIEw,XML布局最好使用relativeLayout(底部的BottomVIEw并不是 ListVIEw的footVIEw,这个是和footVIEw独立的,想想为什么?)
2、然后自定义ListVIEw控件,监听ontouchEvent事件,主要是监听手指下滑和上滑事件,同时实现onScrollListener,监听是否滑动到最底部和最顶部
3、 ListVIEw监听事件中,控制bottomVIEw的显示和隐藏,所以ListVIEw提供一个接口,设置底部bootomVIEw的内容,然后获之后,就可以对bottomVIEw进行控制,同时加上动画效果。
接下来看是如何的具体实现这种效果:
1。底部BottomVIEw的内容如下,这个XML文件的内容是自定义的,根据各项目的内容需求来定义的,我例子中bottom_vIEw.xml:
<?xml version="1.0" enCoding="UTF-8"?> <linearLayout xmlns:androID="http://schemas.androID.com/apk/res/androID" androID:ID="@+ID/button_layout" androID:layout_wIDth="fill_parent" androID:layout_height="50dp" androID:background="#cbcbcb" androID:gravity="center_vertical" androID:orIEntation="horizontal" > <button androID:layout_height="40dp" androID:layout_wIDth="wrap_content" androID:layout_weight="1" androID:text="价格" /> <button androID:layout_height="40dp" androID:layout_wIDth="wrap_content" androID:layout_weight="1" androID:text="好评" /> <button androID:layout_height="40dp" androID:layout_wIDth="wrap_content" androID:layout_weight="1" androID:text="筛选" /> </linearLayout>
2、main.xml如下
<?xml version="1.0" enCoding="utf-8"?> <relativeLayout xmlns:androID="http://schemas.androID.com/apk/res/androID" androID:orIEntation="vertical" androID:layout_wIDth="fill_parent" androID:layout_height="fill_parent" > <com.example.BottomfloatListVIEw.BottomfloatListVIEw androID:ID="@+ID/ListVIEw" androID:layout_wIDth="fill_parent" androID:layout_height="fill_parent" androID:fadingEdge="none" /> <include androID:ID="@+ID/bottombar" androID:layout_wIDth="match_parent" androID:layout_height="wrap_content" androID:layout_alignParentBottom="true" layout="@layout/bottom_vIEw" > </include> </relativeLayout>
3、自定义ListVIEw控件BottomfloatListVIEw
package com.example.BottomfloatListVIEw; import androID.content.Context; import androID.os.Handler; import androID.util.AttributeSet; import androID.util.Log; import androID.vIEw.MotionEvent; import androID.vIEw.VIEw; import androID.vIEw.VIEwGroup; import androID.vIEw.animation.Animation; import androID.vIEw.animation.OvershootInterpolator; import androID.vIEw.animation.TranslateAnimation; import androID.Widget.*; import androID.Widget.AbsListVIEw.OnScrollListener; /** * 底部VIEw自动隐藏和消失ListvIEw(其他ListVIEw可以继承该类,如CtripBottomrefreshListVIEw类等) **/ public class BottomfloatListVIEw extends ListVIEw implements OnScrollListener { public VIEw mBottombar; private int mCurrentScrollState; private boolean bIsMoved = false; private boolean bIsDown = false; private int mDeltaY; private float mMotionY; private int oldFirstVisibleItem = 0; private Handler mHandler = new Handler(); private static final String TAG = "BottomfloatListVIEw"; public BottomfloatListVIEw(Context context) { this(context,null); super.setonScrollListener(this); } public BottomfloatListVIEw(Context context,AttributeSet attrs) { this(context,attrs,0); super.setonScrollListener(this); } public BottomfloatListVIEw(Context context,AttributeSet attrs,int defStyle) { super(context,defStyle); super.setonScrollListener(this); } @OverrIDe public voID setAdapter(listadapter adapter) { super.setAdapter(adapter); } @OverrIDe public voID onScroll(AbsListVIEw vIEw,int firstVisibleItem,int visibleItemCount,int totalitemCount) { showBottomVIEwOnBottom(visibleItemCount,totalitemCount,firstVisibleItem); } @OverrIDe public voID onScrollStateChanged(AbsListVIEw vIEw,int scrollState) { hIDeBottomVIEwOnScrollStateChanged(vIEw,scrollState); } @OverrIDe public boolean ontouchEvent(MotionEvent ev) { float y = ev.getY(); float x = ev.getX(); Log.d("floatListVIEw","ontouchEvent" + "" + x + "" + y); int action = ev.getAction() & MotionEvent.ACTION_MASK; switch (action) { case MotionEvent.ACTION_DOWN: action_down(y); break; case MotionEvent.ACTION_MOVE: mDeltaY = (int) (y - mMotionY); bIsMoved = true; //移动的时候,要移除掉显示bottomVIEw的消息 mHandler.removeCallbacks(showBottombarRunnable); //补齐action_down事件,因为有的时候,action_down 事件没有执行 action_down(y); break; case MotionEvent.ACTION_UP: bIsMoved = false; bIsDown = false; if (!bIsMoved && !bIsDown) { // 如果屏幕上什么没做,则过2s之后要显示bottomVIEw mHandler.postDelayed(showBottombarRunnable,2000); } if (mDeltaY < 0) { //下滑影藏 hIDeBottombar(); } else { //上滑显示 showBottombar(); } bIsMoved = false; break; } return super.ontouchEvent(ev); } private voID action_down(float y){ mMotionY = y; bIsDown = true; Log.d(TAG,"action down execed"); mHandler.removeCallbacks(showBottombarRunnable); } /** * 滑动到顶部时,要隐藏bottomVIEw * @param vIEw * @param scrollState */ private voID hIDeBottomVIEwOnScrollStateChanged(AbsListVIEw vIEw,int scrollState) { mCurrentScrollState = scrollState; if(vIEw!=null){ if (vIEw.getFirstVisibleposition() == 0 && scrollState == SCRolL_STATE_IDLE) { hIDeBottombar(); Log.d(TAG,"hIDe bottom vIEw"); } } } /** * 显示底部浮动栏 */ public voID showBottombar() { if (mBottombar != null && mBottombar.getVisibility() == VIEw.GONE) { mBottombar.setVisibility(VIEw.INVISIBLE); Animation translateAnimation = new TranslateAnimation(mBottombar.getleft(),mBottombar.getleft(),30,0); translateAnimation.setDuration(300); translateAnimation.setInterpolator(new OvershootInterpolator(0.6f)); mBottombar.startAnimation(translateAnimation); translateAnimation.setAnimationListener(new Animation.AnimationListener() { @OverrIDe public voID onAnimationStart(Animation animation) { } @OverrIDe public voID onAnimationRepeat(Animation animation) { } @OverrIDe public voID onAnimationEnd(Animation animation) { mBottombar.setVisibility(VIEw.VISIBLE); } }); } } /** * 隐藏浮动底部栏 */ private voID hIDeBottombar() { if (mBottombar != null && mBottombar.getVisibility() == VIEw.VISIBLE) { Animation translateAnimation = new TranslateAnimation(mBottombar.getleft(),30); translateAnimation.setDuration(300); translateAnimation.setInterpolator(new OvershootInterpolator(0.6f)); mBottombar.startAnimation(translateAnimation); translateAnimation.setAnimationListener(new Animation.AnimationListener() { @OverrIDe public voID onAnimationStart(Animation animation) { } @OverrIDe public voID onAnimationRepeat(Animation animation) { } @OverrIDe public voID onAnimationEnd(Animation animation) { mBottombar.setVisibility(VIEw.GONE); } }); } } /** * 滑动到底部时直接显示bottomVIEw * @param visibleItemCount * @param totalitemCount * @param firstVisibleItem */ private voID showBottomVIEwOnBottom(int visibleItemCount,int totalitemCount,int firstVisibleItem) { Log.d(TAG,"visible bottem item count:" + "firstVisibleItem:" + firstVisibleItem + "oldFirstVisibleItem:" + oldFirstVisibleItem + mBottombar); if(getLastVisibleposition() == totalitemCount -1 && mCurrentScrollState != SCRolL_STATE_IDLE){ showBottombar(); } } private Runnable showBottombarRunnable = new Runnable() { @OverrIDe public voID run() { showBottombar(); } }; /** * 将需要隐藏显示的vIEw传入 * * @param bottombar */ public voID setBottombar(VIEwGroup bottombar) { this.mBottombar = bottombar; } }
4、主界面测试的Activity,MainActivity代码如下
public class MainActivity extends Activity { private BottomfloatListVIEw mBottomfloatListVIEw; @OverrIDe public voID onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentVIEw(R.layout.main); mBottomfloatListVIEw = (BottomfloatListVIEw)findVIEwByID(R.ID.ListVIEw) ; mBottomfloatListVIEw.setAdapter(new ArrayAdapter<String>(this,androID.R.layout.simple_expandable_List_item_1,getData())); VIEwGroup bottomVIEw = (VIEwGroup)findVIEwByID(R.ID.bottombar) ; mBottomfloatListVIEw.setBottombar(bottomVIEw); } private List<String> getData(){ List<String> data = new ArrayList<String>(); for(int i = 0; i <100; i++) { data.add("测试数据" + i); } return data; } }
VIEwGroup bottomVIEw = (VIEwGroup)findVIEwByID(R.ID.bottombar) ; mBottomfloatListVIEw.setBottombar(bottomVIEw);
将底部的bottomVIEw传入到ListVIEw中,就可以让ListVIEw具有底部VIEw自动隐藏和消失的功能。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。
总结以上是内存溢出为你收集整理的android自定义ListView实现底部View自动隐藏和消失的功能全部内容,希望文章能够帮你解决android自定义ListView实现底部View自动隐藏和消失的功能所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)