自定義支持懸浮子View的Viewgroup

GIF.gif

我的例子繼承ConstraintLayout,把要拖動的view在xml中 tag設(shè)置為float西剥,其他的view按正常的ConstraintLayout用法使用即可,互不影響,多個也可tag設(shè)為float

圖片.png

原理:基于ViewDragHelper料滥,view的拖拽按正常處理,抬手時判斷位置決定貼邊可參考鴻洋的教程

/**
 * Created by 不聽話的好孩子 on 2018/1/26.
 * 子viewTag為float會被抓住
 */
class FloatLayout @JvmOverloads constructor(
        context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : ConstraintLayout(context, attrs, defStyleAttr) {
    var MOVE_FLAT = "float"
    var sticky = true
    private var viewDragHelper: ViewDragHelper? = null
    val callback = object : ViewDragHelper.Callback() {
        override fun tryCaptureView(child: View?, pointerId: Int)= MOVE_FLAT == child?.tag

        //限制view上下邊界
        override fun clampViewPositionVertical(child: View, top: Int, dy: Int): Int {
            var verticalscroll = 0
            if (top > height - child.height) {
                verticalscroll = height - child.height
            } else {
                if (top > 0)
                    verticalscroll = top
            }
            return verticalscroll
        }
        //限制view左右邊界
        override fun clampViewPositionHorizontal(child: View, left: Int, dx: Int): Int {
            var horizontalScroll = 0
            if (left > width - child.width) {
                horizontalScroll = width - child.width
            } else {
                if (left > 0)
                    horizontalScroll = left
            }
            return horizontalScroll
        }

        override fun getViewVerticalDragRange(child: View): Int {
            return height - child.height
        }

        override fun getViewHorizontalDragRange(child: View): Int {
            return width - child.width
        }
         
//放手時貼邊
        override fun onViewReleased(releasedChild: View, xvel: Float, yvel: Float) {
            if (sticky) {
                if (releasedChild.left + releasedChild.width / 2 > width / 2) {
                    viewDragHelper?.settleCapturedViewAt(width - releasedChild.width, releasedChild.top)
                } else {
                    viewDragHelper?.settleCapturedViewAt(0, releasedChild.top)
                }
                invalidate()
            }
        }
    }

    override fun computeScroll() {
        if (viewDragHelper!!.continueSettling(true)) {
           invalidate()
        }
    }

    init {
        viewDragHelper = ViewDragHelper.create(this, 1f, callback)
    }

    override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean {
        return viewDragHelper!!.shouldInterceptTouchEvent(ev)
    }


//手指放下的地方在float子view上處理事件
    override fun onTouchEvent(event: MotionEvent): Boolean {
        viewDragHelper?.processTouchEvent(event)
        return true
    }
}


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末艾船,一起剝皮案震驚了整個濱河市葵腹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌屿岂,老刑警劉巖践宴,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異爷怀,居然都是意外死亡阻肩,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進店門霉撵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來磺浙,“玉大人洪囤,你說我怎么就攤上這事∷貉酰” “怎么了瘤缩?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長伦泥。 經(jīng)常有香客問我剥啤,道長,這世上最難降的妖魔是什么不脯? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任府怯,我火速辦了婚禮,結(jié)果婚禮上防楷,老公的妹妹穿的比我還像新娘牺丙。我一直安慰自己,他們只是感情好复局,可當我...
    茶點故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布冲簿。 她就那樣靜靜地躺著,像睡著了一般亿昏。 火紅的嫁衣襯著肌膚如雪峦剔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天角钩,我揣著相機與錄音吝沫,去河邊找鬼。 笑死递礼,一個胖子當著我的面吹牛惨险,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播宰衙,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼平道,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了供炼?” 一聲冷哼從身側(cè)響起一屋,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎袋哼,沒想到半個月后冀墨,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡涛贯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年诽嘉,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡虫腋,死狀恐怖骄酗,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情悦冀,我是刑警寧澤趋翻,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站盒蟆,受9級特大地震影響踏烙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜历等,卻給世界環(huán)境...
    茶點故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一讨惩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧寒屯,春花似錦荐捻、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至要出,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間农渊,已是汗流浹背患蹂。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留砸紊,地道東北人传于。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像醉顽,于是被迫代替她去往敵國和親沼溜。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,440評論 2 359

推薦閱讀更多精彩內(nèi)容