仿QQ侧滑删除的另一种实现方法
2016-12-07 19:56
218 查看
这个实现方法是不需要依赖任何jar包或库的,所以比较轻便
==================================================== SliderView start=========================================================
==================================================== SliderViewend ==============================================================
==================================================== SliderView xml start==========================================================
==================================================== SliderView xml end ==========================================================
==================================================== SliderListView start===========================================================
==================================================== SliderListView end ===========================================================
======================================================= MainActivity start =========================================================
======================================================= MainActivity end ========================================================
==================================================== MainActivity xml start =======================================================
==================================================== MainActivity xml end ========================================================
效果图如下:
==================================================== 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); < 4000 span style="color:#9d3eff;">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 ========================================================
效果图如下:
相关文章推荐
- LintCode(E)
- Android 6.0 运行时权限简洁封装
- strcpy的实现
- 用sqlplus为oracle创建用户和表空间
- 关于配准
- serv-u中如何映射网络驱动器
- 电子现金、电子钱包、qPBOC、闪付、UPCash
- 通知栏介绍
- CodeForces-712B. Memory and Trident(模拟)
- bzoj 4720: [Noip2016]换教室
- ngCordova插件(0)-ngCordova插件的使用详解_序
- Linux系统shell脚本编程——生产实战案例
- 基于ffmpeg,实现采集屏幕或摄像头以后向EasyDarwin推流
- 最大数,lintcode
- Docker 1.12 swarm模式下遇到的各种问题
- 动态加载脚本和样式
- 修改android源码api报错
- 第十五周项目2- 用哈希法组织关键字 拉链法
- 安装pip和json
- Struts2中LoginAction的四种配置方法