先上MainActivityjava
package com.example.main; import android.app.Activity; import android.widget.ListView; import com.example.adapter.SwipeAdapter; import com.example.helloworld.R; import com.example.view.SwipeListView; public class FragmentTestActivity extends Activity { private SwipeListView lv = null; protected void onCreate(android.os.Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.frame_test); lv = (SwipeListView)findViewById(R.id.lv); SwipeAdapter adapter = new SwipeAdapter(this); lv.setAdapter(adapter); } }
接下來上一個正式數據和一個側滑出來的數據的xmlandroid
test02--側滑後的數據app
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="測試數據"/> </LinearLayout>
test01數據框架
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="5dp" android:text="測試數據"/> </LinearLayout>
接下來是ide
frame_test佈局
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <com.xinnonbao.cehuaaaaaaaaaaaaaaa.SwipeListView android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/lv"> </com.xinnonbao.cehuaaaaaaaaaaaaaaa.SwipeListView> </LinearLayout>
下面是能夠直接拷貝做爲工具類的四個工具
第一個------------------佈局
package com.xinnonbao.cehuaaaaaaaaaaaaaaa; import android.app.Activity; import java.lang.annotation.Annotation; import java.lang.reflect.Field; public final class Interpretor { private final Activity mActivity; private Interpretor(Activity activity) { mActivity = activity; } /** * Gets an {@link Interpretor} capable of injecting fields for the given * Activity. */ public static Interpretor get(Activity activity) { return new Interpretor(activity); } /** * Injects all fields that are marked with the {@link InterpretView} * annotation. * <p> * For each field marked with the InjectView annotation, a call to * {@link Activity#findViewById(int)} will be made, passing in the resource * id stored in the value() method of the InjectView annotation as the int * parameter, and the result of this call will be assigned to the field. * * @throws IllegalStateException * if injection fails, common causes being that you have used an * invalid id value, or you haven't called setContentView() on * your Activity. */ public void inject() { for (Field field : mActivity.getClass().getDeclaredFields()) { for (Annotation annotation : field.getAnnotations()) { if (annotation.annotationType().equals(InterpretView.class)) { try { Class<?> fieldType = field.getType(); int idValue = InterpretView.class.cast(annotation).value(); field.setAccessible(true); Object injectedValue = fieldType.cast(mActivity .findViewById(idValue)); if (injectedValue == null) { throw new IllegalStateException("findViewById(" + idValue + ") gave null for " + field + ", can't inject"); } field.set(mActivity, injectedValue); field.setAccessible(false); } catch (IllegalAccessException e) { throw new IllegalStateException(e); } } } } } }
第二個----------------------post
package com.xinnonbao.cehuaaaaaaaaaaaaaaa; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target({ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) public @interface InterpretView { public int value(); }
第三個測試
package com.xinnonbao.cehuaaaaaaaaaaaaaaa; import android.support.v4.widget.ScrollerCompat; import android.view.MotionEvent; import android.view.View; import android.view.animation.Interpolator; import android.widget.AbsListView; import android.widget.FrameLayout; public class SwipeItemLayout extends FrameLayout { private View contentView = null; private View menuView = null; private Interpolator closeInterpolator = null; private Interpolator openInterpolator = null; private ScrollerCompat mOpenScroller; private ScrollerCompat mCloseScroller; private int mBaseX; private int mDownX; private int state = STATE_CLOSE; private static final int STATE_CLOSE = 0; private static final int STATE_OPEN = 1; public SwipeItemLayout(View contentView,View menuView,Interpolator closeInterpolator, Interpolator openInterpolator){ super(contentView.getContext()); this.contentView = contentView; this.menuView = menuView; this.closeInterpolator = closeInterpolator; this.openInterpolator = openInterpolator; init(); } private void init(){ setLayoutParams(new AbsListView.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)); if (closeInterpolator != null) { mCloseScroller = ScrollerCompat.create(getContext(), closeInterpolator); } else { mCloseScroller = ScrollerCompat.create(getContext()); } if (openInterpolator != null) { mOpenScroller = ScrollerCompat.create(getContext(), openInterpolator); } else { mOpenScroller = ScrollerCompat.create(getContext()); } LayoutParams contentParams = new LayoutParams( LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); contentView.setLayoutParams(contentParams); menuView.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); addView(contentView); addView(menuView); } public boolean onSwipe(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: mDownX = (int) event.getX(); break; case MotionEvent.ACTION_MOVE: // Log.i("byz", "downX = " + mDownX + ", moveX = " + event.getX()); int dis = (int) (mDownX - event.getX()); if (state == STATE_OPEN) { dis += menuView.getWidth(); } swipe(dis); break; case MotionEvent.ACTION_UP: if ((mDownX - event.getX()) > (menuView.getWidth() / 2)) { // open smoothOpenMenu(); } else { // close smoothCloseMenu(); return false; } break; } return true; } public boolean isOpen() { return state == STATE_OPEN; } private void swipe(int dis) { if (dis > menuView.getWidth()) { dis = menuView.getWidth(); } if (dis < 0) { dis = 0; } contentView.layout(-dis, contentView.getTop(), contentView.getWidth() - dis, getMeasuredHeight()); menuView.layout(contentView.getWidth() - dis, menuView.getTop(), contentView.getWidth() + menuView.getWidth() - dis, menuView.getBottom()); } @Override public void computeScroll() { if (state == STATE_OPEN) { if (mOpenScroller.computeScrollOffset()) { swipe(mOpenScroller.getCurrX()); postInvalidate(); } } else { if (mCloseScroller.computeScrollOffset()) { swipe(mBaseX - mCloseScroller.getCurrX()); postInvalidate(); } } } public void smoothCloseMenu() { state = STATE_CLOSE; mBaseX = -contentView.getLeft(); System.out.println(mBaseX); mCloseScroller.startScroll(0, 0, mBaseX, 0, 350); postInvalidate(); } public void smoothOpenMenu() { state = STATE_OPEN; mOpenScroller.startScroll(-contentView.getLeft(), 0, menuView.getWidth(), 0, 350); postInvalidate(); } public void closeMenu() { if (mCloseScroller.computeScrollOffset()) { mCloseScroller.abortAnimation(); } if (state == STATE_OPEN) { state = STATE_CLOSE; swipe(0); } } public void openMenu() { if (state == STATE_CLOSE) { state = STATE_OPEN; swipe(menuView.getWidth()); } } public View getContentView() { return contentView; } public View getMenuView() { return menuView; } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); menuView.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec( getMeasuredHeight(), MeasureSpec.EXACTLY)); } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { contentView.layout(0, 0, getMeasuredWidth(), contentView.getMeasuredHeight()); menuView.layout(getMeasuredWidth(), 0, getMeasuredWidth() + menuView.getMeasuredWidth(), contentView.getMeasuredHeight()); // setMenuHeight(mContentView.getMeasuredHeight()); // bringChildToFront(mContentView); } }
第四個this
package com.xinnonbao.cehuaaaaaaaaaaaaaaa; import android.content.Context; import android.support.v4.view.MotionEventCompat; import android.util.AttributeSet; import android.util.TypedValue; import android.view.MotionEvent; import android.view.View; import android.view.animation.Interpolator; import android.widget.ListView; public class SwipeListView extends ListView { private static final int TOUCH_STATE_NONE = 0; private static final int TOUCH_STATE_X = 1; private static final int TOUCH_STATE_Y = 2; private int MAX_Y = 5; private int MAX_X = 3; private float mDownX; private float mDownY; private int mTouchState; private int mTouchPosition; private SwipeItemLayout mTouchView; // private OnSwipeListener mOnSwipeListener; // private OnMenuItemClickListener mOnMenuItemClickListener; private Interpolator mCloseInterpolator; private Interpolator mOpenInterpolator; public SwipeListView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); // TODO Auto-generated constructor stub init(); } public SwipeListView(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub init(); } public SwipeListView(Context context) { super(context); // TODO Auto-generated constructor stub init(); } private void init() { MAX_X = dp2px(MAX_X); MAX_Y = dp2px(MAX_Y); mTouchState = TOUCH_STATE_NONE; } // @Override // public void setAdapter(ListAdapter adapter) { // super.setAdapter(new SwipeMenuAdapter(getContext(), adapter) { // @Override // public void createMenu(SwipeMenu menu) { // if (mMenuCreator != null) { // mMenuCreator.create(menu); // } // } // // @Override // public void onItemClick(SwipeMenuView view, SwipeMenu menu, // int index) { // if (mOnMenuItemClickListener != null) { // mOnMenuItemClickListener.onMenuItemClick( // view.getPosition(), menu, index); // } // if (mTouchView != null) { // mTouchView.smoothCloseMenu(); // } // } // }); // } public void setCloseInterpolator(Interpolator interpolator) { mCloseInterpolator = interpolator; } public void setOpenInterpolator(Interpolator interpolator) { mOpenInterpolator = interpolator; } public Interpolator getOpenInterpolator() { return mOpenInterpolator; } public Interpolator getCloseInterpolator() { return mCloseInterpolator; } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { return super.onInterceptTouchEvent(ev); } @Override public boolean onTouchEvent(MotionEvent ev) { if (ev.getAction() != MotionEvent.ACTION_DOWN && mTouchView == null) return super.onTouchEvent(ev); int action = MotionEventCompat.getActionMasked(ev); action = ev.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: int oldPos = mTouchPosition; mDownX = ev.getX(); mDownY = ev.getY(); mTouchState = TOUCH_STATE_NONE; mTouchPosition = pointToPosition((int) ev.getX(), (int) ev.getY()); if (mTouchPosition == oldPos && mTouchView != null && mTouchView.isOpen()) { mTouchState = TOUCH_STATE_X; mTouchView.onSwipe(ev); return true; } View view = getChildAt(mTouchPosition - getFirstVisiblePosition()); if (mTouchView != null && mTouchView.isOpen()) { mTouchView.smoothCloseMenu(); mTouchView = null; return super.onTouchEvent(ev); } if (view instanceof SwipeItemLayout) { mTouchView = (SwipeItemLayout) view; } if (mTouchView != null) { mTouchView.onSwipe(ev); } break; case MotionEvent.ACTION_MOVE: float dy = Math.abs((ev.getY() - mDownY)); float dx = Math.abs((ev.getX() - mDownX)); if (mTouchState == TOUCH_STATE_X) { if (mTouchView != null) { mTouchView.onSwipe(ev); } getSelector().setState(new int[] { 0 }); ev.setAction(MotionEvent.ACTION_CANCEL); super.onTouchEvent(ev); return true; } else if (mTouchState == TOUCH_STATE_NONE) { if (Math.abs(dy) > MAX_Y) { mTouchState = TOUCH_STATE_Y; } else if (dx > MAX_X) { mTouchState = TOUCH_STATE_X; // if (mOnSwipeListener != null) { // mOnSwipeListener.onSwipeStart(mTouchPosition); // } } } break; case MotionEvent.ACTION_UP: if (mTouchState == TOUCH_STATE_X) { if (mTouchView != null) { mTouchView.onSwipe(ev); if (!mTouchView.isOpen()) { mTouchPosition = -1; mTouchView = null; } } // if (mOnSwipeListener != null) { // mOnSwipeListener.onSwipeEnd(mTouchPosition); // } ev.setAction(MotionEvent.ACTION_CANCEL); super.onTouchEvent(ev); return true; } break; } return super.onTouchEvent(ev); } public void smoothOpenMenu(int position) { if (position >= getFirstVisiblePosition() && position <= getLastVisiblePosition()) { View view = getChildAt(position - getFirstVisiblePosition()); if (view instanceof SwipeItemLayout) { mTouchPosition = position; if (mTouchView != null && mTouchView.isOpen()) { mTouchView.smoothCloseMenu(); } mTouchView = (SwipeItemLayout) view; mTouchView.smoothOpenMenu(); } } } private int dp2px(int dp) { return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, getContext().getResources().getDisplayMetrics()); } // public void setOnMenuItemClickListener( // OnMenuItemClickListener onMenuItemClickListener) { // this.mOnMenuItemClickListener = onMenuItemClickListener; // } // public void setOnSwipeListener(OnSwipeListener onSwipeListener) { // this.mOnSwipeListener = onSwipeListener; // } // public static interface OnMenuItemClickListener { // void onMenuItemClick(int position, SwipeMenu menu, int index); // } // public static interface OnSwipeListener { // void onSwipeStart(int position); // // void onSwipeEnd(int position); // } }
最後面是adapter了
package com.xinnonbao.cehuaaaaaaaaaaaaaaa; import android.content.Context; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.Button; public class SwipeAdapter extends BaseAdapter { private Context mContext = null; public SwipeAdapter(Context context) { this.mContext = context; } @Override public int getCount() { // TODO Auto-generated method stub return 10; } @Override public Object getItem(int arg0) { // TODO Auto-generated method stub return null; } @Override public long getItemId(int arg0) { // TODO Auto-generated method stub return arg0; } @Override public View getView(int position, View contentView, ViewGroup arg2) { ViewHolder holder = null; if(contentView==null){ holder = new ViewHolder(); View view01 = LayoutInflater.from(mContext).inflate(R.layout.test01, null); View view02 = LayoutInflater.from(mContext).inflate(R.layout.test2, null); // holder.btn = (Button)view02.findViewById(R.id.btn); contentView = new SwipeItemLayout(view01, view02, null, null); contentView.setTag(holder); if(view02.getVisibility()==View.VISIBLE){ Button viewById = (Button) view02.findViewById(R.id.delete_tutton); viewById.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Log.e("viewById","這裏就是點擊事件了"); } }); } }else{ holder = (ViewHolder) contentView.getTag(); } // holder.btn.setOnClickListener(new OnClickListener() { // // @Override // public void onClick(View arg0) { // // TODO Auto-generated method stub // Toast.makeText(mContext, "click", Toast.LENGTH_LONG).show(); // } // }); return contentView; } class ViewHolder{ Button btn = null; } }
OK基本完成
網上還有另外的框架
http://m.blog.csdn.net/article/details?id=50505210