安卓中級教程(5):ScrollView與refreshable之間的設置
設置向下拉動更新。
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之間的設置的更多相关文章
- 安卓中級教程(3):ScrollView
以上是scrollview的圖例,可見srollview是一種滑動功能的控件,亦是非常常見的控件. 一般寫法如下: package com.mycompany.viewscroller; import ...
- 安卓中級教程(9):pathbutton中的animation.java研究(2)
src/geniuz/myPathbutton/composerLayout.java package geniuz.myPathbutton; import com.nineoldandroids. ...
- 安卓中級教程(1):@InjectView
package com.mycompany.hungry; import android.annotation.SuppressLint; import android.app.Activity; i ...
- 安卓中級教程(4):ScrollView與ListView之間的高度問題
在scrollView中加插ListView是一個大難題.其中一個難題是Listview的高度難以計算,輸出效果往往強差人意,就讓我們看看當中的問題 . <LinearLayout xmlns: ...
- 安卓中級教程(10):@InjectView
package com.example.android.db01; import android.app.Activity; import android.content.ContentValues; ...
- 安卓中級教程(8):pathbutton中的animation.java研究(1)
src/geniuz/myPathbutton/myAnimations.java package geniuz.myPathbutton; import java.util.ArrayList; i ...
- 安卓中級教程(6):annotation的基本用法
package com.example.ele_me.activity; import android.annotation.SuppressLint; import android.app.Acti ...
- 安卓中級教程(11):深入研究餓了麼的各個java檔運作關係(1)
package com.example.ele_me.activity; import android.annotation.SuppressLint; import android.app.Acti ...
- 安卓中級教程(7):annotation中的 public @interface的用法
package com.example.ele_me.util; import java.lang.annotation.Retention; import java.lang.annotation. ...
随机推荐
- js 时间构造函数
js 时间构造函数,js中没有类似ToString("yyyy-mm-dd HH:mm:ss") 的方法,但是可以用下面的方式来初始化 var cdate = new Date(& ...
- RF执行顺序
case: 按照定义的上下位置顺序执行,通过Ctrl+上下方向键,来改变执行次序. 包含suite的目录:按字母顺序. suite: 按字母顺序执行.可以加01__xxx.txt这样的前缀来控制顺序.
- iOS 查询数组中的对象
简述:Cocoa框架中的NSPredicate用于查询,原理和用法都类似于SQL中的where,作用相当于数据库的过滤取. 定义(最常用到的方法): NSPredicate *ca = [NSPred ...
- js中选定元素slice()
选定元素slice() slice() 方法可从已有的数组中返回选定的元素. 语法 arrayObject.slice(start,end) 参数说明: 1.返回一个新的数组,包含从 start 到 ...
- Android笔记:HTTP相关
发送HTTP请求 HttpURLConnection.HttpClient XML解析 Pull 解析.SAX 解析.DOM 解析 解析JSON 格式数据 官方提供的JSONObject.谷歌的开源库 ...
- Struts2学习(一)
struts2 就是 web层开发框架,符合MVC模式 入门程序 创建web工程 导入jar包 下载struts2的jar包 struts-2.3.15.1-all 版本. 注意:在struts2开 ...
- 水晶报表初体验(Visual Studio 2010)
安装水晶报表后如下使用: 配置rpt文件,如图 前台(Asp.net页面): <%@ Register Assembly="CrystalDecisions.Web, Version= ...
- 2015ACM/ICPC亚洲区长春站
5532 Almost Sorted Array 题目大意:给你一个序列,如果它拿掉其中一个数后,可以是该序列成为非递减或非递增序列,则输出YES. 有两种思路,第一种代码比较简单,是LIS,复杂度n ...
- Node.js学习之简介
1.简单的说Node.js就是运行在服务端的javaScript: 2.Node.js是一个基于Chrome javaScript运行时建立的一个平台: 3.Node.js是一个事件驱动I/O服务端J ...
- PHP 检查并创建多级目录
<?php //检查并创建多级目录 function checkDir($path){ $pathArray = explode('/',$path); $no ...