1. 程式人生 > >Android自定義View之(下拉重新整理+側滑刪除)

Android自定義View之(下拉重新整理+側滑刪除)

以前專案中用到了一個放qq的側滑刪除的效果,結果github上一搜就copy了一個,不得不說大神們寫的真心牛逼,那個時候呢看到一個東西能用就可以了,也不管怎麼實現的,現在反過來一看,原來自定義還可以這麼玩,當然,前面專案中也因此出現了一個bug,就是我使用的是PulltorefreshScrollView,因此也出現了ScrollView跟ListView的事件衝突,呵呵,不怕笑話,當是體驗不好,直接變成了長按刪除了,嘻嘻!!自從前面研究了一下事件分發,因此解決了困擾了我很久的問題。

看一下側滑刪除效果圖:
這裡寫圖片描述

copy github上的pulltorefresh下拉重新整理效果圖:
這裡寫圖片描述

不同的側滑效果:
這裡寫圖片描述

我們簡單看一下大神的SwipeMenu實現方式:
1、SwipeMenuListView繼承ListView。

public class SwipeMenuListView extends ListView {

2、重寫setAdapter方法,然後建立一個SwipeMenuLayout包含我們自己adapter中getView返回的View跟我們的側滑選單。

@Override
    public void setAdapter(ListAdapter adapter) {
        super.setAdapter(new SwipeMenuAdapter(getContext(), adapter) {
            @Override
public void createMenu(SwipeMenu menu) { if (mMenuCreator != null) { mMenuCreator.create(menu); Log.e("TAG", "---createMenu--"); } } @Override public void onItemClick(SwipeMenuView view, SwipeMenu menu, int
index) { if (mOnMenuItemClickListener != null) { mOnMenuItemClickListener.onMenuItemClick( view.getPosition(), menu, index); } if (mTouchView != null) { mTouchView.smoothCloseMenu(); } } }); }

SwipeMenuAdapter的方法可以看到,new了一個SwipeMenuLayout(FrameLayout)然後把我們的contentView跟swipeMenu放在一起了,

@Override
    public View getView(int position, View convertView, ViewGroup parent) {
        SwipeMenuLayout layout = null;
        if (convertView == null) {
            View contentView = mAdapter.getView(position, convertView, parent);
            SwipeMenu menu = new SwipeMenu(mContext);
            menu.setViewType(mAdapter.getItemViewType(position));
            createMenu(menu);
            SwipeMenuView menuView = new SwipeMenuView(menu,
                    (SwipeMenuListView) parent);
            menuView.setOnSwipeItemClickListener(this);
            SwipeMenuListView listView = (SwipeMenuListView) parent;
            layout = new SwipeMenuLayout(contentView, menuView,
                    listView.getCloseInterpolator(),
                    listView.getOpenInterpolator());
            layout.setPosition(position);
        } else {
            layout = (SwipeMenuLayout) convertView;
            layout.closeMenu();
            layout.setPosition(position);
            View view = mAdapter.getView(position, layout.getContentView(),
                    parent);
        }
        return layout;
    }

3、也是最重要的一步:就是監聽ListView的事件,處理SwipeMenuLayout的子控制元件(contentView+menu)的擺放位置,從而顯示menu跟隱藏menu

大致實現思路就是這樣了的,程式碼太多我就不一一列出了,下面我會給出demo的下載地址,我相信大家自己是能夠看懂的。因為我用的是PullToRefreshScrollView,也就是把側滑刪除ListView放在了ScrollView中,解決事件衝突:

思路:重寫dispatchTouchEvent方法,通過判斷滑動的距離來定義是否需要攔截掉和不攔截事件,從而解決事件衝突。一般都是放在父類中的onintecerpterTouchEvent方法中去實現,今天我們用另外一種方式,通過父類的requestDisallowInterceptTouchEvent(boolean flag);方法決定父類是否需要攔截子控制元件事件。

/**
     * 處理ScrollerView巢狀ListView引發的事件衝突
     */
    private int mLastY;
    private int mLastX;
    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        int action=ev.getAction();
        switch(action){
            case MotionEvent.ACTION_DOWN:
                mLastX=(int) ev.getX();
                mLastY=(int) ev.getY();
                break;
            case MotionEvent.ACTION_MOVE:
                int duraX=Math.abs((int) (ev.getX()-mLastX));
                int duraY=Math.abs((int) (ev.getY()-mLastY));
                if((duraX>10&&duraY<40)||(mTouchState == TOUCH_STATE_X)){
                    /**
                     * 當x軸距離為>10並且y軸滑動距離<40的時候,認為是側滑刪除操作,父控制元件不攔截子控制元件的事件
                     */
                    this.getParent().requestDisallowInterceptTouchEvent(true);
                }else{
                    /**
                     * 攔截子控制元件的事件,交給父控制元件處理
                     */
                    this.getParent().requestDisallowInterceptTouchEvent(false);
                }
                mLastX=(int) ev.getX();
                mLastY=(int) ev.getY();
                break;

        }
        return super.dispatchTouchEvent(ev);
    }

對事件傳遞不是很熟悉的童鞋,也可以看看我前面寫的兩篇部落格Android事件傳遞

相關推薦

Android定義View(重新整理+刪除)

以前專案中用到了一個放qq的側滑刪除的效果,結果github上一搜就copy了一個,不得不說大神們寫的真心牛逼,那個時候呢看到一個東西能用就可以了,也不管怎麼實現的,現在反過來一看,原來自定義還可以這麼玩,當然,前面專案中也因此出現了一個bug,就是我使用的是P

Banner+定義View+SmartRefreshLayout重新整理載入更多

