Android 侧滑删除功能

来源:互联网 发布:传奇手游源码 编辑:程序博客网 时间:2024/05/22 10:35

重定义listview

import android.content.Context;import android.util.AttributeSet;import android.view.MotionEvent;import android.widget.ListView;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 SlideView 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);}@Overridepublic 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 = (SlideView) getChildAt(index);// mFocusedItemView = (SlideView)// getItemAtPosition(mPosition);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);}}


滑动view

import android.content.Context;import android.content.res.Resources;import android.util.AttributeSet;import android.util.TypedValue;import android.view.LayoutInflater;import android.view.MotionEvent;import android.view.View;import android.widget.LinearLayout;import android.widget.Scroller;import android.widget.TextView;import com.future.wodownloadmanager.R;public class SlideView 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 LinearLayout mViewContent;private Scroller mScroller;private Context mContext;private Resources mResources;private SlideView(Context context) {super(context);initView(null, null, null);}public SlideView(Context context, Resources resources, View content) {super(context);this.mContext = context;this.mResources = resources;initView(context, resources, content);}private SlideView(Context context, AttributeSet attrs) {super(context, attrs);initView(null, null, null);}private void initView(Context context, Resources resources, View content) {setOrientation(LinearLayout.HORIZONTAL);mScroller = new Scroller(context);LayoutInflater.from(context).inflate(resources.getLayout(R.layout.slide_view_merge), this);findViewById(R.id.holder).setBackground(resources.getDrawable(R.drawable.selector_slider_holder));TextView delete = (TextView) findViewById(R.id.delete);delete.setCompoundDrawablesWithIntrinsicBounds(resources.getDrawable(R.drawable.ic_delete), null, null, null);mViewContent = (LinearLayout) findViewById(R.id.view_content);mHolderWidth = Math.round(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, mHolderWidth, getResources().getDisplayMetrics()));if (content != null) {mViewContent.addView(content);}}public void shrink() {int offset = getScrollX();if (offset == 0) {return;}scrollTo(0, 0);}public void setContentView(View view) {if (mViewContent != null) {mViewContent.addView(view);}}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;}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);}}@Overridepublic 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();}@Overridepublic void computeScroll() {if (mScroller.computeScrollOffset()) {scrollTo(mScroller.getCurrX(), mScroller.getCurrY());postInvalidate();}}}


获取view是需要重置缓存状态

public View getView(final int position, View convertView,
ViewGroup parent) 


slideview.shrink()


布局文件

<?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:orientation="horizontal" >    </LinearLayout>    <RelativeLayout        android:id="@+id/holder"        android:layout_width="120dp"        android:layout_height="match_parent"        android:layout_marginBottom="1dp"        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:textColor="#fff" />    </RelativeLayout></merge>


<?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android">    <item android:drawable="@color/holder_pressed" android:state_pressed="true"></item>    <item android:drawable="@color/holder_pressed" android:state_focused="true"></item>    <item android:drawable="@color/holder_pressed" android:state_selected="true"></item>    <item android:drawable="@color/holder_normal"></item></selector>

    <color name="holder_normal">#E84A40</color>    <color name="holder_pressed">#E22F2F</color>




代码:http://download.csdn.net/detail/hknock/8877003



1 0
原创粉丝点击