千家信息网

android怎么自定义滚动上下回弹scollView

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章主要介绍"android怎么自定义滚动上下回弹scollView",在日常操作中,相信很多人在android怎么自定义滚动上下回弹scollView问题上存在疑惑,小编查阅了各式资料,整理出简
千家信息网最后更新 2026年11月03日android怎么自定义滚动上下回弹scollView

这篇文章主要介绍"android怎么自定义滚动上下回弹scollView",在日常操作中,相信很多人在android怎么自定义滚动上下回弹scollView问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"android怎么自定义滚动上下回弹scollView"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

这是一个自定义view,在xml布局中用这个view嵌套要使之可以上下回弹的view

就能实现布局可以滚动上下回弹了,自定义view代码如下:

package com.loopfire.meitaotao.view.scrollView; import android.content.Context;import android.graphics.Rect;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;import android.view.animation.Animation;import android.view.animation.Animation.AnimationListener;import android.view.animation.TranslateAnimation;import android.widget.ScrollView; /** * 上下回弹 scollView *  * @author Administrator *  */public class MyScrollView extends ScrollView {    private View inner;    private float y;    private Rect normal = new Rect();    private boolean animationFinish = true;     public MyScrollView(Context context) {        super(context);    }     public MyScrollView(Context context, AttributeSet attrs) {        super(context, attrs);    }     @Override    protected void onFinishInflate() {        if (getChildCount() > 0) {            inner = getChildAt(0);        }    }     @Override    public boolean onInterceptTouchEvent(MotionEvent ev) {        return super.onInterceptTouchEvent(ev);    }     @Override    public boolean onTouchEvent(MotionEvent ev) {        if (inner == null) {            return super.onTouchEvent(ev);        } else {            commOnTouchEvent(ev);        }        return super.onTouchEvent(ev);    }     private void commOnTouchEvent(MotionEvent ev) {        if (animationFinish) {            int action = ev.getAction();            switch (action) {            case MotionEvent.ACTION_DOWN:                // System.out.println("ACTION_DOWN");                y = ev.getY();                super.onTouchEvent(ev);                break;            case MotionEvent.ACTION_UP:                // System.out.println("ACTION_UP");                y = 0;                if (isNeedAnimation()) {                    animation();                }                super.onTouchEvent(ev);                break;            case MotionEvent.ACTION_MOVE:                // System.out.println("ACTION_MOVE");                final float preY = y == 0 ? ev.getY() : y;                float nowY = ev.getY();                int deltaY = (int) (preY - nowY);                // 滚动                // scrollBy(0, deltaY);                 y = nowY;                // 当滚动到最上或者最下时就不会再滚动,这时移动布局                if (isNeedMove()) {                    if (normal.isEmpty()) {                        // 保存正常的布局位置                        normal.set(inner.getLeft(), inner.getTop(), inner.getRight(), inner.getBottom());                    }                    // 移动布局                    inner.layout(inner.getLeft(), inner.getTop() - deltaY / 2, inner.getRight(), inner.getBottom() - deltaY / 2);                } else {                    super.onTouchEvent(ev);                }                break;            default:                break;            }        }    }     // 开启动画移动     private void animation() {        // 开启移动动画        TranslateAnimation ta = new TranslateAnimation(0, 0, 0, normal.top - inner.getTop());        ta.setDuration(200);        ta.setAnimationListener(new AnimationListener() {            @Override            public void onAnimationStart(Animation animation) {                animationFinish = false;             }             @Override            public void onAnimationRepeat(Animation animation) {             }             @Override            public void onAnimationEnd(Animation animation) {                inner.clearAnimation();                // 设置回到正常的布局位置                inner.layout(normal.left, normal.top, normal.right, normal.bottom);                normal.setEmpty();                animationFinish = true;            }        });        inner.startAnimation(ta);    }     // 是否需要开启动画    private boolean isNeedAnimation() {        return !normal.isEmpty();    }     // 是否需要移动布局    private boolean isNeedMove() {        int offset = inner.getMeasuredHeight() - getHeight();        int scrollY = getScrollY();        if (scrollY == 0 || scrollY == offset) {            return true;        }        return false;    } }

在xml中使用如下:

           

那么包含的这个textview可以上下滚动并且回弹了

到此,关于"android怎么自定义滚动上下回弹scollView"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

上下 布局 移动 学习 动画 位置 更多 帮助 实用 接下来 中用 代码 文章 方法 理论 知识 篇文章 网站 资料 跟着 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 华服互联网科技怎么样 贷财互联网科技 深圳齐家互联网科技 互联网金融 科技创新 太原新华互联网科技学校怎么样 贵州叶脉互联网科技有限公司所属行业 受益于互联网科技的高速发展 互联网公司科技股 移动互联网科技公司 科技类公司包括互联网吗 明优互联网科技有限公司 卓翼科技产业互联网合作 恒生互联网科技业指数调整周期 互联网科技实习生岗位 广州富喜互联网络科技 神州科技互联网有限公司 济南小医互联网科技有限公司招聘 云南互联网科技学费 安徽零酒互联网科技有限公司 绵阳真晨互联网科技有限公司 手磨咖啡 麻工互联网科技 广州互联网科技公司 期待互联网科技 北京禾田雨橡互联网科技 链环科技传统企业怎么转型互联网 晋城互联网科技 浙南科技城互联网大厦招聘 广东鹅鹅鹅互联网科技有限公司 米泉互联网科技专业怎么样
0