ListView中让TextView中的文字进行单独滚动
TextView不能在ListeView中單獨的滾動原因
默認ListView將會攔截MOVE事件向下傳遞
參見源碼
case MotionEvent.ACTION_MOVE: {switch (mTouchMode) {case TOUCH_MODE_DOWN:int pointerIndex = ev.findPointerIndex(mActivePointerId);if (pointerIndex == -1) {pointerIndex = 0;mActivePointerId = ev.getPointerId(pointerIndex);}final int y = (int) ev.getY(pointerIndex);initVelocityTrackerIfNotExists();mVelocityTracker.addMovement(ev);if (startScrollIfNeeded((int) ev.getX(pointerIndex), y, null)) {//此處將會攔截事件的傳遞return true;}break;}break;}方案
使用NestedScrollChild\NestedScrollParent進行實現
Android 5.0 Lollipop 提供該套功能的API,NestedScrollChild\NestedScrollParent的定義集成到了View,ViewGroup中,V4包中提供向前兼容的API
具體步驟-此處采用集成的API,而未采用直接繼承NestedScrollChild/NestedScrollParent
xml文件設置
TextView設置屬性:android:nestedScrollingEnable=”true” //允許進行嵌套滾動
代碼設置
ListeView中的改寫
改寫事件攔截條件,默認攔截ACTION_MOVE,不傳遞給子View
改寫實現
/**
* 改寫MotionEvent 攔截條件,當子View中有需要請求nested scroll 的時候不進行攔截
*/
override fun onInterceptTouchEvent(ev: MotionEvent): Boolean {
var superIntecept: Boolean
val actionMasked = ev.actionMasked
//先不改變ListView的默認實現,在下面的代碼中根據情況進行攔截修改
superIntecept = super.onInterceptTouchEvent(ev)
TextView中的改寫
改寫onTouchEvent,當剛觸摸時立即請求NestedScroll ,即調用startNestedScroll(View中已實現)
具體實現
override fun onTouchEvent(event: MotionEvent?): Boolean {var action = event!!.actionMaskedwhen (action) {//down之后就開始nested scroll聲明,并請求父View不攔截 touch eventMotionEvent.ACTION_DOWN -> {startNestedScroll(ViewCompat.SCROLL_AXIS_VERTICAL)val parent = parentparent?.requestDisallowInterceptTouchEvent(true)}}return super.onTouchEvent(event) }附-NestedScrollChild/NestedScrollParent使用介紹相關博客
https://blog.csdn.net/chen930724/article/details/50307193
https://blog.csdn.net/lmj623565791/article/details/52204039
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0822/3342.html
https://segmentfault.com/a/1190000002873657
總結
以上是生活随笔為你收集整理的ListView中让TextView中的文字进行单独滚动的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小米路由器5g网络怎么用如何启动路由器的
- 下一篇: windows平板电脑二合一(windo