专栏首页恩蓝脚本Android ScrollView实现反弹效果的实例

Android ScrollView实现反弹效果的实例

Android ScrollView实现反弹效果

自定义ScrollView控件:

/** 
* ScrollView反弹效果的实现 
*/ 
public class BounceScrollView extends ScrollView { 
private View inner;// 孩子View 
private float y;// 点击时y坐标 
private Rect normal = new Rect();// 矩形(这里只是个形式,只是用于判断是否需要动画.) 
private boolean isCount = false;// 是否开始计算 
public BounceScrollView(Context context, AttributeSet attrs) { 
super(context, attrs); 
} 
/*** 
* 根据 XML 生成视图工作完成.该函数在生成视图的最后调用,在所有子视图添加完之后. 即使子类覆盖了 onFinishInflate 
* 方法,也应该调用父类的方法,使该方法得以执行. 
*/ 
@Override 
protected void onFinishInflate() { 
if (getChildCount()   0) { 
inner = getChildAt(0); 
} 
} 
/*** 
* 监听touch 
*/ 
@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: 
break; 
case MotionEvent.ACTION_UP: 
// 手指松开. 
if (isNeedAnimation()) { 
animation(); 
isCount = false; 
} 
break; 
/*** 
* 排除出第一次移动计算,因为第一次无法得知y坐标, 在MotionEvent.ACTION_DOWN中获取不到, 
* 因为此时是MyScrollView的touch事件传递到到了LIstView的孩子item上面.所以从第二次计算开始. 
* 然而我们也要进行初始化,就是第一次移动的时候让滑动距离归0. 之后记录准确了就正常执行. 
*/ 
case MotionEvent.ACTION_MOVE: 
final float preY = y;// 按下时的y坐标 
float nowY = ev.getY();// 时时y坐标 
int deltaY = (int) (preY - nowY);// 滑动距离 
if (!isCount) { 
deltaY = 0; // 在这里要归0. 
} 
y = nowY; 
// 当滚动到最上或者最下时就不会再滚动,这时移动布局 
if (isNeedMove()) { 
// 初始化头部矩形 
if (normal.isEmpty()) { 
// 保存正常的布局位置 
normal.set(inner.getLeft(), inner.getTop(), 
inner.getRight(), inner.getBottom()); 
} 
Log.e("jj", "矩形:" + inner.getLeft() + "," + inner.getTop() 
+ "," + inner.getRight() + "," + inner.getBottom()); 
// 移动布局 
inner.layout(inner.getLeft(), inner.getTop() - deltaY / 2, 
inner.getRight(), inner.getBottom() - deltaY / 2); 
} 
isCount = true; 
break; 
default: 
break; 
} 
} 
/*** 
* 回缩动画 
*/ 
public void animation() { 
// 开启移动动画 
TranslateAnimation ta = new TranslateAnimation(0, 0, inner.getTop(), 
normal.top); 
ta.setDuration(200); 
inner.startAnimation(ta); 
// 设置回到正常的布局位置 
inner.layout(normal.left, normal.top, normal.right, normal.bottom); 
Log.e("jj", "回归:" + normal.left + "," + normal.top + "," + normal.right 
+ "," + normal.bottom); 
normal.setEmpty(); 
} 
// 是否需要开启动画 
public boolean isNeedAnimation() { 
return !normal.isEmpty(); 
} 
/*** 
* 是否需要移动布局 inner.getMeasuredHeight():获取的是控件的总高度 
* 
* getHeight():获取的是屏幕的高度 
* 
* @return 
*/ 
public boolean isNeedMove() { 
int offset = inner.getMeasuredHeight() - getHeight(); 
int scrollY = getScrollY(); 
Log.e("jj", "scrolly=" + scrollY); 
// 0是顶部,后面那个是底部 
if (scrollY == 0 || scrollY == offset) { 
return true; 
} 
return false; 
} 
} 

实现反弹效果:

<com.techrare.view.BounceScrollView 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:background="@color/tab_chart_bg" 
android:scrollbars="none"   
<LinearLayout 
android:layout_width="fill_parent" 
android:layout_height="match_parent" 
android:gravity="center_horizontal" 
android:orientation="vertical" 
android:paddingLeft="20dp" 
android:paddingRight="20dp"   
<span style="white-space:pre"    </span <!-- 这里可以尽情的布局 --  
</LinearLayout  
</com.techrare.view.BounceScrollView  

以上就是 Android ScrollView实现反弹效果的实例的讲解,本站关于Android开发的文章还有很多,欢迎大家搜索查阅,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Android仿Boss直聘文本日期混合滚轮选择器示例

    GitHub上面有一款iOS风格的滚轮选择器Android-PickerView,它分为时间选择器代码TimePickerView和选项选择器OptionsPi...

    砸漏
  • Android自定义Drawable之在Drawable中部指定透明区域方法示例

    在实际的开发工程中,不免想有一个中间是空洞的Drawable,也就是中间是透明的,而其他区域正常显示的Drawable。

    砸漏
  • Android 中View.onDraw(Canvas canvas)的使用方法

    我们可以定义自己的继承于View的TestView,然后重载View.onDraw(Canvas canvas).

    砸漏
  • Android自定义Drawable之在Drawable中部指定透明区域方法示例

    在实际的开发工程中,不免想有一个中间是空洞的Drawable,也就是中间是透明的,而其他区域正常显示的Drawable。

    砸漏
  • Android 中View.onDraw(Canvas canvas)的使用方法

    我们可以定义自己的继承于View的TestView,然后重载View.onDraw(Canvas canvas).

    砸漏
  • 探究Android活动的小技巧

    当我们在查看别人的代码的时候可能不能第一眼就发现首次的活动是哪一个,我们可以通过以下的方法来找出当前的主活动是哪一个:

    Dream城堡
  • Android实现扫一扫功能之绘制指定区域透明区域

    在实现扫一扫的功能的时候,我们需要绘制一个中间为透明的扫码框,其余部分为半透明。通常情况下,例如微信或者支付宝的扫码框都是矩形的,如果中间的扫码框是一个矩形,那...

    砸漏
  • Android版音乐播放器

    音乐播放器是一个非常常见的应用,这篇博客就是介绍如何制作一个简单的音乐播放器,这款音乐播放器具有以下的功能:播放歌曲、暂停播放歌曲、、显示歌曲的总时长、显示歌曲...

    砸漏
  • Django实战-优惠券系统设计

    Django网络应用开发的5项基础核心技术包括模型(Model)的设计,URL 的设计与配置,View(视图)的编写,Template(模板)的设计和Form(...

    小团子
  • 文字切换(TextSwitcher)使用

    TextSwitcher 继承自ViewSwitcher, ViewSwitcher继承自ViewAnimator.

    李小白是一只喵

扫码关注云+社区

领取腾讯云代金券