仿QQ侧滑删除的另一种实现方法

  这个实现方法是不需要依赖任何jar包或库的,所以比较轻便

 


==================================================== SliderView   start=========================================================

package chen.www.swipelayout;

import android.content.Context;
import android.content.res.Resources;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.MotionEvent;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.Scroller;


public class SliderView extends LinearLayout {
    private static final String TAG = "SlideView";
    private static final int TAN = 2;
    private int mHolderWidth = 120;     //删除键的宽度
    private float mLastX = 0;
    private float mLastY = 0;
    private Context mContext;
    private LinearLayout mViewContent;
    private Scroller mScroller;

    public SliderView(Context context, Resources resources) {
        super(context);
        initView();
    }

    public SliderView(Context context) {
        super(context);
        initView();
    }

    public SliderView(Context context, AttributeSet attrs) {
        super(context, attrs);
        initView();
    }

    private void initView() {
        setOrientation(LinearLayout.HORIZONTAL);
        mContext = getContext();
        mScroller = new Scroller(mContext);
        View.inflate(mContext, R.layout.slide_view_merge, this);
        mViewContent = (LinearLayout) findViewById(R.id.view_content);
        //设置删除键的宽度
        mHolderWidth = Math.round(TypedValue.applyDimension(
                TypedValue.COMPLEX_UNIT_DIP, mHolderWidth, getResources()
                        .getDisplayMetrics()));
    }


    public void setContentView(View view) {
        mViewContent.addView(view);
    }

    public void shrink() {
        int offset = getScrollX();
        if (offset == 0) {
            return;
        }
        scrollTo(0, 0);
    }

    public void reset() {
        int offset = getScrollX();
        if (offset == 0) {
            return;
        }
        smoothScrollTo(0, 0);
    }

    public void adjust(boolean left) {
        int offset = getScrollX();
        if (offset == 0) {
            return;
        }

        //向左移动<20,复位,否则布局整体向左移动 mHolderWidth宽度
        if (offset < 20) {
            this.smoothScrollTo(0, 0);
        } else if (offset < mHolderWidth - 20) {
            if (left) {
                this.smoothScrollTo(mHolderWidth, 0);
            } else {
                this.smoothScrollTo(0, 0);
            }
        } else {
            this.smoothScrollTo(mHolderWidth, 0);
        }
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_MOVE:
                float x = event.getX();
                float y = event.getY();
                float deltaX = x - mLastX;
                float delatY = y - mLastY;
                mLastX = x;
                mLastY = y;
                if (Math.abs(deltaX) < Math.abs(delatY) * TAN) {
                    break;
                }
                if (deltaX != 0) {
                    float newScrollX = getScrollX() - deltaX;
                    if (newScrollX < 0) {
                        newScrollX = 0;
                    } else if (newScrollX > mHolderWidth) {
                        newScrollX = mHolderWidth;
                    }
                    this.scrollTo((int) newScrollX, 0);
                }
                break;
        }
        return super.onTouchEvent(event);
    }

    private void smoothScrollTo(int destX, int destY) {
        int scrollX = getScrollX();
        int delta = destX - scrollX;
        mScroller.startScroll(scrollX, 0, delta, 0, Math.abs(delta) * 3);
        invalidate();
    }

    @Override
    public void computeScroll() {
        if (mScroller.computeScrollOffset()) {
            scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
            postInvalidate();
        }
    }
}

==================================================== SliderViewend  ==============================================================



==================================================== SliderView xml  start==========================================================

<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <LinearLayout
        android:id="@+id/view_content"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#ffffff"
        android:orientation="horizontal" >
    </LinearLayout>

    <RelativeLayout
        android:id="@+id/holder"
        android:layout_width="120dp"
        android:layout_height="match_parent"
        android:layout_marginBottom="1dp"
        android:background="@drawable/holder_bg"
        android:clickable="true" >

        <TextView
            android:id="@+id/delete"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:gravity="center"
            android:text="删除"
            android:textSize="18sp"
            android:textColor="#ffffff" />
    </RelativeLayout>

</merge>

==================================================== SliderView xml  end  ==========================================================


==================================================== SliderListView start===========================================================

package chen.www.swipelayout;

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.ListView;

/**
 * Created by chenqiuping on 2016/12/6.
 */
public class SliderListView extends ListView {
    private static final String TAG = "SliderListView";
    private float mX = 0;
    private float mY = 0;
    private int mPosition = -1;
    private boolean isSlider = false;
    private SliderView mFocusedItemView;

    public SliderListView(Context context) {
        super(context);
    }

