View的滑動方式及滑動衝突解決方法(事件分發)

2021-07-23 12:24:23 字數 3013 閱讀 3058

之前寫過乙個小球隨手指滑動的demo,很簡單,複寫ontouchevent,事件傳遞進來,得到手指觸點位置,通知重繪invalidate, 複寫ondraw方法,傳入觸點座標。這是不斷畫圖的過程。總結一下不畫圖的幾種滑動方式。

1、layout方法

@override

public

boolean

ontouchevent(motionevent event)

lastx = x;

log.e("mrpeng","lastx::::"+ lastx);

lasty = y;

return

true;

}

2、offsetleftandright

系統提供乙個對左右上下移動的api方法

view myview = findviewbyid(r.id.myview);

myview.offsetleftandright(offsetx);

3、layoutparams

linearlayout.layoutparams layoutparams =

(linearlayout.layoutparams) myview.getlayoutparams();

layoutparams.leftmargin= myview.getleft()+offsetx;

layoutparams.topmargin=myview.gettop()+offsety;

4、scrollto scrollby

注意,此處移動的是view的content,即讓view 的內容移動,如果viewgroup呼叫此方法,那麼移動的將是所有子view,如果view中使用移動的是view中的內容物,如果是textview,則移動text,imageview,則為drawable物件。

myview.getparent().scrollby(-offsetx,-offsety);
5、scroller

scroller mscroller=new scroller(mcontex);

public

void

smoothscrollto(int destx,int desty)

/*** 系統會在繪製view的時候在draw()方法中呼叫該方法,實際就是使用scrollto()方法,

*/@override

public

void

computescroll()

}

6、動畫
<?xml version="1.0" encoding="utf-8"?>

xmlns:android=""

android:interpolator="@android:anim/linear_interpolator"

android:duration="5000">

android:fromxdelta="10"

android:toxdelta="130"

android:fromydelta="30"

android:toydelta="-80"

android:duration="2000"/>

set>

屬性動畫

bulabula

時間分發,用一段偽**展示其關係

public

void

dispatchtouchevent(motionevent ev)else

return consume;

}

坑人的滑動衝突

1、父view左右滑,子view上下滑

2、父view上下滑,子view也上下滑

3、爺爺…………………… 萬變不離其宗。。。

viewpager+listview本來是有滑動衝突的,但是強大的voewpager已經處理過了,如果是橫向scrollview 巢狀listview

第一種方法,父容器攔截處理,重寫onintercepttouchevent

第二種方法,內部攔截處理,重寫子元素的dispatchtouchevent

@override

public

boolean

onintercepttouchevent(motionevent event)

break;

}case motionevent.action_move: else

break;

}case motionevent.action_up:

default:

break;

}log.d(tag, "intercepted=" + intercepted);

mlastx = x;

mlasty = y;

mlastxintercept = x;

mlastyintercept = y;

return intercepted;

}

第二種方法

@override

public

boolean

dispatchtouchevent(motionevent event)

case motionevent.action_move:

break;

}case motionevent.action_up:

default:

break;

}mlastx = x;

mlasty = y;

return

super.dispatchtouchevent(event);

}

View的滑動衝突

外部滑動方向和內部滑動方向一致 上面兩種情況的巢狀 父容器決定事件是否攔截 偽 public boolean onintercepthoverevent motionevent event else break case motionevent.action up 必須返回false,因為actio...

ViewPager子View滑動事件衝突解決

事件分發 public boolean dispatchtouchevent motionevent ev android事件以隧道方式逐層向下傳遞。事件首先由dispatchtouchevent方法分發,分發邏輯如下 return true 由該dispatchtouchevent方法消費並且停止...

ViewPager子View滑動事件衝突解決

事件分發 public boolean dispatchtouchevent motionevent ev android事件以隧道方式逐層向下傳遞。事件首先由dispatchtouchevent方法分發,分發邏輯如下 return true 由該dispatchtouchevent方法消費並且停止...