當前位置:首頁 » 安卓系統 » android滑動刪除

android滑動刪除

發布時間: 2023-03-01 20:02:20

A. Android開發一個簡單實用的鬧鈴APP

生活中我們會常常遇到需要鬧鍾提醒;不管是起床還是生活中的事件提醒。

那作為Android開發如何自己開發一個鬧鍾功能呢,是不是覺得很酷呢?接下來我們就實戰一個鬧鍾。





本示例採用的是RecyclerView,其適配器類與常無二,其異在於繼承一個代理類,為適配之後側滑刪除而准備

建立一個內部類ViewHolder實現控制項定義申明

實現onCreateViewHolder方法載入子項布局文件

綁定實體類,實現onBindViewHolder獲取數據

此處有三處狀態,第一種狀態:第一次進入程序,默認載入固定鬧鍾子項;第二種狀態:進入添加子項頁面,然後返回其主頁面,並判斷其switch是否為ture,如果為ture則添加子項;第三種狀態:程序被系統回收或者用戶停止程序,並再次進入程序,防止載入前一時刻鬧鍾子項;

添加依賴 實現側滑主要依賴於一個第三方包,然後使用RecyclerView進行子項綁定 依賴如下:

並在目錄build.gradle包下添加如下庫

其實現側滑刪除主要的玄機在於布局文件當中,使用RelativeLayout布局,將刪除按鈕固定在布局右方,並使用其他布局將其覆蓋,只有滑動時,才將其顯示。掩蓋側滑刪除按鈕與暴露側滑刪除按鈕效果對比圖如下





然後,在適配器類中,實現WeSwipeHelper.SwipeLayoutTypeCallBack介面,實現如下三個方法,第一個方法為獲取側滑刪除按鈕的寬度;第二個方法為需要滑動的視圖,也就是覆蓋側滑刪除按鈕的布局;第三個方法為當視圖正在滑動時,用戶觸發單擊事件,自動還原滑動狀態

最後,在需要添加子項的視圖中綁定RecyclerView即可

通過監聽子項滑動刪除按鈕點擊事件,實現子項刪除

跳轉新增鬧鍾子項Acticity需要傳輸實體類對象,傳輸對象一般需要序列化改類,其操作如下

定義實體類,並實現序列化

然後通過Intent傳輸Bundle對象

實現時間選擇主要使用系統集成的組件TimePicker,其使用方法如下 其有兩種顯示方式,第一種為spinner,就是下拉滑動式,第二種為clock,即顯示一個時鍾,通過滑動指針選擇時間

在style.xml文件中申明如下樣式

然後再指定Activcty申明即可

獲取數據比較簡單,實現對應介面即可

將獲取的數據通過SharedPreferences存儲起來,然後點擊存儲時,進行頁面跳轉,然後再該界面進行取出數據

存儲數據

首先判斷回調的switch數據是否為ture,如果為ture則保存該子項,然後再適配器類中進行數據添加

選中與默認兩種狀態效果圖如下




創建thumb和track樣式

創建一個選擇器文件,有選中和默認兩種狀態

創新open_thumb.xml文件

創建shut_thumb.xml文件

同樣創建一個選擇器,並用於兩種狀態

其中AlarmManager為系統主要操作類,參數為提醒模式、提醒時間(long型)、PendingIntent對象 以下有三種時間傳入,第一種,直接傳入一個Long型時間用於測試,第二種,通過設置系統啟動至今而設置時間,第三種,通過取出設置的時間,然後獲取系統當前時間,將其差傳入其中。

然後再清單文件中注冊服務

使用Intent實現服務啟動

殺死程序

本示例總共使用到了三個單例類:SP(SharedPreferences封裝)、TimeFormat(時間數據格式封裝)、KillProcess(殺死所有Activity)

SharedPreferences

KillProcess

