原理:就是动态改变ScrollView header的margin实现

主要的代码:

http://blog.csdn.net/swust_chenpeng/article/details/39289721

代码其实还是比较容易,但是但是,自己还是花了很多时间,脑袋瓜不够灵活呀...

下面是ScrollViewHeader的代码:

public class ScrollViewHeader extends RelativeLayout {  

    public final static int STATE_NORMAL = 0;
public final static int STATE_READY = 1;
public final static int STATE_REFRESHING = 2;
private final int ROTATE_ANIM_DURATION = 180;
private int topMargin = 0;
private int state = STATE_NORMAL;
private TextView refreshTv = null;
private TextView refreshTimeTv = null;
private ProgressBar refreshProgress = null;
private ImageView refreshArrow = null;
private Animation animationUp = null;
private Animation animationDown = null; public ScrollViewHeader(Context context) {
super(context);
// TODO Auto-generated constructor stub
if(!isInEditMode())
initView(context);
} public ScrollViewHeader(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
if(!isInEditMode())
initView(context);
} public ScrollViewHeader(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
if(!isInEditMode())
initView(context);
} /**
* 初始化相关的view
*/
public void initView(Context context) {
animationDown = new RotateAnimation(-180f, 0, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
animationDown.setDuration(ROTATE_ANIM_DURATION);
animationDown.setFillAfter(true);
animationUp = new RotateAnimation(0, -180f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
animationUp.setDuration(ROTATE_ANIM_DURATION);
animationUp.setFillAfter(true);
setPadding(10, 25, 10, 25);
View view = LayoutInflater.from(context).inflate(R.layout.scrollview_header, this, true);
refreshTv = (TextView) view.findViewById(R.id.refresh_text);
refreshTimeTv = (TextView) view.findViewById(R.id.refresh_time);
refreshProgress = (ProgressBar) view.findViewById(R.id.refresh_progress);
refreshArrow = (ImageView) view.findViewById(R.id.refresh_arrow);
} /**
* 设置scrollviewHeader的状态
* @param state
*/
public void setState(int state) {
if(this.state == state) {
return ;
}
switch (state) {
case STATE_NORMAL:
refreshTv.setText("下拉刷新");
refreshArrow.setVisibility(View.VISIBLE);
refreshProgress.setVisibility(View.INVISIBLE);
if(this.state == STATE_READY) {
refreshArrow.startAnimation(animationDown);
} else if(this.state == STATE_REFRESHING) {
refreshArrow.clearAnimation();
}
break;
case STATE_READY:
refreshTv.setText("松开刷新");
refreshArrow.setVisibility(View.VISIBLE);
refreshProgress.setVisibility(View.INVISIBLE);
refreshArrow.startAnimation(animationUp);
break;
case STATE_REFRESHING:
refreshTv.setText("正在加载...");
refreshProgress.setVisibility(View.VISIBLE);
refreshArrow.clearAnimation();
refreshArrow.setVisibility(View.INVISIBLE);
break;
default:
break;
}
this.state = state;
} /**
* 更新header的margin
* @param margin
*/
public void updateMargin(int margin) {
//这里用Linearlayout的原因是Headerview的父控件是scrollcontainer是一个linearlayout
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) this.getLayoutParams();
params.topMargin = margin;
topMargin = margin;
setLayoutParams(params);
} /**
* 获取header的margin
* @return
*/
public int getTopMargin() {
return topMargin;
}
}

header的布局文件,scrollview_header

<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android" > <LinearLayout
android:id="@+id/refresh_des"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:gravity="center"
android:orientation="vertical" > <TextView
android:id="@+id/refresh_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="下拉刷新" /> <TextView
android:id="@+id/refresh_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="5分钟前更新" />
</LinearLayout> <ProgressBar
android:id="@+id/refresh_progress"
android:layout_width="30dip"
android:layout_height="30dip"
android:layout_centerVertical="true"
android:layout_marginRight="10dip"
android:layout_toLeftOf="@id/refresh_des"
android:visibility="invisible" /> <ImageView
android:id="@+id/refresh_arrow"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginRight="10dip"
android:layout_toLeftOf="@id/refresh_des"
android:src="@drawable/arrow" /> </merge>

好了,相关的源码就只有3个文件...

分享一个可下拉刷新的ScrollView的更多相关文章

  1. [RN] React Native 使用 FlatList 和 ScrollView 的下拉刷新问题

    React Native 使用 FlatList 和 ScrollView 实现 下拉刷新时,RefreshControl 控件不起作用, 后来经查明,原来 RefreshControl 要加在 Sc ...

  2. 【微信小程序】scroll-view 的上拉加载和下拉刷新

