Android 三种布局实现上下回弹效果(普通布局,ListView,ScrollView)
2014-11-19 11:25
288 查看
转自:http://www.nqwang.com/2014/0403/91859.html
三种布局实现上下回弹效果(普通布局,ListView,ScrollView),有需要的朋友可以参考下。
本文主要介绍不超出屏幕边界的普通布局,ListView,ScrollView三种布局上下回弹效果的实现。
实现流程:
1.新建一个类继承LinearLayout
2.覆写方法三个方法onLayout(boolean changed, int l, int t, int r, int b),computeScroll(),onTouchEvent(MotionEvent event)
3.在构造方法中实例化Scroller;
4.在OnLayout里面实例化子布局
5.在OnonTouchEvent里面进行手势判断,
6.在computeScroll()里面完成实际的滚动
由于本人深恶痛绝下载源码需要财富的现象,现把源码放在这里与大家分享,代码稍微改一下就可以实现一切布局的回弹效果
这里只实现ScrollView回弹效果,其他一切布局的回弹效果的实现均雷同于此
代码如下:
package com.example.scrollview.springback;
import android.annotation.SuppressLint;
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.widget.Scroller;
public class ScrollViewLinearLayout extends LinearLayout implements OnTouchListener{
private LinearLayout top;
//private LinearLayout.LayoutParams top_lp ;
private ScrollView sv;
private boolean isfrist =true;
private float y1,y2;
private int hight=60;
private Scroller mScroller;
public ScrollViewLinearLayout(Context context, AttributeSet attrs) {
super(context, attrs);
setClickable(true);
setLongClickable(true);
mScroller = new Scroller(context);
}
protected void smoothScrollBy(int dx, int dy) {
//设置mScroller的滚动偏移量
mScroller.startScroll(0, mScroller.getFinalY(), 0, dy);
invalidate();//这里必须调用invalidate()才能保证computeScroll()会被调用,否则不一定会刷新界面,看不到滚动效果
}
protected void smoothScrollTo(int fx, int fy) {
int dx = fx - mScroller.getFinalX();
int dy = fy - mScroller.getFinalY();
smoothScrollBy(0, dy);
}
@SuppressLint("NewApi")
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
if(changed&&isfrist){//只需实例化一次
sv= (ScrollView) getChildAt(0);//该自定义布局写入xml文件时,其子布局的第一个必须是ScrollView时,这里才能getChildAt(0),实例化ScrollView
sv.setOverScrollMode(View.OVER_SCROLL_NEVER);//去掉ScrollView 滑动到底部或顶部 继续滑动时会出现渐变的蓝色颜色快
sv.setOnTouchListener(this);
isfrist=false;
}
}
@Override
public void computeScroll() {
if (mScroller.computeScrollOffset()) { //判断mScroller滚动是否完成
scrollTo(mScroller.getCurrX(), mScroller.getCurrY());//这里调用View的scrollTo()完成实际的滚动
postInvalidate();
}
super.computeScroll();
}
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
y1= event.getY();
break;
case MotionEvent.ACTION_MOVE:
y2= event.getY();
int scrollY=v.getScrollY();
int height=v.getHeight();
int scrollViewMeasuredHeight=sv.getChildAt(0).getMeasuredHeight();
if(y2-y1>0&&v.getScrollY()<=0){//头部回弹效果
smoothScrollTo(0,-(int) ((y2-y1)/2));
System.out.println("topMargin="+((int) ((y2-y1)/2)));
return false;
}
if(y2-y1<0&&(scrollY+height)==scrollViewMeasuredHeight){//底部回弹效果
smoothScrollTo(0,-(int) ((y2-y1)/2));
return false;
}
break;
case MotionEvent.ACTION_UP:
smoothScrollTo(0, 0);//松开手指,自动回滚
break;
default:
break;
}
return false;
}
}
需要注意的有以下几点:
1.mScroller.startScroll(0, mScroller.getFinalY(), 0, dy); 后必须invalidate();才能调用computeScroll()看到滚动效果
2.Scroller 的滚动坐标是屏幕左上角为坐标原点,往右是+x,往下是-y.(这一点在计算坐标时一定要明白,否则很难理解坐标的计算)
3.该自定义布局写入xml文件时,其子布局的第一个必须是ScrollView时,在OnLayout()方法才能getChildAt(0)实例化ScrollView
4.上下回弹效果的关键方法是判断ScrollView何时到头部和底部,这样才能触发拉伸,回弹效果
三种布局实现上下回弹效果(普通布局,ListView,ScrollView),有需要的朋友可以参考下。
本文主要介绍不超出屏幕边界的普通布局,ListView,ScrollView三种布局上下回弹效果的实现。
实现流程:
1.新建一个类继承LinearLayout
2.覆写方法三个方法onLayout(boolean changed, int l, int t, int r, int b),computeScroll(),onTouchEvent(MotionEvent event)
3.在构造方法中实例化Scroller;
4.在OnLayout里面实例化子布局
5.在OnonTouchEvent里面进行手势判断,
6.在computeScroll()里面完成实际的滚动
由于本人深恶痛绝下载源码需要财富的现象,现把源码放在这里与大家分享,代码稍微改一下就可以实现一切布局的回弹效果
这里只实现ScrollView回弹效果,其他一切布局的回弹效果的实现均雷同于此
代码如下:
package com.example.scrollview.springback;
import android.annotation.SuppressLint;
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.widget.Scroller;
public class ScrollViewLinearLayout extends LinearLayout implements OnTouchListener{
private LinearLayout top;
//private LinearLayout.LayoutParams top_lp ;
private ScrollView sv;
private boolean isfrist =true;
private float y1,y2;
private int hight=60;
private Scroller mScroller;
public ScrollViewLinearLayout(Context context, AttributeSet attrs) {
super(context, attrs);
setClickable(true);
setLongClickable(true);
mScroller = new Scroller(context);
}
protected void smoothScrollBy(int dx, int dy) {
//设置mScroller的滚动偏移量
mScroller.startScroll(0, mScroller.getFinalY(), 0, dy);
invalidate();//这里必须调用invalidate()才能保证computeScroll()会被调用,否则不一定会刷新界面,看不到滚动效果
}
protected void smoothScrollTo(int fx, int fy) {
int dx = fx - mScroller.getFinalX();
int dy = fy - mScroller.getFinalY();
smoothScrollBy(0, dy);
}
@SuppressLint("NewApi")
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
if(changed&&isfrist){//只需实例化一次
sv= (ScrollView) getChildAt(0);//该自定义布局写入xml文件时,其子布局的第一个必须是ScrollView时,这里才能getChildAt(0),实例化ScrollView
sv.setOverScrollMode(View.OVER_SCROLL_NEVER);//去掉ScrollView 滑动到底部或顶部 继续滑动时会出现渐变的蓝色颜色快
sv.setOnTouchListener(this);
isfrist=false;
}
}
@Override
public void computeScroll() {
if (mScroller.computeScrollOffset()) { //判断mScroller滚动是否完成
scrollTo(mScroller.getCurrX(), mScroller.getCurrY());//这里调用View的scrollTo()完成实际的滚动
postInvalidate();
}
super.computeScroll();
}
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
y1= event.getY();
break;
case MotionEvent.ACTION_MOVE:
y2= event.getY();
int scrollY=v.getScrollY();
int height=v.getHeight();
int scrollViewMeasuredHeight=sv.getChildAt(0).getMeasuredHeight();
if(y2-y1>0&&v.getScrollY()<=0){//头部回弹效果
smoothScrollTo(0,-(int) ((y2-y1)/2));
System.out.println("topMargin="+((int) ((y2-y1)/2)));
return false;
}
if(y2-y1<0&&(scrollY+height)==scrollViewMeasuredHeight){//底部回弹效果
smoothScrollTo(0,-(int) ((y2-y1)/2));
return false;
}
break;
case MotionEvent.ACTION_UP:
smoothScrollTo(0, 0);//松开手指,自动回滚
break;
default:
break;
}
return false;
}
}
需要注意的有以下几点:
1.mScroller.startScroll(0, mScroller.getFinalY(), 0, dy); 后必须invalidate();才能调用computeScroll()看到滚动效果
2.Scroller 的滚动坐标是屏幕左上角为坐标原点,往右是+x,往下是-y.(这一点在计算坐标时一定要明白,否则很难理解坐标的计算)
3.该自定义布局写入xml文件时,其子布局的第一个必须是ScrollView时,在OnLayout()方法才能getChildAt(0)实例化ScrollView
4.上下回弹效果的关键方法是判断ScrollView何时到头部和底部,这样才能触发拉伸,回弹效果
相关文章推荐
- Android 三种布局实现上下回弹效果(普通布局,ListView,ScrollView)
- 三种布局实现上下回弹效果(普通布局,ListView,ScrollView)
- 三种布局实现上下回弹效果(普通布局,ListView,ScrollView)
- Android回弹阻尼效果的简单实现,非基于ListView,ScrollView
- 如何实现android ScrollView ListView的回弹效果
- Android超简单实现listview上下拉伸回弹动画效果
- Android 弹性ListView和ScrollView 简单优雅地实现回弹效果
- Android PullToZoomListView实现放大回弹效果
- android 自定义ScrollView实现反弹效果(以及解决和ListView之间的冲突)
- android 自定义ScrollView实现反弹效果(以及解决和ListView之间的冲突)
- android 自定义ScrollView实现反弹效果(以及解决和ListView之间的冲突)
- Android自定义View--ScrollView实现回弹效果
- Android自定义ScrollView实现放大回弹效果实例代码
- android 自定义ScrollView实现反弹效果(以及解决和ListView之间的冲突)
- Android使用最简单的方式实现ListView 拉出回弹效果,阻尼效果(一)
- android 自定义ScrollView实现反弹效果(以及解决和ListView之间的冲突) .
- 【Android实战】ListView的回弹效果实现
- 【Android】高仿QQ的上下回弹效果之自定义的ScrollView
- 一个 ScrollView 里面包含 viewpager 嵌套 listview 或 RecyclerView 极少代码实现的流畅滑动效果 处理一个两层滑动 view 的自定义布局,以最少的代码实现,
- android ScrollView ListView的回弹效果