仿美團開源專案整體架構和首頁其實早就完成了,前段時間家裡各種事情搞得心力交瘁,停更了一段時間。甚至一度動搖繼續這個專案的決心,因為最近在學前端,在技術的深度和廣度之間一直糾結搖擺不定。一個聲音是繼續完成這個專案,把安卓玩的更深入一些;另一個聲音是趕緊學前端吧

android 定義ListView實現重新整理、分頁載入、點選事件——定義控制元件學習(七)

package com.example.administrator.customerpulldownrefreshandpageload; import android.content.Context; import android.os.Handler; import android.os.Message

Android定義ListView實現仿微信刪除

經常在遇到問題第一時間都會在網上搜索解決的方法,因此看到很多前輩們的比較精闢的技術文章,學習了很多東西,現在將自己平時工作中開發的一些小功能坐下總結,也寫出來,既方便自己理清思路記憶功能塊實現思路,又能與大家一起交流分享技術。 第一次寫文章,哪裡有不對的希望大

Android UI 定義ListView 實現重新整理 載入更多

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Android定義View分貝儀

一、說明        最近在整理自定義View方面的知識,偶爾看到meizu工具箱的分貝儀效果,感覺它的實效效果還挺好的,遂想自己模擬實現練練手,廢話不多說,直接開擼。 二、效果圖 首先看一下效果圖: 看效果還挺炫酷

Android定義ViewCanvas

https://www.jianshu.com/p/fb18c28d6627 用繼承View的方式來自定義View,我們就需要重寫onDraw方法,也就是得咱自己來畫圖了。畫圖就得用到畫筆和畫布,也就是Paint和Canvas。我們來了解下Canvas。 Canvas Canvas我們可

Android 定義ViewCanvas詳解

自定義View的相關文章: Android 實現一個簡單的自定義View Android 自定義View步驟 Android Paint詳解 Android 自定義View之Canvas相關方法說明 Android 自定義View例項之 “京東跑”

Android : 定義View流式佈局

寫了一個很簡單的佈局 這是周圍圓框的drawable <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android">

android定義View仿通訊錄邊欄滑動,實現A-Z字母檢索

我們的手機通訊錄一般都有這樣的效果,如下圖: OK,這種效果大家都見得多了,基本上所有的android手機通訊錄都有這樣的效果。那我們今天就來看看這個效果該怎麼實現。 一.概述 1.頁面功能分析 整體上來說,左邊是一個ListView,右邊是一個自定義View,但

Android定義ViewgetTextBounds()

在Android自定義View的過程中一定會用到Paint,而paint屬性中有一個方法getTextBounds(String text,int start,int end,Rext bounds),它的中文解釋是:返回一個包含中文的矩形邊界,位置為(start,end) 英文解釋:Retur

Android定義View定義屬性

在Android開發中經常會用到自定義View的情況,而在自定義View時,自定義屬性是必須用到的。 1、新建一個自定義View如CustomView 它的自定義屬性主要是通過declare-styleable標籤為其配置自定義屬性。具體做法是:在res/values/目錄下增加一個reso

Android -- 定義viewStepView

先看看實現的效果: 2,首先我們來看看我們常規的自定義view的基礎步驟吧         1,繼承View,重寫構造方法 2,自定義屬性 3,重寫onMeasure()測量控制元件高度 4,重寫onDra

Android 定義View 可隨意拖動的View

因為趕專案本人停更兩個月 從今天開始又可以更新了 今天說一下這個可隨意拖動的view 簡單說一下這個view效果 和 發展 一開始這種效果是使用在網頁端的特別是購物類 例如某寶 某東 購物車和客服視窗 都有使用這個懸浮可拖動的設計效果 後來才發展到的移動端 還有

Android 定義View咖啡動畫

文章目錄效果畫杯子畫杯墊畫煙霧 效果 大概思路 自定義view,直接繼承view 複寫onSizeChanged()方法,在此計算杯墊,杯子,煙霧效果的path 在onDraw()方法中,描繪杯墊,杯子 處理煙霧動畫效果 畫杯子 這裡需要畫兩部分內容,第

Android 定義View下雨動畫

文章目錄效果思路畫雲畫雨滴優化 效果 開始前先做個熱身( ˘•灬•˘ ) 自己實現比較容易,但是到了要出部落格整理思路,總結要點的時候就撓頭,不知雲所以,所以最簡單的還是 如果對安卓UI有興趣的朋友可以加我好友互相探討, 思路 思路比較簡單,整個view無

android定義View定義EditText(新增刪除功能)

           忙忙碌碌20天,新的專案終於接近尾聲了。今天公司召集幾個使用者體驗師和美工一起吐糟這20天做的這個新產品,對於產品提出了很多建議,這幾天就改介面了。在這個專案中大量的使用了EditText元件,並且添加了刪除功能。這裡面都是用RelativeLayou

android定義view畫圓隨著手指移動

public class MyView extends View { private Paint mFanPaint,mTextPaint;//扇形畫筆和文字畫筆 public float AxisX=100; public float AxisY=100; public MyView(

Android定義view實現帶checkbox的Snackbar

前言 最近專案要求實現一個類似於snackbar功能,但是又不完全是snackbar的外掛,本來想在Google提供的snackbar裡面進行更改,但是這樣太麻煩了,於是自己動手實現了一個snackbar。先看下效果圖: 1.要解決的問題 1.彈框裡面除了文字提示之外還有一個按鈕,這個按

android定義View3D索引效果

效果圖: 我的小霸王太卡了。 最近工作比較忙,今天搞了一下午才搞出來這個效果,這種效果有很多種實現方式,最常見的應該是用貝塞爾曲線實現的。今天我們來看另一種不同的實現方式,只需要用到 canvas.scale(),有沒有很好奇是怎麼實現的呢。 首先來說一下思路,只要有了思