android listview 下拉动画,Android----单纯的下拉刷新ListView

目录

6696f9ddc6f3

无标题.png

演示

6696f9ddc6f3

gif5新文件 (1).gif

思路

1.设置can控制现在是不是可以滑动。

2.如果现在第一个可见元素position是0,设置可以滑动。

3.滑动的实现,本质上是用header的高度去控制。

4.全局只用currentHeight去控制当前滑动的量

demo

ListView的代码

package com.example.rtyui.androidteach.PullRefreshList;

import android.animation.Animator;

import android.animation.ObjectAnimator;

import android.animation.ValueAnimator;

import android.content.Context;

import android.graphics.drawable.AnimationDrawable;

import android.os.AsyncTask;

import android.util.AttributeSet;

import android.util.TypedValue;

import android.view.LayoutInflater;

import android.view.MotionEvent;

import android.view.View;

import android.view.ViewGroup;

import android.widget.ImageView;

import android.widget.ListView;

import android.widget.TextView;

import com.example.rtyui.androidteach.R;

/**

* Created by rtyui on 2018/5/3.

*/

public class PullRefreshListView extends ListView {

private final int HEADER_DP = 100;

private View header;

private float currentHeight = 0;

private float lastPosition = 0;

private PullRefreshInterface pullRefreshInterface;

private boolean can = false;

private ImageView imgHead;

private TextView tipHead;

public PullRefreshListView(Context context, AttributeSet attrs) {

super(context, attrs);

initHead(context);

addHeaderView(header, null, true);

setHeaderHeight();

setVerticalScrollBarEnabled(false);

setPadding(getPaddingLeft(), getPaddingTop() -1, getPaddingRight(), getPaddingBottom());

}

public void setPullRefreshInterface(PullRefreshInterface pullRefreshInterface) {

this.pullRefreshInterface = pullRefreshInterface;

can = true;

}

@Override

protected void onFinishInflate() {

super.onFinishInflate();

}

//处理touch事件

@Override

public boolean onTouchEvent(MotionEvent ev) {

if (can){

switch (ev.getAction()) {

case MotionEvent.ACTION_MOVE:

System.out.println(getFirstVisiblePosition() + " " + currentHeight);

if (getFirstVisiblePosition() == 0) {

if (lastPosition != 0) {

float temp = ev.getY() - lastPosition;

if (temp > -60 && temp < 60) {

currentHeight += temp > 0 ? calculateHeight(temp) : temp;

}

lastPosition = ev.getY();

if (currentHeight > 0) {

setHeaderHeight();

if (currentHeight > dp2px(HEADER_DP))

headStatu1();

else

headStatu0();

} else {

currentHeight = 0;

setHeaderHeight();

}

return true;

} else {

lastPosition = ev.getY();

}

}

break;

case MotionEvent.ACTION_UP:

lastPosition = 0;

if (currentHeight > dp2px(HEADER_DP)){

new MyAsyncTask().execute();

headStatu2();

can = false;

}

else if (currentHeight > 0){

replyView(currentHeight, 0);

}else{

currentHeight = 0;

setHeaderHeight();

}

break;

}

}

return super.onTouchEvent(ev);

}

/**

* dp转为px

* @param dp dp值

* @return

*/

private int dp2px(int dp) {

return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, getResources().getDisplayMetrics());

}

//下拉刷新

private void headStatu0(){

imgHead.setImageResource(R.drawable.down);

tipHead.setText("下拉刷新");

}

//释放立即刷新

private void headStatu1(){

imgHead.setImageResource(R.drawable.up);

tipHead.setText("释放立即刷新");

}

//正在刷新

private void headStatu2(){

imgHead.setImageResource(R.drawable.ss);

AnimationDrawable animationDrawable = (AnimationDrawable) imgHead.getDrawable();

animationDrawable.start();

tipHead.setText("正在刷新...");

}

//刷新成功

private void headStatu3(){

imgHead.setImageResource(R.drawable.succeed);

tipHead.setText("刷新成功");

}

/*

* 回弹

* @param distance 距离

* @param origin 终点

*/

private void replyView(final float distance, final int origin) {

// 设置动画

ValueAnimator anim = ObjectAnimator.ofFloat(distance - origin, 0.0F).setDuration(300);

anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {

@Override

public void onAnimationUpdate(ValueAnimator animation) {

currentHeight = (int) (origin + (Float) animation.getAnimatedValue());

System.out.println(currentHeight + "w wewe ");

setHeaderHeight();

if (currentHeight == 0)

can = true;

}

});

anim.start();

}

//初始化头部

private void initHead(Context context){

header = LayoutInflater.from(context).inflate(R.layout.pull_refresh_header, this, false);//我的头部

imgHead = header.findViewById(R.id.img);//我的头部图标

tipHead = header.findViewById(R.id.tip);//我的头部提示

}

private void setHeaderHeight(){

ViewGroup.LayoutParams layoutParams = header.getLayoutParams();

if (currentHeight <= 1)

layoutParams.height = 1;

else

layoutParams.height = (int) currentHeight;

header.setLayoutParams(layoutParams);

}

/**

* 计算滑动高度与实际要移动的高度的关系

* @param move 滑动高度

* @return

*/

private float calculateHeight(float move){

return move / 2;

}

private class MyAsyncTask extends AsyncTask {

@Override

protected Boolean doInBackground(Void... voids) {

boolean result = pullRefreshInterface.load_PullRefresh();

publishProgress(result);

if (result)

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

return result;

}

@Override

protected void onProgressUpdate(Boolean... values) {

super.onProgressUpdate(values);

if (values[0]){

headStatu3();

}else{

replyView(currentHeight, 0);

}

}

@Override

protected void onPreExecute() {

super.onPreExecute();

replyView(currentHeight, dp2px(HEADER_DP));

pullRefreshInterface.beforeLoad_PullRefresh();

}

@Override

protected void onPostExecute(Boolean aBoolean) {

super.onPostExecute(aBoolean);

replyView(currentHeight, 0);

pullRefreshInterface.afterLoad_PullRefresh(aBoolean);

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值