Android 滑動(dòng)攔截實(shí)例代碼解析
廢話不多說(shuō)了,直接給大家貼代碼了,具體代碼如下所示:
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獲取SDcard目錄及創(chuàng)建文件夾的方法
今天小編就為大家分享一篇Android獲取SDcard目錄及創(chuàng)建文件夾的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-08-08
Android實(shí)現(xiàn)通話自動(dòng)錄音
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)通話自動(dòng)錄音,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-10-10
Flutter實(shí)現(xiàn)文本滾動(dòng)高亮效果的示例講解
這篇文章主要介紹了如何利用Flutter時(shí)時(shí)渲染頁(yè)面從而達(dá)到文本滾動(dòng)高亮的效果,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-03-03
Android消息機(jī)制Handler用法總結(jié)
這篇文章介紹了Android消息機(jī)制Handler用法總結(jié),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-11-11
Android自定義控件簡(jiǎn)單實(shí)現(xiàn)側(cè)滑菜單效果
這篇文章主要為大家詳細(xì)介紹了Android自定義控件打造史上最簡(jiǎn)單的側(cè)滑菜單的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-06-06
Android實(shí)現(xiàn)瘋狂連連看游戲之開發(fā)游戲界面(二)
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)瘋狂連連看游戲之開發(fā)游戲界面,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03

