仿QQ滑动删除
来源:互联网 发布:办公室零食 知乎 编辑:程序博客网 时间:2024/05/03 09:30
思路就是利用一个PopupWindow来显示删除的按钮,通过PopupWindow对象来控制什么时候显示,什么时候删除。注意重写dispatchTouchEvent和TouchEvent两个方法。
先看删除Button的布局文件:
<?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" > <Button android:id="@+id/btn_delete" android:layout_width="wrap_content" android:layout_height="wrap_content" android:singleLine="true" android:text="删除" android:background="@drawable/mm_title_back_pressed"/></LinearLayout>
在看主页面:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <com.drision.ui.MyListView android:id="@+id/listView1" android:layout_height="wrap_content" android:layout_width="fill_parent"> </com.drision.ui.MyListView></RelativeLayout>
主要看自定义的ListView
package com.drision.ui;import com.drision.listviewslip.R;import android.content.Context;import android.util.AttributeSet;import android.util.Log;import android.view.Gravity;import android.view.LayoutInflater;import android.view.MotionEvent;import android.view.View;import android.view.ViewConfiguration;import android.widget.Button;import android.widget.LinearLayout;import android.widget.ListView;import android.widget.PopupWindow;public class MyListView extends ListView {private static final String TAG="MyListView";/** * 用户滑动的最小距离 */private int touchSlop;private boolean isSliding;private int xDown;private int yDown;private int xMove;private int yMove;private LayoutInflater inflater;private PopupWindow popupWindow;private int popupHeight;private int popupWidth;private Button btn_delete;//当前手指触摸的viewprivate View currentView;private int currentPosition;private DelButtonClickListener mListener;//构造函数必须使用这个带attrs,不然报错,我也不晓得为什么,因为我很菜public MyListView(Context context , AttributeSet attrs) {super(context, attrs);inflater = LayoutInflater.from(context);touchSlop = ViewConfiguration.get(context).getScaledTouchSlop();View view = inflater.inflate(R.layout.delete_btn, null);btn_delete = (Button) view.findViewById(R.id.btn_delete);popupWindow = new PopupWindow(view, LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);/** * 调用measure,否则拿不到宽和高 */popupWindow.getContentView().measure(0, 0);popupHeight = popupWindow.getContentView().getMeasuredHeight();popupWidth = popupWindow.getContentView().getMeasuredWidth();}@Overridepublic boolean onTouchEvent(MotionEvent ev) {int action = ev.getAction();//从右到左滑动if(isSliding){switch(action){case MotionEvent.ACTION_MOVE:int [] location = new int [2];//获取当前item的位置currentView.getLocationOnScreen(location);//设置popup的动画popupWindow.setAnimationStyle(R.style.popwindow_delete_btn_anim_style);popupWindow.update();popupWindow.showAtLocation(currentView, Gravity.LEFT | Gravity.TOP,location[0] + currentView.getWidth(), location[1] + currentView.getHeight() / 2- popupHeight / 2);btn_delete.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v) {if(mListener != null){mListener.clickHappend(currentPosition);popupWindow.dismiss();}}});break;case MotionEvent.ACTION_UP: isSliding = false; break;}return true; }return super.onTouchEvent(ev);}@Overridepublic boolean dispatchTouchEvent(MotionEvent ev) {int action = ev.getAction();int x = (int) ev.getX();int y = (int) ev.getY();switch(action){case MotionEvent.ACTION_DOWN:xDown = x;yDown = y;//如果popup显示if (popupWindow.isShowing()){dismissPopWindow();return false;}//获取当前手指按下的item的位置currentPosition = pointToPosition(xDown, yDown);//获取当前的itemView view = getChildAt(currentPosition - getFirstVisiblePosition());currentView = view;break;case MotionEvent.ACTION_MOVE:xMove = x;yMove= y;int dx = xMove - xDown;int dy = yMove - yDown;//判断是否从右向左滑动if(xMove < xDown && Math.abs(dx) > touchSlop && Math.abs(dy)< touchSlop){isSliding = true;}break;}return super.dispatchTouchEvent(ev);}private void dismissPopWindow(){if (popupWindow != null && popupWindow.isShowing()){popupWindow.dismiss();}}public void setDelButtonClickListener(DelButtonClickListener listener){ mListener = listener; } public interface DelButtonClickListener { public void clickHappend(int position); } }
看两个动画的定义:
delete_btn_hide.xml
<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android"><scale android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:fromXScale="1.0" android:toXScale="0.0" android:fromYScale="1.0" android:toYScale="1.0" android:pivotX="100%" android:pivotY="50%" android:fillAfter="false" android:duration="200" ></scale></set>
delete_btn_show.xml
<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android"><scale android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:fromXScale="0.0" android:toXScale="1.0" android:fromYScale="1.0" android:toYScale="1.0" android:pivotX="100%" android:pivotY="50%" android:fillAfter="false" android:duration="200" > </scale></set>
在看主Activity:
package com.drision.listviewslip;import java.util.ArrayList;import java.util.Arrays;import java.util.List;import com.drision.ui.MyListView.DelButtonClickListener;import com.drision.ui.MyListView;import android.app.Activity;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.ArrayAdapter;import android.widget.Toast;public class MainActivity extends Activity {private MyListView listView;private ArrayAdapter adapter;private List<String> datas;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);listView = (MyListView) this.findViewById(R.id.listView1);datas = new ArrayList<String>(Arrays.asList("HelloWorld", "Welcome", "Java", "Android", "Servlet", "Struts", "Hibernate", "Spring", "HTML5", "Javascript", "Lucene"));adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, datas);listView.setAdapter(adapter);listView.setDelButtonClickListener(new DelButtonClickListener() {public void clickHappend(int position) {Toast.makeText(MainActivity.this, position + " : " + adapter.getItem(position), 1).show(); return;}});listView.setOnItemClickListener(new OnItemClickListener(){@Overridepublic void onItemClick(AdapterView<?> parent, View view,int position, long id) { Toast.makeText(MainActivity.this, position + " : " + adapter.getItem(position), 1).show(); }});;}}
0 0
- 仿QQ滑动删除
- 仿qq滑动删除
- Android 仿QQ 滑动删除
- recyclerview仿qq滑动删除
- ListView滑动删除 ,仿腾讯QQ
- ListView滑动删除 ,仿腾讯QQ
- ListView滑动删除 ,仿腾讯QQ
- 仿qq的listView 滑动删除
- ListView滑动删除 ,仿腾讯QQ
- ListView滑动删除 ,仿腾讯QQ
- ListView滑动删除 ,仿腾讯QQ
- ListView滑动删除 ,仿腾讯QQ
- ListView滑动删除 ,仿腾讯QQ
- ListView滑动删除 ,仿腾讯QQ
- 仿qq向左滑动删除 案例 详解
- ListView滑动删除 ,仿腾讯QQ
- Android仿QQ实现ListView滑动删除
- ListView滑动删除 ,仿腾讯QQ
- 高精度乘法模板
- 设备相关
- 浅谈数据挖掘中的关联规则挖掘
- oracle的存储过程
- leetcode 日经贴,Cpp code -Majority Element
- 仿QQ滑动删除
- BM77SPP03蓝牙模块开发
- CentOS 6.5中安装emacs软件
- 3D游戏中的数学运用
- Linux 终端及终端登录过程简介
- 第2章 3
- linux 常用命令
- nginx防盗链
- bluestacks安装安卓引擎时出现2502 2503错误的解决办法