    public SliderListView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

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

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        float x = event.getX();
        float y = event.getY();
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                isSlider = false;
                mX = x;
                mY = y;
                int position = pointToPosition((int) x, (int) y);
                if (mPosition != position) {
                    mPosition = position;
                    if (mFocusedItemView != null) {
                        mFocusedItemView.reset();
                    }
                }
                break;
            case MotionEvent.ACTION_MOVE:
                if (mPosition != -1) {
                    if (Math.abs(mY - y) < 30 && Math.abs(mX - x) > 20) {
                        int first = this.getFirstVisiblePosition();
                        int index = mPosition - first;
                        mFocusedItemView = (SliderView) getChildAt(index);
                        mFocusedItemView.onTouchEvent(event);
                        isSlider = true;
                        return true;
                    }
                }
                break;
            case MotionEvent.ACTION_UP:
                if (isSlider) {
                    isSlider = false;
                    if (mFocusedItemView != null) {
                        mFocusedItemView.adjust(mX - x > 0);
                        return true;
                    }
                }
                break;
        }
        return super.onTouchEvent(event);
    }
}

==================================================== SliderListView end  ===========================================================

======================================================= MainActivity start =========================================================

package chen.www.swipelayout;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity implements OnItemClickListener,
        OnClickListener {

    private static final String TAG = "MainActivity";

    private SliderListView mListView;
    private  SlideAdapter adapter;

    private List<MessageItem> mMessageItems = new ArrayList<MainActivity.MessageItem>();

    private SliderView mLastSliderViewWithStatusOn;
    private int deletePostion;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }

    private void initView() {
        mListView = (SliderListView) findViewById(R.id.list);

        for (int i = 0; i < 10; i++) {
            MessageItem item = new MessageItem();
            item.title = i + " >> 标题";
            item.msg = "内容一 ";
            item.time = "时间 2016-11-7";
            mMessageItems.add(item);
        }
        adapter = new SlideAdapter();
        mListView.setAdapter(adapter);
        mListView.setOnItemClickListener(this);
    }

    private class SlideAdapter extends BaseAdapter {

        private LayoutInflater mInflater;

        SlideAdapter() {
            super();
            mInflater = getLayoutInflater();
        }

        @Override
        public int getCount() {
            return mMessageItems.size();
        }

        @Override
        public Object getItem(int position) {
            return mMessageItems.get(position);
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(final int position, View convertView, final ViewGroup parent) {
            ViewHolder holder;
            SliderView sliderView = (SliderView) convertView;
            if (sliderView == null) {
                View itemView = mInflater.inflate(R.layout.list_item, null);
                //item的布局添加到SliderView                sliderView = new SliderView(MainActivity.this);
                sliderView.setContentView(itemView);
                holder = new ViewHolder(sliderView);
                sliderView.setTag(holder);
            } else {
                holder = (ViewHolder) sliderView.getTag();
            }

            MessageItem item = mMessageItems.get(position);
            sliderView.shrink();

            holder.icon.setImageResource(item.iconRes);
            holder.title.setText(item.title);
            holder.msg.setText(item.msg);
            holder.time.setText(item.time);

            //点击删除
            holder.deleteHolder.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    mMessageItems.remove(position);
                    adapter.notifyDataSetChanged();
                }
            });


            return sliderView;
        }

    }

    public class MessageItem {
        public int iconRes;
        public String title;
        public String msg;
        public String time;
    }

    private static class ViewHolder {
        public ImageView icon;
        public TextView title;
        public TextView msg;
        public TextView time;
        public ViewGroup deleteHolder;

        ViewHolder(View view) {
            icon = (ImageView) view.findViewById(R.id.icon);
            title = (TextView) view.findViewById(R.id.title);
            msg = (TextView) view.findViewById(R.id.msg);
            time = (TextView) view.findViewById(R.id.time);
            deleteHolder = (ViewGroup) view.findViewById(R.id.holder);
        }
    }


    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position,
                            long id) {

    }

    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.holder) {
            Log.e(TAG, "onClick v=" + v);
            Toast.makeText(this, v + "", Toast.LENGTH_SHORT).show();

        }
    }
}


======================================================= MainActivity end ========================================================



==================================================== MainActivity  xml  start  =======================================================

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <chen.www.swipelayout.SliderListView
        android:id="@+id/list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#fff4f7f9"
        android:cacheColorHint="#00000000"
        android:divider="#dddbdb"
        android:dividerHeight="1.0px"
        android:drawSelectorOnTop="false"
        android:listSelector="#00000000"
        android:scrollbars="none"
        android:scrollingCache="false" />

</LinearLayout>

==================================================== MainActivity  xml  end  ========================================================


效果图如下: 




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值