本文实例为大家分享了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>
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。