欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android仿騰訊QQ實現(xiàn)滑動刪除 附源碼下載

 更新時間:2016年07月13日 14:53:57   投稿:lijiao  
仿騰訊QQ滑動刪除操作,這篇文章主要為大家詳細介紹了ListView滑動刪除的具體操作方法,感興趣的小伙伴們可以參考一下

看了很多大神們的文章,感覺受益良多,也非常欣賞大家的分享態(tài)度,所以決定開始寫B(tài)log,給大家分享自己的心得。

先看看效果圖:

本來準備在ListView的每個Item的布局上設置一個隱藏的Button,當滑動的時候顯示。但是因為每次只要存在一個Button,發(fā)現(xiàn)每個Item上的Button相互間不好控制。所以決定繼承ListView然后結合PopupWindow。

首先是布局文件:

delete_btn.xml:這里只需要一個Button

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:orientation="vertical" >
  <Button 
  android:id="@+id/id_item_btn"
  android:layout_width="60dp"
  android:singleLine="true"
  android:layout_height="wrap_content"
  android:text="刪除"
  android:background="@drawable/d_delete_btn"
  android:textColor="#ffffff"
  android:paddingLeft="15dp"
  android:paddingRight="15dp"
  android:layout_alignParentRight="true"
  android:layout_centerVertical="true"
  android:layout_marginRight="15dp"
  />
</LinearLayout> 

主布局文件:activity_main.xml,ListView的每個Item的樣式直接使用了系統(tǒng)的android.R.layout.simple_list_item_1

<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.example.listviewitemslidedeletebtnshow.QQListView
  android:id="@+id/id_listview"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content" >
 </com.example.listviewitemslidedeletebtnshow.QQListView>

</RelativeLayout>

接下來看看QQListView的實現(xiàn):

package com.example.listviewitemslidedeletebtnshow;

import android.content.Context;
import android.util.AttributeSet;
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 QQListView extends ListView
{

 private static final String TAG = "QQlistView";

 // private static final int VELOCITY_SANP = 200;
 // private VelocityTracker mVelocityTracker;
 /**
 * 用戶滑動的最小距離
 */
 private int touchSlop;

 /**
 * 是否響應滑動
 */
 private boolean isSliding;

 /**
 * 手指按下時的x坐標
 */
 private int xDown;
 /**
 * 手指按下時的y坐標
 */
 private int yDown;
 /**
 * 手指移動時的x坐標
 */
 private int xMove;
 /**
 * 手指移動時的y坐標
 */
 private int yMove;

 private LayoutInflater mInflater;

 private PopupWindow mPopupWindow;
 private int mPopupWindowHeight;
 private int mPopupWindowWidth;

 private Button mDelBtn;
 /**
 * 為刪除按鈕提供一個回調接口
 */
 private DelButtonClickListener mListener;

 /**
 * 當前手指觸摸的View
 */
 private View mCurrentView;

 /**
 * 當前手指觸摸的位置
 */
 private int mCurrentViewPos;

 /**
 * 必要的一些初始化
 * 
 * @param context
 * @param attrs
 */
 public QQListView(Context context, AttributeSet attrs)
 {
 super(context, attrs);

 mInflater = LayoutInflater.from(context);
 touchSlop = ViewConfiguration.get(context).getScaledTouchSlop();

 View view = mInflater.inflate(R.layout.delete_btn, null);
 mDelBtn = (Button) view.findViewById(R.id.id_item_btn);
 mPopupWindow = new PopupWindow(view, LinearLayout.LayoutParams.WRAP_CONTENT,
 LinearLayout.LayoutParams.WRAP_CONTENT);
 /**
 * 先調用下measure,否則拿不到寬和高
 */
 mPopupWindow.getContentView().measure(0, 0);
 mPopupWindowHeight = mPopupWindow.getContentView().getMeasuredHeight();
 mPopupWindowWidth = mPopupWindow.getContentView().getMeasuredWidth();
 }

 @Override
 public 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;
 /**
 * 如果當前popupWindow顯示,則直接隱藏,然后屏蔽ListView的touch事件的下傳
 */
 if (mPopupWindow.isShowing())
 {
 dismissPopWindow();
 return false;
 }
 // 獲得當前手指按下時的item的位置
 mCurrentViewPos = pointToPosition(xDown, yDown);
 // 獲得當前手指按下時的item
 View view = getChildAt(mCurrentViewPos - getFirstVisiblePosition());
 mCurrentView = 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)
 {
 // Log.e(TAG, "touchslop = " + touchSlop + " , dx = " + dx +
 // " , dy = " + dy);
 isSliding = true;
 }
 break;
 }
 return super.dispatchTouchEvent(ev);
 }

 @Override
 public boolean onTouchEvent(MotionEvent ev)
 {
 int action = ev.getAction();
 /**
 * 如果是從右到左的滑動才相應
 */
 if (isSliding)
 {
 switch (action)
 {
 case MotionEvent.ACTION_MOVE:

 int[] location = new int[2];
 // 獲得當前item的位置x與y
 mCurrentView.getLocationOnScreen(location);
 // 設置popupWindow的動畫
 mPopupWindow.setAnimationStyle(R.style.popwindow_delete_btn_anim_style);
 mPopupWindow.update();
 mPopupWindow.showAtLocation(mCurrentView, Gravity.LEFT | Gravity.TOP,
  location[0] + mCurrentView.getWidth(), location[1] + mCurrentView.getHeight() / 2
  - mPopupWindowHeight / 2);
 // 設置刪除按鈕的回調
 mDelBtn.setOnClickListener(new OnClickListener()
 {
  @Override
  public void onClick(View v)
  {
  if (mListener != null)
  {
  mListener.clickHappend(mCurrentViewPos);
  mPopupWindow.dismiss();
  }
  }
 });
 // Log.e(TAG, "mPopupWindow.getHeight()=" + mPopupWindowHeight);

 break;
 case MotionEvent.ACTION_UP:
 isSliding = false;

 }
 // 相應滑動期間屏幕itemClick事件,避免發(fā)生沖突
 return true;
 }

 return super.onTouchEvent(ev);
 }

 /**
 * 隱藏popupWindow
 */
 private void dismissPopWindow()
 {
 if (mPopupWindow != null && mPopupWindow.isShowing())
 {
 mPopupWindow.dismiss();
 }
 }

 public void setDelButtonClickListener(DelButtonClickListener listener)
 {
 mListener = listener;
 }

 interface DelButtonClickListener
 {
 public void clickHappend(int position);
 }

}