文章帶這里就完成了一個簡單的鬧鍾;Android開發還有許多更加更多的知識學習。進一步學習Android技術,我這里推薦這份筆記方便學習,我就放在私信, 發送「核心筆記」或「手冊」即可獲取。朋友們可以免費領取!

B. android 如何實現邊緣拖動側滑

據需求需要自己自定義一個ListView來實現該功能,接下來先貼出代碼再講解具體的實現

package com.example.slidecutlistview;

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.VelocityTracker;
import android.view.View;
import android.view.ViewConfiguration;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Scroller;

/**
* @blog http://blog.csdn.net/xiaanming
*
* @author xiaanming
*
*/
public class SlideCutListView extends ListView {
/**
* 當前滑動的ListViewposition
*/
private int slidePosition;
/**
* 手指按下X的坐標
*/
private int downY;
/**
* 手指按下Y的坐標
*/
private int downX;
/**
* 屏幕寬度
*/
private int screenWidth;
/**
* ListView的item
*/
private View itemView;
/**
* 滑動類
*/
private Scroller scroller;
private static final int SNAP_VELOCITY = 600;
/**
* 速度追蹤對象
*/
private VelocityTracker velocityTracker;
/**
* 是否響應滑動,默認為不響應
*/
private boolean isSlide = false;
/**
* 認為是用戶滑動的最小距離
*/
private int mTouchSlop;
/**
* 移除item後的回調介面
*/
private RemoveListener mRemoveListener;
/**
* 用來指示item滑出屏幕的方向,向左或者向右,用一個枚舉值來標記
*/
private RemoveDirection removeDirection;

// 滑動刪除方向的枚舉值
public enum RemoveDirection {
RIGHT, LEFT;
}

public SlideCutListView(Context context) {
this(context, null);
}

public SlideCutListView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}

public SlideCutListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
screenWidth = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getWidth();
scroller = new Scroller(context);
mTouchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop();
}

/**
* 設置滑動刪除的回調介面
* @param removeListener
*/
public void setRemoveListener(RemoveListener removeListener) {
this.mRemoveListener = removeListener;
}

/**
* 分發事件,主要做的是判斷點擊的是那個item, 以及通過postDelayed來設置響應左右滑動事件
*/
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN: {
addVelocityTracker(event);

// 假如scroller滾動還沒有結束,我們直接返回
if (!scroller.isFinished()) {
return super.dispatchTouchEvent(event);
}
downX = (int) event.getX();
downY = (int) event.getY();

slidePosition = pointToPosition(downX, downY);

// 無效的position, 不做任何處理
if (slidePosition == AdapterView.INVALID_POSITION) {
return super.dispatchTouchEvent(event);
}

// 獲取我們點擊的item view
itemView = getChildAt(slidePosition - getFirstVisiblePosition());
break;
}
case MotionEvent.ACTION_MOVE: {
if (Math.abs(getScrollVelocity()) > SNAP_VELOCITY
|| (Math.abs(event.getX() - downX) > mTouchSlop && Math
.abs(event.getY() - downY) < mTouchSlop)) {
isSlide = true;
}
break;
}
case MotionEvent.ACTION_UP:
recycleVelocityTracker();
break;
}

return super.dispatchTouchEvent(event);
}

/**
* 往右滑動,getScrollX()返回的是左邊緣的距離,就是以View左邊緣為原點到開始滑動的距離,所以向右邊滑動為負值
*/
private void scrollRight() {
removeDirection = RemoveDirection.RIGHT;
final int delta = (screenWidth + itemView.getScrollX());
// 調用startScroll方法來設置一些滾動的參數,我們在computeScroll()方法中調用scrollTo來滾動item
scroller.startScroll(itemView.getScrollX(), 0, -delta, 0,
Math.abs(delta));
postInvalidate(); // 刷新itemView
}

