package com.nono.refreshDemo;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.ScrollView;
import android.widget.Scroller;
import android.widget.TextView;
/**
* 刷新控制view
*
* @author Nono
*
*/
public class RefreshableView extends LinearLayout {
private static final String TAG = "LILITH";
private Scroller scroller;
private View refreshView;
private ImageView refreshIndicatorView;
private int refreshTargetTop = -60;
private ProgressBar bar;
private TextView downTextView;
private TextView timeTextView;
private RefreshListener refreshListener;
private String downTextString;
private String releaseTextString;
private Long refreshTime = null;
private int lastX;
private int lastY;
// 拉动标记
private boolean isDragging = false;
// 是否可刷新标记
private boolean isRefreshEnabled = true;
// 在刷新中标记
private boolean isRefreshing = false;
private Context mContext;
public RefreshableView(Context context) {
super(context);
mContext = context;
}
public RefreshableView(Context context, AttributeSet attrs) {
super(context, attrs);
mContext = context;
init();
}
private void init() {
// TODO Auto-generated method stub
//滑动对象,
scroller = new Scroller(mContext);
//刷新视图顶端的的view
refreshView = LayoutInflater.from(mContext).inflate(R.layout.refresh_top_item, null);
//指示器view
refreshIndicatorView = (ImageView) refreshView.findViewById(R.id.indicator);
//刷新bar
bar = (ProgressBar) refreshView.findViewById(R.id.progress);
//下拉显示text
downTextView = (TextView) refreshView.findViewById(R.id.refresh_hint);
//下来显示时间
timeTextView = (TextView) refreshView.findViewById(R.id.refresh_time);
LayoutParams lp = new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, -refreshTargetTop);
lp.topMargin = refreshTargetTop;
lp.gravity = Gravity.CENTER;
addView(refreshView, lp);
downTextString = mContext.getResources().getString(R.string.refresh_down_text);
releaseTextString = mContext.getResources().getString(R.string.refresh_release_text);
}
/**
* 刷新
* @param time
*/
private void setRefreshText(String time) {
// TODO Auto-generated method stub
//timeTextView.setText(time);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
int y= (int) event.getRawY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
//记录下y坐标
lastY = y;
break;
case MotionEvent.ACTION_MOVE:
Log.i(TAG, "ACTION_MOVE");
//y移动坐标
int m = y - lastY;
if(((m < 6) && (m > -1)) || (!isDragging )){
doMovement(m);
}
//记录下此刻y坐标
this.lastY = y;
break;
case MotionEvent.ACTION_UP:
Log.i(TAG, "ACTION_UP");
fling();
break;
}
return true;
}
/**
* up事件处理
*/
private void fling() {
// TODO Auto-generated method stub
LinearLayout.LayoutParams lp = (LayoutParams) refreshView.getLayoutParams();
Log.i(TAG, "fling()" + lp.topMargin);
if(lp.topMargin > 0){//拉到了触发可刷新事件
refresh();
}else{
returnInitState();
}
}
private void returnInitState() {
// TODO Auto-generated method stub
LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams)this.refreshView.getLayoutParams();
int i = lp.topMargin;
scroller.startScroll(0, i, 0, refreshTargetTop);
invalidate();
}
private void refresh() {
// TODO Auto-generated method stub
LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams)this.refreshView.getLayoutParams();
int i = lp.topMargin;
refreshIndicatorView.setVisibility(View.GONE);
bar.setVisibility(View.VISIBLE);
timeTextView.setVisibility(View.GONE);
downTextView.setVisibility(View.GONE);
scroller.startScroll(0, i, 0, 0-i);
invalidate();
if(refreshListener !=null){
refreshListener.onRefresh(this);
isRefreshing = true;
}
}
/**
*
*/
@Override
public void computeScroll() {
// TODO Auto-generated method stub
if(scroller.computeScrollOffset()){
int i = this.scroller.getCurrY();
LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams)this.refreshView.getLayoutParams();
int k = Math.max(i, refreshTargetTop);
lp.topMargin = k;
this.refreshView.setLayoutParams(lp);
this.refreshView.invalidate();
invalidate();
}
}
/**
* 下拉move事件处理
* @param moveY
*/
private void doMovement(int moveY) {
// TODO Auto-generated method stub
LinearLayout.LayoutParams lp = (LayoutParams) refreshView.getLayoutParams();
if(moveY > 0){
//获取view的上边距
float f1 =lp.topMargin;
float f2 = moveY * 0.3F;
int i = (int)(f1+f2);
//修改上边距
lp.topMargin = i;
//修改后刷新
refreshView.setLayoutParams(lp);
refreshView.invalidate();
invalidate();
}
timeTextView.setVisibility(View.VISIBLE);
if(refreshTime!= null){
setRefreshTime(refreshTime);
}
downTextView.setVisibility(View.VISIBLE);
refreshIndicatorView.setVisibility(View.VISIBLE);
bar.setVisibility(View.GONE);
if(lp.topMargin > 0){
downTextView.setText(R.string.refresh_release_text);
refreshIndicatorView.setImageResource(R.drawable.refresh_arrow_up);
}else{
downTextView.setText(R.string.refresh_down_text);
refreshIndicatorView.setImageResource(R.drawable.refresh_arrow_down);
}
}
public void setRefreshEnabled(boolean b) {
this.isRefreshEnabled = b;
}
public void setRefreshListener(RefreshListener listener) {
this.refreshListener = listener;
}
/**
* 刷新时间
* @param refreshTime2
*/
private void setRefreshTime(Long time) {
// TODO Auto-generated method stub
}
/**
* 结束刷新事件
*/
public void finishRefresh(){
Log.i(TAG, "执行了=====finishRefresh");
LinearLayout.LayoutParams lp= (LinearLayout.LayoutParams)this.refreshView.getLayoutParams();
int i = lp.topMargin;
refreshIndicatorView.setVisibility(View.VISIBLE);
timeTextView.setVisibility(View.VISIBLE);
scroller.startScroll(0, i, 0, refreshTargetTop);
invalidate();
isRefreshing = false;
}
/*该方法一般和ontouchEvent 一起用
* (non-Javadoc)
* @see android.view.ViewGroup#onInterceptTouchEvent(android.view.MotionEvent)
*/
@Override
public boolean onInterceptTouchEvent(MotionEvent e) {
// TODO Auto-generated method stub
int action = e.getAction();
int y= (int) e.getRawY();
switch (action) {
case MotionEvent.ACTION_DOWN:
lastY = y;
break;
case MotionEvent.ACTION_MOVE:
//y移动坐标
int m = y - lastY;
//记录下此刻y坐标
this.lastY = y;
if(m > 6 && canScroll()){
return true;
}
break;
case MotionEvent.ACTION_UP:
break;
case MotionEvent.ACTION_CANCEL:
break;
}
return false;
}
private boolean canScroll() {
// TODO Auto-generated method stub
View childView;
if(getChildCount()>1){
childView = this.getChildAt(1);
if(childView instanceof ListView){
int top =((ListView)childView).getChildAt(0).getTop();
int pad =((ListView)childView).getListPaddingTop();
if((Math.abs(top-pad)) < 3&&
((ListView) childView).getFirstVisiblePosition() == 0){
return true;
}else{
return false;
}
}else if(childView instanceof Scro
没有合适的资源?快使用搜索试试~ 我知道了~
Android--开发--下拉刷新控件(ListView好ScrollView版).rar
共35个文件
class:11个
png:7个
xml:5个
需积分: 5 0 下载量 55 浏览量
2024-04-10
20:15:55
上传
评论
收藏 254KB RAR 举报
温馨提示
Android--开发--下拉刷新控件(ListView好ScrollView版)
资源推荐
资源详情
资源评论
收起资源包目录
Android--开发--下拉刷新控件(ListView好ScrollView版).rar (35个子文件)
Android--开发--下拉刷新控件(ListView好ScrollView版)
Android下拉刷新控件(ListView好ScrollView版)
Android下拉刷新控件(ListView好ScrollView版)
RefreshScroll
RefreshScroll
.classpath 280B
.settings
org.eclipse.jdt.core.prefs 208B
assets
src
com
nono
refreshDemo
RefreshScrollActivity.java 1KB
RefreshableView.java 8KB
res
drawable-mdpi
icon.png 3KB
drawable-ldpi
icon.png 2KB
values
colors.xml 103B
strings.xml 396B
layout
main.xml 4KB
refresh_top_item.xml 2KB
drawable-hdpi
app_bg.png 27KB
refresh_arrow_down.png 1KB
refresh_arrow_up.png 1KB
icon.png 4KB
item_bg.png 533B
bin
resources.ap_ 30KB
RefreshScroll.apk 37KB
classes.dex 9KB
com
nono
refreshDemo
RefreshScrollActivity.class 2KB
R$string.class 552B
R$layout.class 440B
RefreshableView$RefreshListener.class 303B
R$id.class 608B
RefreshableView.class 7KB
R$attr.class 346B
R$color.class 398B
RefreshScrollActivity$1.class 1KB
R$drawable.class 549B
R.class 595B
proguard.cfg 1KB
default.properties 362B
.project 849B
AndroidManifest.xml 695B
gen
com
nono
refreshDemo
R.java 2KB
RefreshScroll.rar 120KB
共 35 条
- 1
资源评论
温柔-的-女汉子
- 粉丝: 629
- 资源: 3938
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功