    1.在微信小程序中,想到 下拉刷新 和 上拉加载,如果是整个页面都拖动的话,可以在页面配置中,配置 enablePullDownRefresh 和 onReachBottomDistance 然后在 ...

  3. scroll-view组件实现下拉刷新, 拉到底加载更多

    官方文档已声明,即使在page.json和app.json中开启下拉刷新,scroll-view组件也是不支持的.但我们可以通过曲线救国的方法来实现 实现代码 // wxml <scroll-v ...

  4. PullToRefresh使用详解(一)--构建下拉刷新的listView

    前言:前几天写了篇关于PullToRefresh控件的DEMO导入的博客,但由于当时没有用到,所以就没细往下讲,现在开始到了实战阶段,用到了PullToRefresh的listView样式,网上有讲的 ...

  5. UITableView:下拉刷新和上拉加载更多

    [转载请注明出处] 本文将说明让UIScrollView支持"下拉刷新"和"上拉加载更多"的实现机制,并实现一个可用的tableView子类,以下主要以&quo ...

  6. 指令汇B新闻客户端开发(三) 下拉刷新

    现在我们继续这个新闻客户端的开发,今天分享的是下拉刷新的实现,我们都知道下拉刷新是一个应用很常见也很实用的功能.我这个应用是通过拉ListView来实现刷新的,先看一张刷新的原理图 从图中可知,手指移 ...

  7. 安卓开发笔记——关于开源组件PullToRefresh实现下拉刷新和上拉加载(一分钟搞定,超级简单)

    前言 以前在实现ListView下拉刷新和上拉加载数据的时候都是去继承原生的ListView重写它的一些方法,实现起来非常繁杂,需要我们自己去给ListView定制下拉刷新和上拉加载的布局文件,然后添 ...

  8. iOS 下拉刷新-上拉加载原理

    前言 讲下拉刷新及上拉加载之前先给大家解释UIScrollView的几个属性 contentSize是UIScrollView可以滚动的区域. contentOfinset 苹果官方文档的解释是&qu ...

  9. Android下拉刷新底部操作栏的隐藏问题

    最近自己编写下拉刷新的时候,发现了一个问题,就是有一个需求是这样的:要求页面中是一个Tab切换界面,一个界面有底部操作栏,不可下拉刷新,另一个界面没有底部操作栏,但可以下拉刷新. 按照平常的做法,我在 ...

随机推荐

  1. 六、mybatis分页插件集成

    本文基于上一篇“集成mybatis”内容 1.添加依赖 <!-- mybatis-pageHelper --> <dependency> <groupId>com. ...

  2. Java 集合类常用方法

    Collection中的contains()方法和remove()方法. boolean contains(Object o);该方法是用来判断集合中是否包含某个元素,若包含,返回true,不包含返回 ...

  3. FusionCharts数据展示成饼状图、柱状图和折线图

    FusionCharts数据展示成饼状图.柱状图和折线图 本文以展示柱状图为例进行介绍,当然这仅仅是一种方法而已:还有很多方法可以用于展示图表,例如echarts,自定义图表标签.使用jfreecha ...

  4. three.js 在vscode的智能提示

    安装nodejs.启动或者重启vscode,打开控制台,输入命令 npm install --save @types/three 回车, 会多了个node_modules文件夹,再试试智能感知,出来. ...

  5. 微信公众号开发《三》微信JS-SDK之地理位置的获取与在线导航,集成百度地图实现在线地图搜索

    本次讲解微信开发第三篇:获取用户地址位置信息,是非常常用的功能,特别是服务行业公众号,尤为需要该功能,本次讲解的就是如何调用微信JS-SDK接口,获取用户位置信息,并结合百度地铁,实现在线地图搜索,与 ...

  6. 第1章 初识CSS3

    什么是CSS3? CSS3是CSS2的升级版本,3只是版本号,它在CSS2.1的基础上增加了很多强大的新功能. 目前主流浏览器chrome.safari.firefox.opera.甚至360都已经支 ...

  7. javaweb servlet jsp简单笔记

    第二章: 1: web 俗称 : 万维网  www 2: web开发 的三大核心: HTML(网页) ,URL(定位),HTTP:(协议) 页面的分类: 静态页面: html+css 动态页面:jsp ...

  8. Live2D 博客页面添加板娘

    偶然看到了live2d,神奇的二次元呀 在页脚Html代码中添加如下代码即可: <link rel="stylesheet" type="text/css" ...

  9. [算法练习]Two Sum

    题目说明: Given an array of integers, return indices of the two numbers such that they add up to a speci ...

  10. mysql游标的用法及作用

    1当前有三张表A.B.C其中A和B是一对多关系,B和C是一对多关系,现在需要将B中A表的主键存到C中:常规思路就是将B中查询出来然后通过一个update语句来更新C表就可以了,但是B表中有2000多条 ...