基于android的计步器文档,基于Android的计步器(Pedometer)的讲解(六)
计步器(Pedometer)整个项目的源代码,最近做了比较大的修改,可能以前下载的不能运行,感兴趣的朋友可以下载来看看(记得帮小弟在github打个星~) https://github.com/296777513/pedometer 今天实现实现的下拉刷新的功能,先上几张效果图: 如图所示,今天就
计步器(Pedometer)整个项目的源代码,最近做了比较大的修改,可能以前下载的不能运行,感兴趣的朋友可以下载来看看(记得帮小弟在github打个星~)
https://github.com/296777513/pedometer
今天实现实现的下拉刷新的功能,先上几张效果图:
如图所示,今天就是要实现的这个效果
首先,分析ListView下拉刷新实现方式
1、需要添加顶部下拉加载页面
2、需要监听onScrollListener来判断当前是否显示在listview的最顶部
3、因为顶部下拉加载界面是跟随手势滑动状态不断改变界面显示的所以我们需要监听onTouch事件,来改变当前状态以及界面显示;
4、根据当前状态加载数据
一下是ReFlashListView下拉刷新类的代码
package com.example.listviewfreshdemo1;
import java.text.SimpleDateFormat;
import java.util.Date;
import android.annotation.SuppressLint;
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.RotateAnimation;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
public class ReFlashListView extends ListView implements OnScrollListener {
private View header;// 顶部布局文件;
int headerHeight;// 顶部布局文件的高度;
int firstVisibleItem;// 当前第一个可见的item的位置;
int scrollState;// listview 当前滚动状态;
boolean isRemark;// 标记,当前是在listview最顶端摁下的;
int startY;// 摁下时的Y值;
int state;// 当前的状态;
final int NONE = 0;// 正常状态;
final int PULL = 1;// 提示下拉状态;
final int RELESE = 2;// 提示释放状态;
final int REFLASHING = 3;// 刷新状态;
private IReflashListener iReflashListener;// 刷新数据的接口
public ReFlashListView(Context context) {
super(context);
// TODO Auto-generated constructor stub
initView(context);
}
public ReFlashListView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
initView(context);
}
public ReFlashListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
initView(context);
}
/**
* 初始化界面,添加顶部布局文件到 listview
*
* @param context
*/
private void initView(Context context) {
LayoutInflater inflater = LayoutInflater.from(context);
header = inflater.inflate(R.layout.header, null);//加载顶部布局文件
measureView(header);
headerHeight = header.getMeasuredHeight();
Log.i("tag", "headerHeight = " + headerHeight);
topPadding(-headerHeight);
this.addHeaderView(header);
this.setOnScrollListener(this);
}
/**
* 通知父布局,占用的宽,高;
*
* @param view
*/
private void measureView(View view) {
ViewGroup.LayoutParams p = view.getLayoutParams();
if (p == null) {
p = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
}
int width = ViewGroup.getChildMeasureSpec(0, 0, p.width);
int height;
int tempHeight = p.height;
if (tempHeight > 0) {
height = MeasureSpec.makeMeasureSpec(tempHeight,
MeasureSpec.EXACTLY);
} else {
height = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
}
view.measure(width, height);
}
/**
* 设置header 布局 上边距;
*
* @param topPadding
*/
private void topPadding(int topPadding) {
header.setPadding(header.getPaddingLeft(), topPadding,
header.getPaddingRight(), header.getPaddingBottom());
header.invalidate();
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
this.firstVisibleItem = firstVisibleItem;
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
this.scrollState = scrollState;
}
@SuppressLint("ClickableViewAccessibility")
@Override
public boolean onTouchEvent(MotionEvent ev) {
// TODO Auto-generated method stub
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
if (firstVisibleItem == 0) {
isRemark = true;
startY = (int) ev.getY();
}
break;
case MotionEvent.ACTION_MOVE:
onMove(ev);
break;
case MotionEvent.ACTION_UP:
if (state == RELESE) {
state = REFLASHING;
// 加载最新数据;
reflashViewByState();
iReflashListener.onReflash();
} else if (state == PULL) {
state = NONE;
isRemark = false;
reflashViewByState();
}
break;
}
return super.onTouchEvent(ev);
}
/**
* 判断移动过程操作;
*
* @param ev
*/
private void onMove(MotionEvent ev) {
if (!isRemark) {
return;
}
int tempY = (int) ev.getY();
int space = tempY - startY;
int topPadding = space - headerHeight;
switch (state) {
case NONE:
if (space > 0) {
state = PULL;
reflashViewByState();
}
break;
case PULL:
topPadding(topPadding);
if (space > headerHeight + 30
&& scrollState == SCROLL_STATE_TOUCH_SCROLL) {
state = RELESE;
reflashViewByState();
}
break;
case RELESE:
topPadding(topPadding);
if (space < headerHeight + 30) {
state = PULL;
reflashViewByState();
} else if (space <= 0) {
state = NONE;
isRemark = false;
reflashViewByState();
}
break;
}
}
/**
* 根据当前状态,改变界面显示;
*/
private void reflashViewByState() {
TextView tip = (TextView) header.findViewById(R.id.tip);
ImageView arrow = (ImageView) header.findViewById(R.id.arrow);
ProgressBar progress = (ProgressBar) header.findViewById(R.id.progress);
RotateAnimation anim = new RotateAnimation(0, 180,
RotateAnimation.RELATIVE_TO_SELF, 0.5f,
RotateAnimation.RELATIVE_TO_SELF, 0.5f);
anim.setDuration(500);
anim.setFillAfter(true);
RotateAnimation anim1 = new RotateAnimation(180, 0,
RotateAnimation.RELATIVE_TO_SELF, 0.5f,
RotateAnimation.RELATIVE_TO_SELF, 0.5f);
anim1.setDuration(500);
anim1.setFillAfter(true);
switch (state) {
case NONE:
arrow.clearAnimation();
topPadding(-headerHeight);
break;
case PULL:
arrow.setVisibility(View.VISIBLE);
progress.setVisibility(View.GONE);
tip.setText("下拉可以刷新!");
arrow.clearAnimation();
arrow.setAnimation(anim1);
break;
case RELESE:
arrow.setVisibility(View.VISIBLE);
progress.setVisibility(View.GONE);
tip.setText("松开可以刷新!");
arrow.clearAnimation();
arrow.setAnimation(anim);
break;
case REFLASHING:
topPadding(50);
arrow.setVisibility(View.GONE);
progress.setVisibility(View.VISIBLE);
tip.setText("正在刷新...");
arrow.clearAnimation();
break;
}
}
/**
* 获取完数据;
*/
public void reflashComplete() {
state = NONE;
isRemark = false;
reflashViewByState();
TextView lastupdatetime = (TextView) header
.findViewById(R.id.freshTime);
SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日 hh:mm:ss");
Date date = new Date(System.currentTimeMillis());
String time = format.format(date);
lastupdatetime.setText(time);
}
public void setInterface(IReflashListener iReflashListener) {
this.iReflashListener = iReflashListener;
}
/**
* 刷新数据接口
*
* @author Administrator
*/
public interface IReflashListener {
public void onReflash();
}
}
实现刷新页面的测试类代码
基于android的计步器文档,基于Android的计步器(Pedometer)的讲解(六)相关推荐
- 微博Android平台SDK文档
博Android平台SDK文档 编号:WEIBO_ANDROID_SDK 版本:WEIBO_ANDROID_SDK V3.1.2 修订记录: 时间 文档版本 修订人 备注 2012/7/20 2.0. ...
- android 开放平台开发,OPPO开放平台上线Android 12适配文档
OPPO 近日悄然在开放平台添加了 Android 12 适配文档,该文档可帮助 App 开发者更好地兼容 Android 12. 虽然文档内还没有任何内容,但这标志着 OPPO 已经开始了 Andr ...
- android制作开放平台,OPPO 开放平台上线 Android 12 适配文档
IT之家 5 月 17 日消息OPPO 近日悄然在开放平台添加了 Android 12 适配文档,该文档可帮助 App 开发者更好地兼容 Android 12. 虽然文档内还没有任何内容,但这标志着 ...
- 使用android SDk帮助文档(英文) 下载中文SDK帮助文档(中文)
2019独角兽企业重金招聘Python工程师标准>>> 其实android sdk本身里面包含了很多开发帮助文档(英文版).具体的使用步骤如下 1.打开sdk下载帮助文档目录 我的安 ...
- android 英文帮助文档地址,使用android SDk帮助文档(英文) 下载中文SDK帮助文档(中文)...
其实android sdk本身里面包含了很多开发帮助文档(英文版).具体的使用步骤如下 1.打开sdk下载帮助文档目录 我的安装目录在 C:\Program Files\Android\android ...
- android Word 显示文档结构图
今天,简单讲讲android里浏览Word文档时,如何显示文档的文档结构图. 这个其实也很简单,之前我把自己用WPS写成的文档发送给领导查看,他用的是Word查看的文档,所以没有显示我在WPS上设置的 ...
- CTS(16 )---Android 兼容性定义文档
Android 兼容性定义文档 欢迎阅读 Android 兼容性定义文档 (CDD).本文档列举了设备需要满足哪些要求才能与最新的 Android 版本兼容.为了与 Android 兼容,设备实现必须 ...
- MFC中 给基于CFormView的单文档添加背景图片
关于基于CFormView的单文档应用程序,添加一个图片背景的方法之一如下: 下面是利用LoadImage实现.(先在程序目录中添加背景图片back.bmp) 1.在view类中添加类成员变量:(为C ...
- (一)JAVA基于OPENXML的word文档插入、合并、替换操作系列之基础篇
(一)JAVA基于OPENXML的word文档插入.合并.替换操作系列之基础篇 前言 什么是Open Xml? Open XML SDK 这系列笔记要做点什么? 涉及技术点 关于word.openxm ...
最新文章
- 微信端图片上传方式2
- Laravel项目上线部署
- 通俗易懂的讲解区块链
- AngularJs Cookie 的使用
- php汉字转换拼音,PHP汉字转换拼音的函数代码
- 平台游戏中走与跳的实现
- 使用nmap扫描提示utf-8编码错误_Web漏洞扫描神器Nikto使用指南
- android 获取服务对象,android 如何取得正在运行的service对象
- 从操作系统层面分析Java IO演进之路
- c构造函数和析构函数_C ++构造函数和析构函数| 查找输出程序| 套装2
- Lua-Nginx-Module常用指令(下)
- treetable怎么带参数_VUE treeTable 自定义方法怎么传递
- CentOS 8 下载安装stress实际操作以及实际应用,以及遇到的问题
- 引入YouTube视频自动控制开始和暂停
- 区分度评估指标-KS
- Matplotlib系列(一):快速绘图入门
- 2016.3.18华为上机题:拼音转数字
- 图文详解 | 万用表的使用与口诀!十足干货,不要错过!
- 【机器学习】Radius Neighbors Classifier(rNN,radius nearest neighbors)
- 实例:用C#.NET手把手教你做微信公众号开发(20)--使用微信支付线上收款:jsapi方式
热门文章
- 【百度网盘】二维码不显示,账号密码无法登录,显示百度认证无法访问此页
- Java基础知识 廖雪峰教程笔记
- CloudCompare:点云间重叠区可视化对比
- 单细胞论文记录(part22)--Giotto: a toolbox for integrative analysis and visualization of spatial expression
- PostgreSQL 报ERROR: column c.relhasoids does not exist
- Vs2017 窗口移动vs直接卡死
- 将两个有相连关系的数据表进行归类
- Echarts实现堆叠图
- 计算机科学与基础 简答题,计算机科学基础习题与解析
- drools-insert与update