代碼注釋寫得很詳細,簡單說一下,在dispatchTouchEvent中設置當前是否響應用戶滑動,然后在onTouchEvent中判斷是否響應,如果響應則popupWindow以動畫的形式展示出來。當然屏幕上如果存在PopupWindow則屏幕ListView的滾動與Item的點擊,以及從右到左滑動時屏幕Item的click事件。

接下來是MainActivity.java,這里代碼很簡單不做介紹了。

package com.example.listviewitemslidedeletebtnshow;

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

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.Toast;

import com.example.listviewitemslidedeletebtnshow.QQListView.DelButtonClickListener;

public class MainActivity extends Activity
{
 private QQListView mListView;
 private ArrayAdapter<String> mAdapter;
 private List<String> mDatas;

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

 mListView = (QQListView) findViewById(R.id.id_listview);
 // 不要直接Arrays.asList
 mDatas = new ArrayList<String>(Arrays.asList("HelloWorld", "Welcome", "Java", "Android", "Servlet", "Struts",
 "Hibernate", "Spring", "HTML5", "Javascript", "Lucene"));
 mAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mDatas);
 mListView.setAdapter(mAdapter);

 mListView.setDelButtonClickListener(new DelButtonClickListener()
 {
 @Override
 public void clickHappend(final int position)
 {
 Toast.makeText(MainActivity.this, position + " : " + mAdapter.getItem(position), 1).show();
 mAdapter.remove(mAdapter.getItem(position));
 }
 });

 mListView.setOnItemClickListener(new OnItemClickListener()
 {
 @Override
 public void onItemClick(AdapterView<?> parent, View view, int position, long id)
 {
 Toast.makeText(MainActivity.this, position + " : " + mAdapter.getItem(position), 1).show();
 }
 });
 }
}

樓主使用asm.jar以及gifcamera截的gif,由于button的動畫很短感覺截圖效果很卡不流暢,大家有什么好的截圖,還望推薦。

有興趣的還是下載源碼看看效果,源碼下載

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Android控件之菜單的創(chuàng)建方式

    Android控件之菜單的創(chuàng)建方式

    本文給大家分享android控件菜單的兩種創(chuàng)建方式,非常不錯,具有參考借鑒價值,需要的朋友參考下吧
    2017-09-09
  • Android 逐幀動畫創(chuàng)建實例詳解

    Android 逐幀動畫創(chuàng)建實例詳解

    這篇文章主要介紹了Android 逐幀動畫創(chuàng)建實例詳解的相關資料,這里主要說明Android 動畫的創(chuàng)建及使用方法,希望通過此文能幫助到大家,需要的朋友可以參考下
    2017-08-08
  • Android自定義View實現(xiàn)游戲搖桿鍵盤的方法示例

    Android自定義View實現(xiàn)游戲搖桿鍵盤的方法示例

    Android進階過程中有一個繞不開的話題——自定義View。最近在做項目中又遇到了,所以下面這篇文章主要給大家介紹了利用Android自定義View實現(xiàn)游戲搖桿鍵盤的相關資料,操作方式類似王者榮耀的搖桿操作,文中通過示例代碼介紹的非常詳細,需要的朋友們下面來一起看看吧。
    2017-07-07
  • Android開發(fā)Compose集成高德地圖實例

    Android開發(fā)Compose集成高德地圖實例

    這篇文章主要為大家介紹了Android開發(fā)Compose里使用高德地圖實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • 解析android中的幫助、about、關于作者、HELP等提示頁面

    解析android中的幫助、about、關于作者、HELP等提示頁面

    本篇文章是對android中的幫助、about、關于作者、HELP等提示頁面進行了詳細的分析介紹,需要的朋友參考下
    2013-06-06
  • Android仿美團拖拽效果實例代碼

    Android仿美團拖拽效果實例代碼

    這篇文章主要給大家介紹了關于Android仿美團拖拽效果的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-02-02
  • Android自定義Material進度條效果

    Android自定義Material進度條效果

    這篇文章主要為大家詳細介紹了Android自定義Material進度條效果的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • Android實現(xiàn)在屏幕上移動圖片的方法

    Android實現(xiàn)在屏幕上移動圖片的方法

    這篇文章主要介紹了Android實現(xiàn)在屏幕上移動圖片的方法,實例分析了Android操作圖片的相關技巧,需要的朋友可以參考下
    2015-06-06
  • Android 二維碼 生成和識別二維碼 附源碼下載

    Android 二維碼 生成和識別二維碼 附源碼下載

    這篇文章主要介紹了Android 生成和識別二維碼的方法,提供源碼下載,需要的朋友可以參考下。
    2016-06-06
  • Android自定義控件實現(xiàn)方向盤效果

    Android自定義控件實現(xiàn)方向盤效果

    這篇文章主要為大家詳細介紹了Android自定義控件實現(xiàn)方向盤效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04

最新評論