ScrollView滑动监听实现界面动画效果

本文介绍了在Android中如何实现ScrollView的滑动监听,以此来控制ActionBar的显示和隐藏,以及ToolBar的文字缩放移动。通过创建接口和自定义ScrollView,详细讲解了滑动监听的实现步骤,并给出了相关代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Andriod进阶知识之一,滑动监听也是初学者不得不学习的一项技能。关于滑动,你能想到什么?ScrollView、ListView、GridView、WebView、RecyclerView。。。你是否写过或研究过ScrollView滑动监听的代码呢?其他控件的滑动监听代码是怎么实现的呢?看看下面的效果,是不是很想实现?让我们带着这些疑问,一起进入Android滑动监听的世界吧。


一、ScrollView滑动监听,实现ActionBar显示和隐藏

1、写一个ScrollView滑动监听的接口,供实现滑动监听的Activity实现,代码如下:

public interface ObservableScrollViewCallbacks {

    /**
     * 滑动过程监听
     * @param scrollY 当前滑动位置
     * @param firstScoll 是否第一次滑动
     * @param dragging 是否滑动中
     */
    void onScrollChanged(int scrollY, boolean firstScoll, boolean dragging);

    //当按下事件发生时候调用此方法
    void onDownMotionEvent();

    //滑动的状态
    void onUpOrCancleMotionEvent(ScrollState scrollState);

}

滑动状态用Enum枚举类型表示,STOP表示滑动停止,UP表示向上滑动,DOWN表示向下滑动,代码如下:

public enum ScrollState {
    STOP,
    UP,
    DOWN,
}
               

2、写一个Scrollable接口,供自定义ScrollView控件ObservableScrollView实现,代码如下:

public interface Scrollable {

    //接口设置
    void setScrollViewCallbacks(ObservableScrollViewCallbacks listener);

    //获取Y轴滑动距离
    int getCurrentScrollY();

    //设置手势拦截
    void setTouchInterceptionViewGroup(ViewGroup viewGroup);

}

3、自定义ObservableScrollView,实现Scrollable接口,代码如下:

public class ObservableScrollView extends ScrollView implements Scrollable{

    private int mPrevScrollY;
    private int mScrollY;

    private ScrollState mScrollState;

    private boolean mFirstScroll,mDraggging;

    private ObservableScrollViewCallbacks callbacks;

    public ObservableScrollView(Context context) {
        super(context);
    }

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

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

    @Override
    protected void onScrollChanged(int l, int t, int oldl, int oldt) {
        super.onScrollChanged(l, t, oldl, oldt);

        mScrollY = t;

        if (callbacks != null) {
            callbacks.onScrollChanged(t, mFirstScroll, mDraggging);
        }

        if (mFirstScroll) {
            mFirstScroll = false;
        }

        Log.i("ObservableScrollview",mPrevScrollY +" "+ t);

        if(mPrevScrollY < t){
            mScrollState = ScrollState.UP;
        }else {
            mScrollState = ScrollState.DOWN;
        }

        mPrevScrollY = t;
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        switch (ev.getActionMasked()){
            case MotionEvent.ACTION_DOWN:
                mFirstScroll = mDraggging = true;
                break;
        }
        return super.onInterceptTouchEvent(ev);
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        switch (ev.getActionMasked()) {
            case MotionEvent.ACTION_UP:
            case MotionEvent.ACTION_CANCEL:
                mDr
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值