ObservableScrollView+TabPageIndicator+fragment 实现顶部悬浮菜单效果

顶部悬浮是在scrollview中进行的。通过在scrollview添加空布局来实现。

直接上代码

/*
 * Copyright 2013 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.zhsq365.yuci.view;

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.ScrollView;

/**
 * A custom ScrollView that can accept a scroll listener.
 */
public class ObservableScrollView extends ScrollView {
    private Callbacks mCallbacks;

    public ObservableScrollView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onScrollChanged(int l, int t, int oldl, int oldt) {
        super.onScrollChanged(l, t, oldl, oldt);
        if (mCallbacks != null) {
            mCallbacks.onScrollChanged(t);
        }
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        if (mCallbacks != null) {
            switch (ev.getActionMasked()) {
                case MotionEvent.ACTION_DOWN:
                    mCallbacks.onDownMotionEvent();
                    break;
                case MotionEvent.ACTION_UP:
                case MotionEvent.ACTION_CANCEL:
                    mCallbacks.onUpOrCancelMotionEvent();
                    break;
            }
        }
        return super.onTouchEvent(ev);
    }

    @Override
    public int computeVerticalScrollRange() {
        return super.computeVerticalScrollRange();
    }

    public void setCallbacks(Callbacks listener) {
        mCallbacks = listener;
    }

    public static interface Callbacks {
        public void onScrollChanged(int scrollY);
        public void onDownMotionEvent();
        public void onUpOrCancelMotionEvent();
    }
}
重写的scollview来监听滑动事件。

再上xml布局文件

<com.zhsq365.yuci.view.ObservableScrollView
            android:id="@+id/scroll_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_below="@+id/layout_title"
            android:scrollbars="none"
            android:fillViewport="true">

            <FrameLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent">

                <LinearLayout
                    android:id="@+id/header"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:background="@color/shop_bg_color"
                    android:orientation="vertical">

                    <RelativeLayout
                        android:id="@+id/layoutViewPager"
                        android:layout_width="match_parent"
                        android:layout_height="163dp">

                        <android.support.v4.view.ViewPager
                            android:id="@+id/LoopViewPager"
                            android:layout_width="match_parent"
                            android:layout_height="match_parent"
                            android:background="@drawable/binder_view_default" />

                        <LinearLayout
                            android:layout_width="match_parent"
                            android:layout_height="wrap_content"
                            android:layout_alignBottom="@+id/LoopViewPager"
                            android:layout_alignParentLeft="true"
                            android:orientation="vertical"
                            android:padding="8dp">

                            <LinearLayout
                                android:id="@+id/dot"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:layout_gravity="center_horizontal"
                                android:layout_marginTop="3dp"
                                android:orientation="horizontal"></LinearLayout>
                        </LinearLayout>
                    </RelativeLayout>

                    <!--此处重要-->
                    <View
                        android:id="@+id/placeholder"
                        android:layout_width="fill_parent"
                        android:layout_height="@dimen/min_height_textheader_materiallike" />
                    <com.zhsq365.yuci.view.ScrollByViewpager
                        android:id="@+id/viewPager"
                        android:layout_width="fill_parent"
                        android:layout_height="wrap_content"
                        android:layout_weight="1" />
                </LinearLayout>

                <com.zhsq365.yuci.widget.wheelview.viewpagerindicator.TabPageIndicator
                    android:id="@+id/tabPageIndicator"
                    android:layout_width="fill_parent"
                    android:layout_height="@dimen/min_height_textheader_materiallike"
                    android:background="#F3F3F3" />
            </FrameLayout>

        </com.zhsq365.yuci.view.ObservableScrollView>

布局文件中,placeholder和tabPage控件则为悬浮控件!

MainActivity中代码

1、首先实现observableScrollView.callback 接口

2、在activity中设置监听。更具计算高度,来控制悬浮框

mScrollview.setCallbacks(this);
        mScrollview.getViewTreeObserver().addOnGlobalLayoutListener(
                new ViewTreeObserver.OnGlobalLayoutListener() {
                    @Override
                    public void onGlobalLayout() {
                        onScrollChanged(mScrollview.getScrollY());
                    }
                });
3、
public void onScrollChanged(int scrollY) {
        tabPageIndicator.setTranslationY(Math.max(placeholder.getTop(), scrollY));

    }



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android-ObservableScrollView Build Status Coverage Status Maven Central API Android Arsenal Android library to observe scroll events on scrollable views. It's easy to interact with the Toolbar introduced in Android 5.0 Lollipop and may be helpful to implement look and feel of Material Design apps. Examples Download from Google Play Get it on Google Play Please note that the app on the Play store is not always the latest version. Download from wercker If you are a wercker user, you can download the latest build artifact. See here for details. wercker status Install manually Just clone and execute installDevDebug task with Gradle. See here for details. Usage Add com.github.ksoichiro:android-observablescrollview to your dependencies in build.gradle. Add ObservableListView or other views you'd like to use. Write some animation codes to the callbacks such as onScrollChanged, onUpOrCancelMotionEvent, etc. See the quick start guide for details, and the documentation for further more. Reference Supported widgets Environment Release notes FAQ Apps that use this library Badge Jair Player by Akshay Chordiya My Gradle by Erick Chavez Alcarraz ThemeDIY by Darkion Avey {Soft} Skills by Fanatic Devs If you're using this library in your app and you'd like to list it here, please let me know via email or pull requests or issues. Contributions Any contributions are welcome! Please check the FAQ and contributing guideline before submitting a new issue. Developed By Soichiro Kashima - soichiro.kashima@gmail.com Thanks Inspired by ObservableScrollView in romannurik-code. License Copyright 2014 Soichiro Kashima Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值