package com.ElasticScrollView.view;
import java.util.Date;
import com.ElasticScrollView.cjy.R;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.LinearInterpolator;
import android.view.animation.RotateAnimation;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.ScrollView;
import android.widget.TextView;
public class ElasticScrollView extends ScrollView {
private static final String TAG = "ElasticScrollView";
private final static int RELEASE_To_REFRESH = 0;
private final static int PULL_To_REFRESH = 1;
private final static int REFRESHING = 2;
private final static int DONE = 3;
private final static int LOADING = 4;
// 实际的padding的距离与界面上偏移距离的比例
private final static int RATIO = 3;
private int headContentWidth;
private int headContentHeight;
private LinearLayout innerLayout;
private LinearLayout headView;
private ImageView arrowImageView;
private ProgressBar progressBar;
private TextView tipsTextview;
private TextView lastUpdatedTextView;
private OnRefreshListener refreshListener;
private boolean isRefreshable;
private int state;
private boolean isBack;
private RotateAnimation animation;
private RotateAnimation reverseAnimation;
private boolean canReturn;
private boolean isRecored;
private int startY;
public ElasticScrollView(Context context) {
super(context);
init(context);
}
public ElasticScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
private void init(Context context) {
LayoutInflater inflater = LayoutInflater.from(context);
innerLayout = new LinearLayout(context);
innerLayout.setLayoutParams(new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.FILL_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT));
innerLayout.setOrientation(LinearLayout.VERTICAL);
headView = (LinearLayout) inflater.inflate(R.layout.mylistview_head, null);
arrowImageView = (ImageView) headView.findViewById(R.id.head_arrowImageView);
progressBar = (ProgressBar) headView.findViewById(R.id.head_progressBar);
tipsTextview = (TextView) headView.findViewById(R.id.head_tipsTextView);
lastUpdatedTextView = (TextView) headView.findViewById(R.id.head_lastUpdatedTextView);
measureView(headView);
headContentHeight = headView.getMeasuredHeight();
headContentWidth = headView.getMeasuredWidth();
headView.setPadding(0, -1 * headContentHeight, 0, 0);
headView.invalidate();
Log.i("size", "width:" + headContentWidth + " height:" + headContentHeight);
innerLayout.addView(headView);
addView(innerLayout);
animation = new RotateAnimation(0, -180,
RotateAnimation.RELATIVE_TO_SELF, 0.5f,
RotateAnimation.RELATIVE_TO_SELF, 0.5f);
animation.setInterpolator(new LinearInterpolator());
animation.setDuration(250);
animation.setFillAfter(true);
reverseAnimation = new RotateAnimation(-180, 0,
RotateAnimation.RELATIVE_TO_SELF, 0.5f,
RotateAnimation.RELATIVE_TO_SELF, 0.5f);
reverseAnimation.setInterpolator(new LinearInterpolator());
reverseAnimation.setDuration(200);
reverseAnimation.setFillAfter(true);
state = DONE;
isRefreshable = false;
canReturn = false;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (isRefreshable) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
if (getScrollY() == 0 && !isRecored) {
isRecored = true;
startY = (int) event.getY();
Log.i(TAG, "在down时候记录当前位置");
}
break;
case MotionEvent.ACTION_UP:
if (state != REFRESHING && state != LOADING) {
if (state == DONE) {
// 什么都不做
}
if (state == PULL_To_REFRESH) {
state = DONE;
changeHeaderViewByState();
Log.i(TAG, "由下拉刷新状态,到done状态");
}
if (state == RELEASE_To_REFRESH) {
state = REFRESHING;
changeHeaderViewByState();
onRefresh();
Log.i(TAG, "由松开刷新状态,到done状态");
}
}
isRecored = false;
isBack = false;
break;
case MotionEvent.ACTION_MOVE:
int tempY = (int) event.getY();
if (!isRecored && getScrollY() == 0) {
Log.i(TAG, "在move时候记录下位置");
isRecored = true;
startY = tempY;
}
if (state != REFRESHING && isRecored && state != LOADING) {
// 可以松手去刷新了
if (state == RELEASE_To_REFRESH) {
canReturn = true;
if (((tempY - startY) / RATIO < headContentHeight)
&& (tempY - startY) > 0) {
state = PULL_To_REFRESH;
changeHeaderViewByState();
Log.i(TAG, "由松开刷新状态转变到下拉刷新状态");
}
// 一下子推到顶了
else if (tempY - startY <= 0) {
state = DONE;
changeHeaderViewByState();
Log.i(TAG, "由松开刷新状态转变到done状态");
} else {
// 不用进行特别的操作,只用更新paddingTop的值就行了
}
}
// 还没有到达显示松开刷新的时候,DONE或者是PULL_To_REFRESH状态
if (state == PULL_To_REFRESH) {
canReturn = true;
// 下拉到可以进入RELEASE_TO_REFRESH的状态
if ((tempY - startY) / RATIO >= headContentHeight) {
state = RELEASE_To_REFRESH;
isBack = true;
changeHeaderViewByState();
Log.i(TAG, "由done或者下拉刷新状态转变到松开刷新");
}
// 上推到顶了
else if (tempY - startY <= 0) {
state = DONE;
changeHeaderViewByState();
Log.i(TAG, "由DOne或者下拉刷新状态转变到done状态");
}
}
// done状态下
if (state == DONE) {
if (tempY - startY > 0) {
state = PULL_To_REFRESH;
changeHeaderViewByState();
}
}
// 更新headView的size
if (state == PULL_To_REFRESH) {
headView.setPadding(0, -1 * headContentHeight
+ (tempY - startY) / RATIO, 0, 0);
}
// 更新headView的paddingTop
if (state == RELEASE_To_REFRESH) {
headView.setPadding(0, (tempY - startY) / RATIO
- headContentHeight, 0, 0);
}
if (canReturn) {
canReturn = false;
return true;
}
}
break;
}
}
return super.onTouchEvent(event);
}
// 当状态改变时候,调用该方法,以更新界面
private void changeHeaderViewByState() {
switch (state) {
case RELEASE_To_REFRESH:
arrowImageView.setVisibility(View.VISIBLE);
progressBar.setVisibility(View.GONE);
tipsTextview.setVisibility(View.VISIBLE);
lastUpdatedTextView.setVisibility(View.VISIBLE);
arrowImageView.clearAnimation();
arrowImageView.startAnimation(animation);
tipsTextview.setText("松开刷新");
Log.i(TAG, "当前状态,松开刷新");
break;
case PULL_To_REFRESH:
progressBar.setVisibility(View.GONE);
tipsTextview.setVisibility(View.VISIBLE);
lastUpdatedTextView.setVisibility(View.VISIBLE);
arrowImageView.clearAnimation();
arrowImageView.setVisibility(View.VISIBLE);
// 是由RELEASE_To_REFRESH状态转变来的
if (isBack) {
isBack = false;
arrowImageView.clearAnimation();
arrowImageView.startAnimation(reverseAnimation);
tipsTextview.setText("下拉刷新");
} else {
tipsTextview.setText("下拉刷新");
}
Log.i(TAG, "当前状态,下拉刷新");
break;
case REFRESHING:
headView.setPadding(0, 0, 0, 0);
progressBar.setVisibility(View.VISIBLE);
arrowImageView.clearAnimation();
arrowImageView.se
没有合适的资源?快使用搜索试试~ 我知道了~
ViewPager局部滑动指引效果+ScrollView弹性异步加载效果
共58个文件
class:20个
png:16个
java:7个
4星 · 超过85%的资源 需积分: 10 152 下载量 99 浏览量
2012-11-05
16:53:35
上传
评论 3
收藏 3.17MB RAR 举报
温馨提示
ViewPager局部滑动指引效果+ScrollView弹性异步加载效果,类似掌中新浪主页viewPager和新闻列表的效果!
资源推荐
资源详情
资源评论
收起资源包目录
myScrollView.rar (58个子文件)
myScrollView
.project 853B
project.properties 360B
proguard.cfg 1KB
src
com
ElasticScrollView
view
ElasticScrollView.java 10KB
cjy
ElasticScrollViewActivity.java 6KB
layout
SlideImageLayout.java 4KB
utility
FileAccess.java 601B
parser
NewsXmlParser.java 3KB
entity
New.java 2KB
AndroidManifest.xml 755B
res
drawable-ldpi
ic_launcher.png 2KB
drawable-hdpi
item_topic.png 195KB
dot_none.png 3KB
image02.png 97KB
ic_launcher.png 4KB
image04.png 194KB
image03.png 231KB
image01.png 146KB
image_page_bg.png 3KB
goicon.jpg 8KB
dot_selected.png 3KB
image05.png 152KB
divider_horizontal_line.png 3KB
drawable-mdpi
ic_launcher.png 3KB
layout
item.xml 792B
view_pager.xml 4KB
mylistview_head.xml 2KB
main.xml 535B
values
strings.xml 709B
styles.xml 432B
assets
gen
com
ElasticScrollView
cjy
R.java 3KB
.classpath 441B
bin
resources.ap_ 1.03MB
classes
com
ElasticScrollView
view
ElasticScrollView.class 8KB
ElasticScrollView$OnRefreshListener.class 287B
cjy
R$layout.class 516B
R$style.class 419B
R$drawable.class 799B
R$attr.class 361B
ElasticScrollViewActivity$2$1.class 1KB
ElasticScrollViewActivity$ImagePageChangeListener.class 2KB
ElasticScrollViewActivity$SlideImageAdapter.class 2KB
ElasticScrollViewActivity$2.class 1KB
ElasticScrollViewActivity$1.class 1002B
R$id.class 1KB
ElasticScrollViewActivity.class 5KB
R.class 635B
R$string.class 598B
layout
SlideImageLayout.class 4KB
SlideImageLayout$ImageOnClickListener.class 2KB
utility
FileAccess.class 635B
parser
NewsXmlParser.class 3KB
entity
New.class 2KB
res
drawable-ldpi
ic_launcher.png 2KB
drawable-hdpi
ic_launcher.png 4KB
drawable-mdpi
ic_launcher.png 2KB
classes.dex 161KB
ElasticScrollView.apk 1.1MB
共 58 条
- 1
jwc_rzs01
- 粉丝: 1
- 资源: 9
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
- 4
- 5
- 6
前往页