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自定義View之Canvas
https://www.jianshu.com/p/fb18c28d6627 用繼承View的方式來自定義View,我們就需要重寫onDraw方法,也就是得咱自己來畫圖了。畫圖就得用到畫筆和畫布,也就是Paint和Canvas。我們來了解下Canvas。 Canvas Canvas我們可
Android 自定義View之Canvas詳解
自定義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自定義View之getTextBounds()
在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 -- 自定義view之StepView
先看看實現的效果: 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自定義View之3D索引效果
效果圖: 我的小霸王太卡了。 最近工作比較忙,今天搞了一下午才搞出來這個效果,這種效果有很多種實現方式,最常見的應該是用貝塞爾曲線實現的。今天我們來看另一種不同的實現方式,只需要用到 canvas.scale(),有沒有很好奇是怎麼實現的呢。 首先來說一下思路,只要有了思