实例介绍
【实例简介】
【实例截图】
【核心代码】
package com.example.friendscircle;
import java.util.ArrayList;
import android.content.Context;
import android.graphics.Color;
import android.graphics.Rect;
import android.graphics.drawable.ColorDrawable;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewTreeObserver.OnPreDrawListener;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListView;
public class MyListView extends ListView implements OnScrollListener {
private View headView;
private int headViewHeight;
int currentScrollState;
private float lastDownY;
private int deltaCount;
private ArrayList<String> data;
private ArrayAdapter<String> adapter;
private int currentState;
private final int DECREASE_HEADVIEW_PADDING = 100;
private final int LOAD_DATA = 101;
private final int DISMISS_CIRCLE = 102;
private ImageView circle;
private int CircleMarginTop;
private int firstVisibleItem;
private Handler handler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case DECREASE_HEADVIEW_PADDING:
setHeadViewPaddingTop(deltaCount);
setCircleMargin();
break;
case LOAD_DATA:
// clearCircleViewMarginTop();
Thread thread = new Thread(new DismissCircleThread());
thread.start();
currentState = LoadState.LOADSTATE_IDLE;
if (adapter != null) {
adapter.notifyDataSetChanged();
}
break;
case DISMISS_CIRCLE:
int margin = msg.arg1;
setCircleMargin(margin);
if (margin == 0) {
CircleAnimation.stopRotateAnmiation(circle);
}
break;
}
}
};
protected void setCircleMargin(int margin) {
MarginLayoutParams lp = (MarginLayoutParams) circle.getLayoutParams();
lp.topMargin = margin;
circle.setLayoutParams(lp);
}
protected void setCircleMargin() {
// TODO Auto-generated method stub
MarginLayoutParams lp = (MarginLayoutParams) circle.getLayoutParams();
lp.topMargin = CircleMarginTop - headView.getPaddingTop();
circle.setLayoutParams(lp);
}
private class DecreaseThread implements Runnable {
private final static int TIME = 25;
private int decrease_length;
public DecreaseThread(int count) {
decrease_length = count / TIME;
}
@Override
public void run() {
for (int i = 0; i < TIME; i ) {
if (i == 24) {
deltaCount = 0;
} else {
deltaCount = deltaCount - decrease_length;
try {
Thread.sleep(10);
} catch (InterruptedException e) {
}
}
Message msg = Message.obtain();
msg.what = DECREASE_HEADVIEW_PADDING;
handler.sendMessage(msg);
}
}
}
public MyListView(Context context, ArrayList<String> dataList) {
this(context);
this.data = dataList;
}
public MyListView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
initHeadView(context);
}
public MyListView(Context context) {
super(context);
// TODO Auto-generated constructor stub
initHeadView(context);
}
public MyListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
initHeadView(context);
}
private void initHeadView(Context context) {
headView = LayoutInflater.from(context).inflate(R.layout.header, null);
addHeaderView(headView);
circle = (ImageView) headView.findViewById(R.id.circleprogress);
headView.getViewTreeObserver().addOnPreDrawListener(
new OnPreDrawListener() {
@Override
public boolean onPreDraw() {
if (headView.getMeasuredHeight() > 0) {
headViewHeight = headView.getMeasuredHeight();
headView.getViewTreeObserver()
.removeOnPreDrawListener(this);
}
return true;
}
});
setOnScrollListener(this);
currentScrollState = OnScrollListener.SCROLL_STATE_IDLE;
currentState = LoadState.LOADSTATE_IDLE;
firstVisibleItem = 0;
CircleMarginTop = 76;
setSelector(new ColorDrawable(Color.TRANSPARENT));
setItemsCanFocus(true);
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
// TODO Auto-generated method stub
float downY = ev.getY();
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
lastDownY = downY;
break;
}
return super.dispatchTouchEvent(ev);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
float downY = event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_UP:
if (deltaCount > 0 && currentState != LoadState.LOADSTATE_LOADING
&& firstVisibleItem == 0
&& headView.getBottom() >= headViewHeight) {
decreasePadding(deltaCount);
loadDataForThreeSecond();
startCircleAnimation();
}
break;
case MotionEvent.ACTION_MOVE:
int nowDeltaCount = (int) ((downY - lastDownY) / 3.0);
int grepDegree = nowDeltaCount - deltaCount;
deltaCount = nowDeltaCount;
if (deltaCount > 0 && currentState != LoadState.LOADSTATE_LOADING
&& firstVisibleItem == 0
&& headView.getBottom() >= headViewHeight) {
setHeadViewPaddingTop(deltaCount);
setCircleViewStay();
CircleAnimation.startCWAnimation(circle,
5 * (deltaCount - grepDegree), 5 * deltaCount);
}
break;
}
return super.onTouchEvent(event);
}
private void startCircleAnimation() {
// TODO Auto-generated method stub
CircleAnimation.startRotateAnimation(circle);
}
private class DismissCircleThread implements Runnable {
private final int COUNT = 10;
private final int deltaMargin;
public DismissCircleThread() {
deltaMargin = CircleMarginTop / COUNT;
}
@Override
public void run() {
// TODO Auto-generated method stub
int temp = 0;
for (int i = 0; i <= COUNT; i ) {
if (i == 10) {
temp = 0;
} else {
temp = CircleMarginTop - deltaMargin * i;
try {
Thread.sleep(10);
} catch (InterruptedException e) {
}
}
Message msg = Message.obtain();
msg.what = DISMISS_CIRCLE;
msg.arg1 = temp;
handler.sendMessage(msg);
}
}
}
private void setCircleViewStay() {
// TODO Auto-generated method stub
if (headView.getPaddingTop() > (CircleMarginTop)) {
MarginLayoutParams lp = (MarginLayoutParams) circle
.getLayoutParams();
lp.topMargin = CircleMarginTop - headView.getPaddingTop();
circle.setLayoutParams(lp);
}
}
private void loadDataForThreeSecond() {
currentState = LoadState.LOADSTATE_LOADING;
data.add("New Data");
Message msg = Message.obtain();
msg.what = LOAD_DATA;
handler.sendMessageDelayed(msg, 3000);
}
public void setAdapter(ArrayAdapter<String> adapter) {
super.setAdapter(adapter);
this.adapter = adapter;
}
private void setHeadViewPaddingTop(int deltaY) {
headView.setPadding(0, deltaY, 0, 0);
}
private void decreasePadding(int count) {
Thread thread = new Thread(new DecreaseThread(count));
thread.start();
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
// TODO Auto-generated method stub
// System.out.println(headView.getHeight());
this.firstVisibleItem = firstVisibleItem;
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
// TODO Auto-generated method stub
switch (scrollState) {
case SCROLL_STATE_FLING:
currentScrollState = SCROLL_STATE_FLING;
break;
case SCROLL_STATE_IDLE:
currentScrollState = SCROLL_STATE_IDLE;
break;
case SCROLL_STATE_TOUCH_SCROLL:
currentScrollState = SCROLL_STATE_TOUCH_SCROLL;
break;
}
}
}
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明


网友评论
我要评论