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" />