千家信息网

Android怎么实现背景图滑动变大松开回弹效果

发表于:2025-01-18 作者:千家信息网编辑
千家信息网最后更新 2025年01月18日,这篇文章主要讲解了"Android怎么实现背景图滑动变大松开回弹效果",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Android怎么实现背景图滑动变大
千家信息网最后更新 2025年01月18日Android怎么实现背景图滑动变大松开回弹效果

这篇文章主要讲解了"Android怎么实现背景图滑动变大松开回弹效果",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Android怎么实现背景图滑动变大松开回弹效果"吧!

原图

放大后

1、自定义view继承ScrollView实现效果

public class HeadZoomScrollView extends ScrollView {    private View mZoomView;    private int mZoomViewWidth;    private int mZoomViewHeight;    private float firstPosition;//记录第一次按下的位置    private boolean isScrolling;//是否正在缩放    private float mScrollRate = 0.3f;//缩放系数,缩放系数越大,变化的越大    private float mReplyRate = 0.5f;//回调系数,越大,回调越慢    public HeadZoomScrollView(Context context) {        super(context);    }    public HeadZoomScrollView(Context context, AttributeSet attrs) {        super(context, attrs);    }    public HeadZoomScrollView(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);    }    public void setmZoomView(View mZoomView) {        this.mZoomView = mZoomView;    }    public void setmScrollRate(float mScrollRate) {        this.mScrollRate = mScrollRate;    }    public void setmReplyRate(float mReplyRate) {        this.mReplyRate = mReplyRate;    }    @Override    protected void onFinishInflate() {        super.onFinishInflate();        init();    }    private void init() {        setOverScrollMode(OVER_SCROLL_NEVER);        if (getChildAt(0) != null) {            ViewGroup vg = (ViewGroup) getChildAt(0);            if (vg.getChildAt(0) != null) {                mZoomView = vg.getChildAt(0);            }        }    }    @Override    public boolean onTouchEvent(MotionEvent ev) {        if (mZoomViewWidth <= 0 || mZoomViewHeight <= 0) {            mZoomViewWidth = mZoomView.getMeasuredWidth();            mZoomViewHeight = mZoomView.getMeasuredHeight();        }        switch (ev.getAction()) {            case MotionEvent.ACTION_UP:                //手指离开后恢复图片                isScrolling = false;                replyImage();                break;            case MotionEvent.ACTION_MOVE:                if (!isScrolling) {                    if (getScrollY() == 0) {                        firstPosition = ev.getY();// 滚动到顶部时记录位置,否则正常返回                    } else {                        break;                    }                }                int distance = (int) ((ev.getY() - firstPosition) * mScrollRate); // 滚动距离乘以一个系数                if (distance < 0) { // 当前位置比记录位置要小,正常返回                    break;                }                // 处理放大                isScrolling = true;                setZoom(distance);                return true; // 返回true表示已经完成触摸事件,不再处理        }        return true;    }    //回弹动画    private void replyImage() {        float distance = mZoomView.getMeasuredWidth() - mZoomViewWidth;        ValueAnimator valueAnimator = ValueAnimator.ofFloat(distance, 0f).setDuration((long) (distance * mReplyRate));        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {            @Override            public void onAnimationUpdate(ValueAnimator animation) {                setZoom((Float) animation.getAnimatedValue());            }        });        valueAnimator.start();    }    public void setZoom(float zoom) {        if (mZoomViewWidth <= 0 || mZoomViewHeight <= 0) {            return;        }        ViewGroup.LayoutParams lp = mZoomView.getLayoutParams();        lp.width = (int) (mZoomViewWidth + zoom);        lp.height = (int) (mZoomViewHeight * ((mZoomViewWidth + zoom) / mZoomViewWidth));        ((MarginLayoutParams) lp).setMargins(-(lp.width - mZoomViewWidth) / 2, 0, -(lp.width - mZoomViewWidth) / 2, 0);        mZoomView.setLayoutParams(lp);    }}

2、直接布局中使用这个view就可以,要注意的是在布局中需要在自定义view下写一个子控件才能使用

<你的包名.HeadZoomScrollView xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    xmlns:tools="http://schemas.android.com/tools"    android:id="@+id/drop_down_menu"    android:layout_width="match_parent"    android:layout_height="match_parent"   >                

感谢各位的阅读,以上就是"Android怎么实现背景图滑动变大松开回弹效果"的内容了,经过本文的学习后,相信大家对Android怎么实现背景图滑动变大松开回弹效果这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

效果 背景 位置 系数 学习 内容 布局 处理 个子 事件 动画 原图 图片 就是 思路 情况 手指 控件 文章 是在 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 轨道交通软件开发工程师 音视频服务器开发 网络安全与信息化 法院 学信网数据库查重准吗 网络安全专家兼职 邮件服务器 监控 中信建投网络安全招聘 服务器端文件下载安全方案 桓台陶瓷库存软件开发公司 网络安全手抄报内容可以写什么 上海新能源网络技术零售价格 天府杯网络安全大赛战报 二叉树数据库理解 虚拟机与云服务器 日立电梯手持编程服务器图片 杨浦区创新数据库价格查询 网络安全原理及实践 网络安全pki有前途吗 方程式网络技术支持 将第一条数据插入到数据库中 教育系统网络安全工作方案 电脑我的世界下载国际版服务器 文件服务器是ftp还是web好 网络安全知识竞赛题库百度网盘 网络安全相关技术网站有哪些 安徽合肥软件开发公司 嵌入式软件开发理论试题 地平线5 主机pc服务器 将第一条数据插入到数据库中 网络安全考证有意向者
0