/**
* 向左滑動,根據上面我們知道向左滑動為正值
*/
private void scrollLeft() {
removeDirection = RemoveDirection.LEFT;
final int delta = (screenWidth - itemView.getScrollX());
// 調用startScroll方法來設置一些滾動的參數,我們在computeScroll()方法中調用scrollTo來滾動item
scroller.startScroll(itemView.getScrollX(), 0, delta, 0,
Math.abs(delta));
postInvalidate(); // 刷新itemView
}

/**
* 根據手指滾動itemView的距離來判斷是滾動到開始位置還是向左或者向右滾動
*/
private void scrollByDistanceX() {
// 如果向左滾動的距離大於屏幕的三分之一,就讓其刪除
if (itemView.getScrollX() >= screenWidth / 3) {
scrollLeft();
} else if (itemView.getScrollX() <= -screenWidth / 3) {
scrollRight();
} else {
// 滾回到原始位置,為了偷下懶這里是直接調用scrollTo滾動
itemView.scrollTo(0, 0);
}

}

/**
* 處理我們拖動ListView item的邏輯
*/
@Override
public boolean onTouchEvent(MotionEvent ev) {
if (isSlide && slidePosition != AdapterView.INVALID_POSITION) {
addVelocityTracker(ev);
final int action = ev.getAction();
int x = (int) ev.getX();
switch (action) {
case MotionEvent.ACTION_MOVE:
int deltaX = downX - x;
downX = x;

// 手指拖動itemView滾動, deltaX大於0向左滾動,小於0向右滾
itemView.scrollBy(deltaX, 0);
break;
case MotionEvent.ACTION_UP:
int velocityX = getScrollVelocity();
if (velocityX > SNAP_VELOCITY) {
scrollRight();
} else if (velocityX < -SNAP_VELOCITY) {
scrollLeft();
} else {
scrollByDistanceX();
}

recycleVelocityTracker();
// 手指離開的時候就不響應左右滾動
isSlide = false;
break;
}

return true; // 拖動的時候ListView不滾動
}

//否則直接交給ListView來處理onTouchEvent事件
return super.onTouchEvent(ev);
}

@Override
public void computeScroll() {
// 調用startScroll的時候scroller.computeScrollOffset()返回true,
if (scroller.computeScrollOffset()) {
// 讓ListView item根據當前的滾動偏移量進行滾動
itemView.scrollTo(scroller.getCurrX(), scroller.getCurrY());

postInvalidate();

// 滾動動畫結束的時候調用回調介面
if (scroller.isFinished()) {
if (mRemoveListener == null) {
throw new NullPointerException(RemoveListener is null, we should called setRemoveListener());
}

itemView.scrollTo(0, 0);
mRemoveListener.removeItem(removeDirection, slidePosition);
}
}
}

/**
* 添加用戶的速度跟蹤器
*
* @param event
*/
private void addVelocityTracker(MotionEvent event) {
if (velocityTracker == null) {
velocityTracker = VelocityTracker.obtain();
}

velocityTracker.addMovement(event);
}

/**
* 移除用戶速度跟蹤器
*/
private void recycleVelocityTracker() {
if (velocityTracker != null) {
velocityTracker.recycle();
velocityTracker = null;
}
}

/**
* 獲取X方向的滑動速度,大於0向右滑動,反之向左
*
* @return
*/
private int getScrollVelocity() {
velocityTracker.computeCurrentVelocity(1000);
int velocity = (int) velocityTracker.getXVelocity();
return velocity;
}

/**
*
* 當ListView item滑出屏幕,回調這個介面
* 我們需要在回調方法removeItem()中移除該Item,然後刷新ListView
*
* @author xiaanming
*
*/
public interface RemoveListener {
public void removeItem(RemoveDirection direction, int position);
}

}

C. 為什麼 Android 的應用上較少左(右)劃刪除,大多是長按刪除

