基本信息
源码名称:android 仿朋友圈动态 源码(listview入门示例)
源码大小:11.70M
文件格式:.zip
开发语言:Java
更新时间:2018-02-12
友情提示:(无需注册或充值,赞助后即可获取资源下载链接)
嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300
本次赞助数额为: 2 元×
微信扫码支付:2 元
×
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
源码介绍
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; } } }