<!--带滑动的控件 需要用直接复制整个布局即可 --> <com.sothree.slidinguppanel.SlidingUpPanelLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:sothree="http://schemas.android.com/apk/res-auto" android:id="@+id/sliding_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="bottom" sothree:umanoDragView="@+id/frameLayout_up" sothree:umanoOverlay="true" sothree:umanoPanelHeight="68dp" sothree:umanoParallaxOffset="100dp" sothree:umanoShadowHeight="4dp"> <FrameLayout android:id="@+id/frameLayout_main" android:layout_width="match_parent" android:layout_height="match_parent" /> <FrameLayout android:id="@+id/frameLayout_up" android:layout_width="match_parent" android:layout_height="match_parent" /> </com.sothree.slidinguppanel.SlidingUpPanelLayout>
public class MainActivity extends BaseActivity implements PanelSlideListener, View.OnTouchListener{ private ViewHolder holder; private Context mContext; private static final String MAINFRAGMENT_TAG = "MainFragment"; private static final String SLIDINGFRAGMENT_TAG = "SlidingFragment"; private float mDown; //按下时的Y坐标 private float mMove; //移动后的Y坐标 private int diff; //偏移量 private int navigateHeight = 160; //底部导航栏的高度 private class ViewHolder{ SlidingUpPanelLayout sliding_layout; FrameLayout frameLayout_main; FrameLayout frameLayout_up; } public void init_View(){ holder = new ViewHolder(); holder.frameLayout_main = findViewByIds(R.id.frameLayout_main); holder.frameLayout_up = findViewByIds(R.id.frameLayout_up); holder.sliding_layout = findViewByIds(R.id.sliding_layout); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mContext = this; init_View(); init_data(); } private void init_data(){ holder.sliding_layout.setPanelHeight(0); init_fragment(); init_event(); } private void init_event(){ holder.sliding_layout.addPanelSlideListener(this); holder.frameLayout_main.setOnTouchListener(this); } private void init_fragment(){ FragmentManager manager = getFragmentManager(); FragmentTransaction transaction = manager.beginTransaction(); transaction.replace(R.id.frameLayout_main, new MainFragment(mContext), MAINFRAGMENT_TAG); transaction.replace(R.id.frameLayout_up, new SlidingFragment(mContext), SLIDINGFRAGMENT_TAG); transaction.commit(); } //滑动布局 添加addPanelSlideListener的回调方法。 @Override public void onPanelSlide(View panel, float slideOffset) { holder.sliding_layout.scrollTo(0, 0); //避免滑动fragment滑动后展示全频时向上移导致底下少了一部分 } @Override public void onPanelStateChanged(View panel, SlidingUpPanelLayout.PanelState previousState, SlidingUpPanelLayout.PanelState newState) { } //主界面fragment 监听onTouchListener的回调方法 @Override public boolean onTouch(View v, MotionEvent event) { int action = event.getAction(); switch (action){ case MotionEvent.ACTION_DOWN: mDown = event.getY(); //获取按下时候的纵坐标 Log.e("seven", "mDown:"+ mDown); break; case MotionEvent.ACTION_MOVE: mMove = event.getY(); //获取移动的纵坐标,滑动时候每次只有几十 diff = (int)(mDown - mMove); if (holder.sliding_layout.getScrollY() + diff > navigateHeight){//holder.sliding_layout.getScrollY()表示滑动后离左上角0,0坐标的Y坐标偏移量 holder.sliding_layout.scrollTo(0, navigateHeight); //判断Y偏移量加上每次滑动的偏移量是否大于底下导航的高度 }else if (holder.sliding_layout.getScrollY() + diff < 0){ holder.sliding_layout.scrollTo(0, 0); }else { holder.sliding_layout.scrollBy(0, diff); } break; case MotionEvent.ACTION_UP: //滑动松开后判断Y偏移量和位移偏移量是否大于底部导航的2分之1高度。 if (holder.sliding_layout.getScrollY() + diff > navigateHeight/2){ holder.sliding_layout.scrollTo(0, navigateHeight); }else { holder.sliding_layout.scrollTo(0, 0); } break; } return true; //只使用onTouchListener的情况下,需要返回true,否则监听只监听到down,后面的动作就监听不到了。 } }