Android 應用少採用向左向右滑動刪除,大多數為長按刪除的原因如下:

  1. 向左向右滑動,需要給每個listview的item單獨的加上很多代碼來控制顯示和隱藏文字,更容易出現bug。

  2. 長按刪除這一操作,是從android系統推出以來就有的功能,便於用戶操作,積累了操作習慣。

Android點擊事件分為點擊事件和長按事件,兩個事件可以單獨進行相應的,底層就是識別接觸點,回調執行相應的業務邏輯。

D. 安卓手機比iPhone好在哪些地方呢

現如今,許多人在手機的選擇上已經從iPhone逐漸轉移到安卓,若放在幾年前,這絕對是令人震驚的消息,其實主要是因為近年來安卓對手機的優化也越來越好了,那麼安卓手機比蘋果好在哪些地方呢?

1. 屏幕鎖定通知

Iphone12在屏幕底部有一個白色的條形圖標。 然而,在玩游戲時,這個白色條不能自動隱藏。 每次看到這個白色的條形物,我都覺得不舒服。 網上似乎有個教程可以把這個隱藏起來,但我還沒試過。 當我每次玩游戲時,我仍然認為android更好。

4. 文檔管理

IPHONE12的文件管理真的很糟糕。 首先,你在手機瀏覽器中下載的圖片不會保存在你的手機中。 相冊,文件,icloud無處可尋。 如果你想保存到你的相冊,你還需要打開共享-保存圖像,這樣你就可以在你的相冊中看到它們。 不僅如此,Iphone的文件管理應用程序非常難使用。 難道我不能在手機上看到任何文件嗎? 為什麼這么多文件我看不見? 還有一個文件在iPhone里無法修改後綴名,想必你應該有網上的朋友把下載的TXT格式手動解壓成zip格式的經驗,在iPhone里做不到。 文件管理編輯器仍然喜歡Android可以控制一切的感覺。

5. 文件傳輸

IPhone不支持直接數據線連接電腦傳輸文件,你需要下載一個軟體叫做iTunes,但是這個軟體是非常耐用,各種各樣的網路就學會了如何傳輸文件,和只能轉移的指定格式文件,不能被轉移許多格式不支持, 而且傳播的速度非常慢。 更糟糕的是,iphone12隻提供了一個照明到C線。 為了傳輸數據,你必須買一根usb的連接線,因為並不是所有的電腦都有C埠。

6. 無法設置動態牆紙

你可以在Android手機上設置動態壁紙,這在iPhone 12上是做不到的,因為iPhone不支持它。 它只有一個動態壁紙,當你按住它一段時間後,它會移動,而且僅限於鎖屏壁紙。

E. Android的listview的點擊和滑動效果沖突了

ViewDragHelper.Callback做滑動效果,你是不是在這里屏蔽了onTouch

如果這里重寫了onTouch 你要在onTouch里返回false這樣,事件才能繼續傳遞

還有,你想實現listView item的動畫,或者滑動刪除,左右滑動操作的話,建議你直接用開源框架

我這里給你上傳一份,關於listView的各種動畫,各種控制項,你可以直接用這些源代碼了

熱點內容
蜜蜂編程官網 發布:2025-05-14 19:59:28 瀏覽:56
優酷怎麼給視頻加密 發布:2025-05-14 19:31:34 瀏覽:633
夢三國2副本腳本 發布:2025-05-14 19:29:58 瀏覽:860
phpxmlhttp 發布:2025-05-14 19:29:58 瀏覽:433
Pua腳本 發布:2025-05-14 19:24:56 瀏覽:448
蘋果像素低為什麼比安卓好 發布:2025-05-14 19:13:23 瀏覽:460
安卓機微信怎麼設置紅包提醒 發布:2025-05-14 19:00:15 瀏覽:271
androidsystem許可權設置 發布:2025-05-14 18:56:02 瀏覽:970
mq腳本 發布:2025-05-14 18:45:37 瀏覽:25
仙境傳說ro解壓失敗 發布:2025-05-14 18:45:01 瀏覽:868