ListView 返回到顶部浮动层

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.widget.AbsListView;
import android.widget.ImageView;
import android.widget.ListView;

import com.kidswant.ss.R;

/**
 * <解决左右划动与上下划动冲突>
 * <功能详细描述>
 *  mInterceptListView.setOnScrollListener(new InterceptListView.InterceptScrollListener(BitmapUtil.createPauseOnScrollListener(this), mInterceptListView));
 *  mInterceptListView.show2TopView(2);
 */
public class InterceptListView extends ListView
{
    private ImageView mImgBack2Top;
    private int mImgBack2TopMarginRight;
    private int mImgBack2TopMarginBottom;
    private int mImgBack2TopWidth;
    private int mImgBack2TopHeight;

    private int mShowPosition;

    public InterceptListView(Context context, AttributeSet attrs)
    {
        super(context, attrs);
    }
    
    public InterceptListView(Context context)
    {
        super(context);
    }
    
    public InterceptListView(Context context, AttributeSet attrs, int defStyle)
    {
        super(context, attrs, defStyle);
    }

    public void show2TopView(int showPosition)
    {
        mShowPosition = showPosition;
        ImageView view = (ImageView)LayoutInflater.from(getContext()).inflate(R.layout.back_top, this, false);
        view.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                setSelection(0);
                v.setVisibility(View.GONE);
            }
        });
        requestLayout();

        mImgBack2Top = view;
        mImgBack2TopMarginRight = dip2px(getContext(), 20);
        mImgBack2TopMarginBottom = dip2px(getContext(), 20);

    }

    private float xDistance, yDistance, xLast, yLast;
    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev)
    {
        switch (ev.getAction())
        {
            case MotionEvent.ACTION_DOWN:
                xDistance = yDistance = 0f;
                xLast = ev.getX();
                yLast = ev.getY();
                break;
            case MotionEvent.ACTION_MOVE:
                final float curX = ev.getX();
                final float curY = ev.getY();
                
                xDistance += Math.abs(curX - xLast);
                yDistance += Math.abs(curY - yLast);
                xLast = curX;
                yLast = curY;
                
                if (xDistance > yDistance)
                {
                    return false;
                }
        }
        return super.onInterceptTouchEvent(ev);
    }

    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        if (mImgBack2Top != null) {
            measureChild(mImgBack2Top, widthMeasureSpec, heightMeasureSpec);
            mImgBack2TopWidth = mImgBack2Top.getMeasuredWidth();
            mImgBack2TopHeight = mImgBack2Top.getMeasuredHeight();
        }
    }

    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
        super.onLayout(changed, left, top, right, bottom);
        if (mImgBack2Top != null) {

            mImgBack2Top.layout(right - mImgBack2TopMarginRight - mImgBack2TopWidth,
                    bottom - mImgBack2TopMarginBottom - mImgBack2TopHeight,
                    right - mImgBack2TopMarginRight,
                    bottom- mImgBack2TopMarginBottom);
        }
    }

    protected void dispatchDraw(Canvas canvas) {
        super.dispatchDraw(canvas);
        if (mImgBack2Top != null && mImgBack2Top.getVisibility() == View.VISIBLE) {
            drawChild(canvas, mImgBack2Top, getDrawingTime());
        }
    }


    private boolean mBack2TopDown;
    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                if (isBack2TopClick((int) event.getX(), (int) event.getY()))
                {
                    mBack2TopDown = true;
                    return true;
                }
                break;

            case MotionEvent.ACTION_UP:
                if(mBack2TopDown)
                {
                    if (isBack2TopClick((int)event.getX(), (int)event.getY()))
                    {
                        setSelection(0);
                        mImgBack2Top.setVisibility(View.GONE);
                        mBack2TopDown = false;
                        return true;
                    }
                }
                break;
        }
        return super.dispatchTouchEvent(event);
    }

    private boolean isBack2TopClick(int x, int y)
    {
        if(mImgBack2Top == null) return false;

        Rect outRect = new Rect();
        mImgBack2Top.getHitRect(outRect);
        return outRect.contains(x, y);
    }


    protected int getShowPosition()
    {
        return mShowPosition;
    }

    protected View getBack2TopView()
    {
        return mImgBack2Top;
    }


    private int dip2px(Context context, float dipValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dipValue * scale + 0.5f);
    }

    public static class InterceptScrollListener implements OnScrollListener {
        private final OnScrollListener externalListener;
        private InterceptListView mInterceptListView;

        public InterceptScrollListener(OnScrollListener customListener, InterceptListView interceptListView) {
            this.externalListener = customListener;
            this.mInterceptListView = interceptListView;
        }

        public void onScrollStateChanged(AbsListView view, int scrollState) {
            if(this.externalListener != null) {
                this.externalListener.onScrollStateChanged(view, scrollState);
            }

            View back2TopView = mInterceptListView.getBack2TopView();
            if(back2TopView != null)
            {
                switch (scrollState) {
                    case SCROLL_STATE_IDLE: // 滑动停止
                        int firstVisible = mInterceptListView.getFirstVisiblePosition();
                        if (firstVisible > mInterceptListView.getShowPosition()) {
                            if(back2TopView.getVisibility() != View.VISIBLE)
                            {
                                back2TopView.setVisibility(View.VISIBLE);
                            }
                        } else {
                            if(back2TopView.getVisibility() != View.GONE)
                            {
                                back2TopView.setVisibility(View.GONE);
                            }
                        }
                        break;
                    default:
                        break;
                }
            }

        }

        public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
            if(this.externalListener != null) {
                this.externalListener.onScroll(view, firstVisibleItem, visibleItemCount, totalItemCount);
            }
        }
    }

}


返回到顶部布局文件

<?xml version="1.0" encoding="utf-8"?>
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/back_to_top"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:scaleType="centerInside"
    android:src="@drawable/top"
    android:visibility="gone" />


转载于:https://my.oschina.net/bruces/blog/530271

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值