Android 滑動(dòng)攔截實(shí)例代碼解析
廢話不多說了,直接給大家貼代碼了,具體代碼如下所示:
package demo.hq.com.fby; import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; import android.widget.LinearLayout; /** * Created by huqing on 2016/12/7. * 思路: * 分內(nèi)外部攔截 * 在父布局中,onInterceptTouchEvent先判斷是否攔截滑動(dòng),true 攔截 直接進(jìn)入父布局的onTouch方法 ;false 進(jìn)入子布局的onTouch方法 */ public class MyParentView extends LinearLayout { /** * 每向下Move移動(dòng)的距離 */ private int mMove; /** * 落下點(diǎn)的位置 */ private int yDown; /** * 移動(dòng)點(diǎn)的位置 */ private int yMove; /** * 一共向下挪動(dòng)的距離 */ private int downDistance = 0; public MyParentView(Context context, AttributeSet attrs) { super(context, attrs); } boolean intercept = false; /** * 外部攔截, * 如果是向下滑動(dòng) 則為true,交給該控件處理,向上false就交給子控件處理吧 * 所以向上的事件 子控件都能獲取到的 * * @param ev * @return */ @Override public boolean onInterceptTouchEvent(MotionEvent ev) { switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: yDown =(int) ev.getY(); break; case MotionEvent.ACTION_MOVE: yMove = (int) ev.getY(); if (yMove > yDown) { intercept = true; Log.d("hqq", "攔截~~~~~~~~~~~~~~~~~~"); } else if (yMove < yDown) { intercept = false; Log.d("hqq", "不攔截~~~~~~~~~~~~~~~~~~"); } break; case MotionEvent.ACTION_UP: break; } //true 攔截,進(jìn)入該控件的onTouchEvent方法 false:進(jìn)入子控件的OnTouchEvent boolean returnInterCept = intercept; intercept = false; return returnInterCept; } @Override public boolean onTouchEvent(MotionEvent event) { Log.e("hq", "father onTouch"); int y = (int) event.getY(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: yDown = y; break; case MotionEvent.ACTION_MOVE: if (downDistance>=250){ }else { yMove = y; if (yMove - yDown > 0) { mMove = yMove - yDown; downDistance += mMove; if (downDistance>=250){ layout(getLeft(),downDistance, getRight(), getHeight() + downDistance); }else { layout(getLeft(), getTop() + mMove, getRight(), getBottom() + mMove); } } } break; case MotionEvent.ACTION_UP: layout(getLeft(), getTop() - downDistance, getRight(), getBottom() - downDistance); downDistance = 0; break; } return true;// return super.onTouchEvent(event); } }
package demo.hq.com.fby; import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; import android.widget.ScrollView; /** * Created by huqing on 2016/12/7. */ public class MyScrollView extends ScrollView { public MyScrollView(Context context, AttributeSet attrs) { super(context, attrs); } @Override public boolean onTouchEvent(MotionEvent ev) { Log.e("hq","child onTouch----------------"); switch (ev.getAction()){ case MotionEvent.ACTION_DOWN: getParent().requestDisallowInterceptTouchEvent(true); break; case MotionEvent.ACTION_MOVE: if (getScrollY()==0){//ScrollView沒有滑動(dòng)時(shí) ,即滑動(dòng)高度沒變化的話就允許父控件攔截 getParent().requestDisallowInterceptTouchEvent(false); }else {//禁止攔截 getParent().requestDisallowInterceptTouchEvent(true); } break; } return super.onTouchEvent(ev); } }
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout android:id="@+id/activity_main" 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" android:background="@drawable/bg" tools:context="demo.hq.com.fby.MainActivity"> <demo.hq.com.fby.MyParentView android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#ffffff" android:orientation="vertical"> <TextView android:layout_width="wrap_content" android:layout_height="100dp" android:text=" World!"/> <TextView android:layout_width="wrap_content" android:layout_height="100dp" android:text=" World!"/> <demo.hq.com.fby.MyScrollView android:layout_width="match_parent" android:layout_height="wrap_content"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:layout_width="wrap_content" android:layout_height="200dp" android:text="Hello World!"/> <TextView android:layout_width="wrap_content" android:layout_height="200dp" android:text="Hello World!"/> </LinearLayout> </demo.hq.com.fby.MyScrollView> </demo.hq.com.fby.MyParentView> </RelativeLayout>
以上所述是小編給大家介紹的Android 滑動(dòng)攔截實(shí)例代碼解析,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- Android實(shí)現(xiàn)圖片左右滑動(dòng)效果
- Android實(shí)現(xiàn)圖片自動(dòng)輪播并且支持手勢(shì)左右無(wú)限滑動(dòng)
- Android使用ViewPager實(shí)現(xiàn)無(wú)限滑動(dòng)效果
- Android的OkHttp包中的HTTP攔截器Interceptor用法示例
- Android編程實(shí)現(xiàn)攔截短信并屏蔽系統(tǒng)Notification的方法
- Android開發(fā)四大組件之實(shí)現(xiàn)電話攔截和電話錄音
- Android攔截外撥電話程序示例
- android短信攔截的實(shí)現(xiàn)代碼
相關(guān)文章
Android實(shí)現(xiàn)簡(jiǎn)單畫圖畫板
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)簡(jiǎn)單畫圖畫板,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-01-01Android 保存Fragment 切換狀態(tài)實(shí)例代碼
本文主要介紹Android Fragment的應(yīng)用,這里給大家用實(shí)例代碼詳細(xì)介紹了Android Fragment 切換狀態(tài),有需要的小伙伴可以參考下2016-07-07android 完全退出應(yīng)用程序?qū)崿F(xiàn)代碼
這篇文章主要介紹了在android中完全退出應(yīng)用的實(shí)現(xiàn)代碼,多種實(shí)現(xiàn)方法,大家可以根據(jù)需求選擇2013-06-06flutter開發(fā)技巧自定頁(yè)面指示器PageIndicator詳解
這篇文章主要為大家介紹了flutter開發(fā)技巧自定頁(yè)面指示器PageIndicator詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01Android中二維碼的掃描和生成(使用zxing庫(kù))
ZXing是一個(gè)開放源碼的,用Java實(shí)現(xiàn)的多種格式的1D/2D條碼圖像處理庫(kù),它包含了聯(lián)系到其他語(yǔ)言的端口,下面這篇文章主要給大家介紹了關(guān)于Android中二維碼掃描和生成的相關(guān)資料,主要使用的zxing庫(kù),需要的朋友可以參考下2022-09-09Android實(shí)現(xiàn)九宮格手勢(shì)密碼
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)九宮格手勢(shì)密碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06