本文实例为大家分享了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下写一个子控件才能使用

<?xml version="1.0" encoding="utf-8"?>
<你的包名.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"
   >
    <relativelayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <imageview
            android:id="@+id/iv_show"
            android:layout_width="match_parent"
            android:layout_height="200dp"
            android:layout_weight="1"
            android:src="@mipmap/ic_launcher"/>
    </relativelayout>

</com.example.application.view.headzoomscrollview>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。