向上滑动飞进来SlidingUpPanelLayout

<!--带滑动的控件 需要用直接复制整个布局即可 -->
<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,后面的动作就监听不到了。
    }
}



AndroidSlidingUpPanel 是一个上拉面板, 就是向上滑动的时候往上飞出一个显示面板控件, 该库效果在 Google Music, Google Maps and Rdio等 App 中用到。 效果图: 用法:使用com.sothree.slidinguppanel.SlidingUpPanelLayout作为您的活动布局的根元素。 布局必须设置为顶部或底部。请确保它有两个元素。 第一个元素是你的主要布局。第二个元素是你的向上滑动面板布局。 主要布局应当具有的宽度和高度设置为match_parent。 滑动的布局的宽度应设置为match_parent;高度应设置为match_parent,WRAP_CONTENT或最大desireable高度。 如果您想定义高度屏幕为percetange,可将其设置为match_parent,滑动视图定义为layout_weight属性。  默认情况下,整个面板将作为拖动区域和将截获的点击和拖动事件。可以通过使用setDragView方法或umanoDragView属性限制牵引区到特定的图。 想了解更多信息,请参考示例代码:<com.sothree.slidinguppanel.SlidingUpPanelLayout     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:umanoPanelHeight="68dp"     sothree:umanoShadowHeight="4dp">     <TextView         android:layout_width="match_parent"         android:layout_height="match_parent"         android:gravity="center"         android:text="Main Content"         android:textSize="16sp" />     <TextView         android:layout_width="match_parent"         android:layout_height="match_parent"         android:gravity="center|top"         android:text="The Awesome Sliding Up Panel"         android:textSize="16sp" /> </com.sothree.slidinguppanel.SlidingUpPanelLayout>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值