設置向下拉動更新。

 package com.mycompany.Scroll_test;

 import android.app.*;
import android.os.*;
import android.view.*;
import android.widget.*; /**
* 刷新控制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 ScrollView){
if(((ScrollView)childView).getScrollY() == 0){
return true;
}else{
return false;
}
} }
return false;
}
/**
* 刷新監聽接口
* @author Nono
*
*/
public interface RefreshListener{
public void onRefresh(RefreshableView view);
}}

安卓中級教程(5):ScrollView與refreshable之間的設置的更多相关文章

  1. 安卓中級教程(3):ScrollView

    以上是scrollview的圖例,可見srollview是一種滑動功能的控件,亦是非常常見的控件. 一般寫法如下: package com.mycompany.viewscroller; import ...

  2. 安卓中級教程(9):pathbutton中的animation.java研究(2)

    src/geniuz/myPathbutton/composerLayout.java package geniuz.myPathbutton; import com.nineoldandroids. ...

  3. 安卓中級教程(1):@InjectView

    package com.mycompany.hungry; import android.annotation.SuppressLint; import android.app.Activity; i ...

  4. 安卓中級教程(4):ScrollView與ListView之間的高度問題

    在scrollView中加插ListView是一個大難題.其中一個難題是Listview的高度難以計算,輸出效果往往強差人意,就讓我們看看當中的問題 . <LinearLayout xmlns: ...

  5. 安卓中級教程(10):@InjectView

    package com.example.android.db01; import android.app.Activity; import android.content.ContentValues; ...

  6. 安卓中級教程(8):pathbutton中的animation.java研究(1)

    src/geniuz/myPathbutton/myAnimations.java package geniuz.myPathbutton; import java.util.ArrayList; i ...

  7. 安卓中級教程(6):annotation的基本用法

    package com.example.ele_me.activity; import android.annotation.SuppressLint; import android.app.Acti ...

  8. 安卓中級教程(11):深入研究餓了麼的各個java檔運作關係(1)

    package com.example.ele_me.activity; import android.annotation.SuppressLint; import android.app.Acti ...

  9. 安卓中級教程(7):annotation中的 public @interface的用法

    package com.example.ele_me.util; import java.lang.annotation.Retention; import java.lang.annotation. ...

随机推荐

  1. codeblock 编译googletest

    1.cmake安装 2.codeblock  16.01 3.Google Test 1.7.0 4.PATH路径添加(重启电脑,保证设置的PATH路径生效) 5.python安装 6.编译安装:   ...

  2. C和指针 第十一章 动态内存分配

    声明数组时,必须指定数组长度,才可以编译,但是如果需要在运行时,指定数组的长度的话,那么就需要动态的分配内存. C函数库stdlib.h提供了两个函数,malloc和free,分别用于执行动态内存分配 ...

  3. linux常用命令-用户管理命令

    useradd 用户名 passwd 用户名:修改该用户的密码 groupadd 组名 who: 查看现在登录了几个用户,得到的信息含义如下 登录用户名 登录终端 登录时间 登录终端的IP地址(如果没 ...

  4. python set

    set是一个工厂函数(filter也是工厂函数),是一个可变的集合 frozenset 不可变的集合,与set共性,他也在内部自动去重, >>> num5=frozenset([1, ...

  5. centos 6.5 6.6 6.7安装gitlab教程(社区版)

    简单的说安装gitlab就两种办法主要介绍第一种:官网推荐的方法: 1.新建yum源 新建 /etc/yum.repos.d/gitlab-ce.repo,内容为 [gitlab-ce] name=g ...

  6. delphi xe4 ini文件不能读取的解决方法

    今天发现用inifiles下 tinifile.readstring方法突然不能读数据了,结果把ini文件格式由utf-8改成unicode后就能正常读取了.

  7. Java 深拷贝、浅拷贝及Cloneable接口

    Cloneable接口是一个空接口,仅用于标记对象,Cloneable接口里面是没有clone()方法,的clone()方法是Object类里面的方法!默认实现是一个Native方法 protecte ...

  8. Magento 创建新的数据实体 model 、 resource 和 collection 文件

    一.创建model文件 class Bestbuy_PrepaidCard_Model_Used extends Mage_Core_Model_Abstract {       protected ...

  9. C#反射机制 Type类型

    using System;using System.Collections.Generic;using System.Linq;using System.Reflection;using System ...

  10. Win32中TreeView控件的使用方法,类似于资源管理器中文件树形显示方式

    首先是头文件,内容如下: #include <tchar.h> #include "..\CommonFiles\CmnHdr.h" #include <Wind ...