Android ScrollView实现下拉弹回动画效果
程序员文章站
2023-08-13 14:58:23
这里设计一个自定义view,继承了scrollview,实现可以下拉里面的内容,松手后画面弹回,这个自定义的view可以当做scrollview来使用。
一般设计时的应用...
这里设计一个自定义view,继承了scrollview,实现可以下拉里面的内容,松手后画面弹回,这个自定义的view可以当做scrollview来使用。
一般设计时的应用效果:
一.自定义view的设计代码
package com.lwz.mathbox.weight; import android.content.context; import android.graphics.rect; import android.util.attributeset; import android.view.motionevent; import android.view.view; import android.view.animation.translateanimation; import android.widget.scrollview; /** * 实现了可以有下拉弹回的scrollview的自定义view */ public class springscrollview extends scrollview { private view inner;// 孩子 private float y;// 坐标 private rect normal = new rect();// 矩形空白 public springscrollview(context context, attributeset attrs) { super(context, attrs); } /*** * 根据 xml 生成视图工作完成.该函数在生成视图的最后调用,在所有子视图添加完之后. 即使子类覆盖了 onfinishinflate * 方法,也应该调用父类的方法,使该方法得以执行. */ @override protected void onfinishinflate() { if (getchildcount() > 0) { inner = getchildat(0);// 获取其孩子 } } @override public boolean ontouchevent(motionevent ev) { if (inner != null) { commontouchevent(ev); } return super.ontouchevent(ev); } /*** * 触摸事件 * * @param ev */ public void commontouchevent(motionevent ev) { int action = ev.getaction(); switch (action) { case motionevent.action_down: y = ev.gety();// 获取点击y坐标 break; case motionevent.action_up: if (isneedanimation()) { animation(); } break; case motionevent.action_move: final float prey = y; float nowy = ev.gety(); int deltay = (int) (prey - nowy);// 获取滑动距离 y = nowy; // 当滚动到最上或者最下时就不会再滚动,这时移动布局 if (isneedmove()) { if (normal.isempty()) { // 填充矩形,目的:就是告诉this:我现在已经有了,你松开的时候记得要执行回归动画. normal.set(inner.getleft(), inner.gettop(), inner.getright(), inner.getbottom()); } // 移动布局 inner.layout(inner.getleft(), inner.gettop() - deltay / 2, inner.getright(), inner.getbottom() - deltay / 2); } break; default: break; } } /*** * 开启动画移动 */ public void animation() { // 开启移动动画 translateanimation ta = new translateanimation(0, 0, inner.gettop(), normal.top); ta.setduration(300); inner.startanimation(ta); // 设置回到正常的布局位置 inner.layout(normal.left, normal.top, normal.right, normal.bottom); normal.setempty();// 清空矩形 } /*** * 是否需要开启动画 * <p> * 如果矩形不为空,返回true,否则返回false. * * @return */ public boolean isneedanimation() { return !normal.isempty(); } /*** * 是否需要移动布局 inner.getmeasuredheight():获取的是控件的高度 * getheight():获取的是当前控件在屏幕中显示的高度 * * @return */ public boolean isneedmove() { int offset = inner.getmeasuredheight() - getheight(); int scrolly = getscrolly(); // 0是顶部,后面那个是底部 if (scrolly == 0 || scrolly == offset) { return true; } return false; } }
二.简单调用示例
<?xml version="1.0" encoding="utf-8"?> <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> //包名+类型 <com.lwz.mathbox.weight.springscrollview android:layout_width="match_parent" android:layout_height="match_parent"> <linearlayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_margin="10dp" android:orientation="vertical"> <edittext android:id="@+id/et_content" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@null" android:gravity="top" android:hint="输入文字" android:minlines="4" android:singleline="false" android:textsize="14sp" /> <textview android:id="@+id/tv_size" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginright="10dp" android:gravity="right" android:text="0/255" /> </linearlayout> </com.lwz.mathbox.weight.springscrollview> </linearlayout>
调用的话只需要在xml中调用就可以了,逻辑操作的实现已经在自定义的view中完成了, 对应这些工具类,没有必要很深入去理解,学会调用就可以了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。