首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用viewdraghelper在自定义视图中忽略父对象的子对象match_parent

使用ViewDragHelper在自定义视图中忽略父对象的子对象match_parent是指在使用ViewDragHelper实现拖拽功能时,当子视图的宽度或高度设置为match_parent时,可以通过一些方法来忽略这些子视图的拖拽操作。

ViewDragHelper是Android提供的一个用于处理拖拽和滑动操作的辅助类。它可以帮助我们实现拖拽、滑动等交互效果,比如实现侧滑菜单、拖拽排序等功能。

在自定义视图中使用ViewDragHelper时,如果子视图的宽度或高度设置为match_parent,那么默认情况下,这些子视图也会参与到拖拽操作中,即当我们拖拽父视图时,这些子视图也会跟随移动。但有时我们希望忽略这些子视图的拖拽操作,只让父视图进行拖拽。

要实现忽略父对象的子对象match_parent,可以通过重写ViewDragHelper.Callback的相关方法来实现。具体步骤如下:

  1. 在自定义视图的构造方法中创建一个ViewDragHelper实例,并设置一个回调对象。
代码语言:java
复制
ViewDragHelper mDragHelper = ViewDragHelper.create(this, 1.0f, new ViewDragHelper.Callback() {
    // 重写相关方法
});
  1. 在回调对象中重写onViewDragStateChanged方法,当视图的拖拽状态发生变化时调用该方法。
代码语言:java
复制
@Override
public void onViewDragStateChanged(int state) {
    super.onViewDragStateChanged(state);
    if (state == ViewDragHelper.STATE_IDLE) {
        // 拖拽结束时,恢复子视图的布局参数
        resetChildLayoutParams();
    }
}
  1. 在回调对象中重写tryCaptureView方法,判断是否捕获子视图。
代码语言:java
复制
@Override
public boolean tryCaptureView(@NonNull View child, int pointerId) {
    // 判断是否捕获子视图,返回true表示捕获,返回false表示不捕获
    return !isChildMatchParent(child);
}
  1. 在回调对象中定义一个方法isChildMatchParent,用于判断子视图是否设置了match_parent。
代码语言:java
复制
private boolean isChildMatchParent(View child) {
    ViewGroup.LayoutParams layoutParams = child.getLayoutParams();
    return layoutParams.width == ViewGroup.LayoutParams.MATCH_PARENT ||
            layoutParams.height == ViewGroup.LayoutParams.MATCH_PARENT;
}
  1. 在回调对象中定义一个方法resetChildLayoutParams,用于恢复子视图的布局参数。
代码语言:java
复制
private void resetChildLayoutParams() {
    for (int i = 0; i < getChildCount(); i++) {
        View child = getChildAt(i);
        ViewGroup.LayoutParams layoutParams = child.getLayoutParams();
        layoutParams.width = child.getWidth();
        layoutParams.height = child.getHeight();
        child.setLayoutParams(layoutParams);
    }
}

通过以上步骤,我们可以实现在自定义视图中使用ViewDragHelper时忽略父对象的子对象match_parent的效果。当拖拽父视图时,子视图的宽度或高度为match_parent的子视图将不会参与拖拽操作,只有非match_parent的子视图会跟随移动。

这样的功能在一些需要实现拖拽排序的场景中比较常见,比如拖拽排序的列表,我们希望列表项可以拖拽排序,但列表项中的某些子视图(比如删除按钮)不参与拖拽操作,这时就可以使用ViewDragHelper来实现。

腾讯云相关产品和产品介绍链接地址:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Android 中 View 滑动

里面的内容(控件或者是显示内容),并且移动方向和方法参数正负是相反(也可以借助参考物来理解(容器移动,控件不移动,相对容器来说,控件移动方向是与其相反))。...invalidate(); break; } return true; } } 对于 activity_main.xml,我们则需要使用我们自定义布局...轮到我们 ViewDragHelper 类出场了,通过 ViewDragHelper 我们可以灵活地对不同 View 施加不同滑动效果,下面我们来看一下怎么使用这个功能强大类: 1、初始化 ViewDragHelper...对象:通常使用 ViewDragHelper.create(ViewGroup v, ViewDragHelper.Callback c); 方法来初始化一个新 ViewDragHelper 对象...* 这个方法可以创建 ViewDragHelper 对象时,指定被监听 ViewGroup 中哪个子 View 可以被移动, * 如果返回 true,那么继续监测当前触摸事件

92640

Android ViewDragHelper及移动处理总结

为了方便大家理解,我们首先来看一下android View对移动事件处理。 View移动方法总结 layout 自定义控件中,View绘制一个重写方法layout(),用来设置显示位置。...所以,可以通过修改View坐标值来改变viewView位置,以此可以达到移动效果!...但是获取getLayoutParams()时,要根据该View对应View布局来决定自身LayoutParams 。...若在ViewGroup中使用,移动是所有View;若在View中使用,移动是View内容(比如TextView)。所以,不可在view中使用以上方法!...ViewDragHelper使用 ViewDragHelper初始化 ViewDragHelper一般用在一个自定义ViewGroup内部,比如下面自定义了一个继承于LinearLayoutDragLayout

1.5K80
  • Android ViewDragHelper使用介绍

    ,我们写与拖拽滑动相关自定义控件时候就变得非常简单了,例如我们可以用来实现自定义侧滑菜单,再也不需要在onTouchEvent方法里计算滑动距离来改变布局边框位置了....使用ViewDragHelper大体步骤分为3步: 步骤1.自定义ViewGroup子类下通过ViewDragHelper静态方法获取到ViewDragHelper实例引用,注意它是一个单例...ViewDragHelper(forParent.getContext(), forParent, cb); } 可以发现它需要接收2个参数,参数1就是当前要使用ViewDragHelper自定义控件引用...,那么事件就会直接回调给onTouchEvent去处理,如果onTouchEvent返回true,则事件被消费,返回false则向上返回它类调用处,如果事件向上层层返回过程中没有被处理的话,那么事件最终将会消失...,假设我们要限制该自定义控件View水平方向移动范围为0-屏幕宽度0.6,那么如何控制呢.要实现这个限制,我们现在获取屏幕宽度,由于当前自定义控件是全屏显示,所以直接就可以那控件宽度来作为屏幕宽度

    97131

    Android-教你写小米系统应用--我小米

    构思 前面的文章中,我们已经了解了如何去自定义一个ViewGroup,可以onLayout中自由对子View进行位置设定,我们今天这里刚好需要对上面需求提到三部分子View(头像ImageView...,姓名TextView,功能Cell布局)滑动过程中进行位置设定,重绘,所以我们就可以自定义一个ViewGroup去实现。...> //初始化我们即将使用三个View @Override protected void onFinishInflate() { super.onFinishInflate();...其实Android support V4架包已经为我们提供了ViewDragHelper类,来辅助我们自定义ViewGroup时,来处理View滑动需求。...1.我们先实例化一个ViewDragHelper对象mDragHelper,可以onAttachedToWindow()方法中初始化,也可以ViewGroup构造器中初始化。

    65820

    Android Heroes Reading Notes 2

    自定义View可以响应你指定具体宽高值或者是match_parent属性,但是,如果要让自定义View支持wrap_content属性的话,那么就必须要重写onMeasure方法来指定wrap_content...ViewonDraw()方法包含一个参数Canvas对象使用这个Canvas对象就可以进行绘图了。...canvas) { //回调类方法之前实现自己逻辑,对TextView来说就是绘制文本之前 super.onDraw(canvas); //回调类方法之后实现自己逻辑...getLayoutParams或者使用ViewGroup.MarginLayoutParams viewgetLayoutParams得到LayoutParams需要和ViewGroupLayout...使用Scroller主要有三个步骤: 1.初始化Scroller对象,一般view初始化时候同时初始化scroller; 2.重写viewcomputeScroll方法,computeScroll

    58510

    Android实现单页面浮层可拖动view一种方法

    上一篇讲到通过通过goolge官方ViewDragHelper工具实现拖动方法(上一篇见https://www.zalou.cn/article/125481.htm),那么有一个问题就是DragframeLayout...中onTouchEvent一直接收不到触摸消息,而且onInterceptTouchEvent时候,并没有触发ViewDragHelper.tryCaptureView方法,因此诞生了另一种比较原始方法...:通过自定义可拖动view来实现 主要方法: initEdge:设置可拖动view能拖动范围初始边界,一般情况下为布局边界。...注意view.getLeft…等会获取到会0,我是在网路数据返回情况下设置边界,并显示。也有方法开一个线程获取。...AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } /** * 设置布局中边界

    80610

    实现Activity滑动退出

    实现View滑动有很多种方法,如自己onTouchEvent中处理触摸事件,然后滚动View到相应位置,也可以用google V4包为我们提供ViewDragHelper来处理触摸事件,我们这里选择后者...,因为滑动退出操作都是屏幕边缘时触发,而ViewDragHelper刚好提供了想要实现,可以说利用ViewDragHelper来实现我们需求非常简单。...if (mViewDragHelper.continueSettling(true)) { invalidate(); } } 这样我们自定义...这里我们要介绍一个DecorView,它是Window最顶层View,它含有一个LinearLayout,代表整个Window,包括通知栏,状态栏,内容显示区域,所以我们activity页面是DecorView...ViewView,那么我们能不能直接给DecorViewView添加到我们BaseSwipeLayout,再将BaseSwipeLayout添加到DecorView,当然是可以,而且这种方式

    1.1K20

    让你ListView更炫酷,实现侧滑删除效果

    又到了更新博客时间了,今天给大家带来是ListView侧滑出现删除等按钮效果。相信大家平时玩app时候都接触过这种效果吧。...这篇博文将用ViewDragHelper这个神器来实现侧滑效果。友情链接一下之前写博文使用ViewDragHelper来实现侧滑菜单,点击此处跳转。...如果你对ViewDragHelper不熟悉,你可以去看看鸿洋_《Android ViewDragHelper完全解析 自定义ViewGroup神器》。...还有一点要注意是,侧滑出按钮如果有两个或两个以上,那么必须用ViewGroup作为布局。要整体保持SwipeListLayout直接View为2个。...(当然你也可以设置都捕获,那样的话下面的逻辑要调整了),剩余几个函数中逻辑较为简单,onView Released(View releasedChild, float xvel, float yvel

    1.1K40

    Android 中通过ViewDragHelper实现ListViewItem侧拉划出效果

    关于ViewDragHelper使用,大家可以先看这篇文章ViewDragHelper使用介绍 实现该自定义控件大体步骤如下: 1.ViewDragHelper使用3部曲,初始化ViewDragHelper...,传递触摸事件,实现ViewDragHelper.Callback抽象类. 2.需要创建2个直接View,分别是前景View和背景View,代表ListView每一项Item布局组成,如下所示:...以上2部分就是该自定义控件要包含2个直接View. 3.需要获取FrontView宽高,宽度其实就是屏幕宽度,高度就是ListView每一项Item高度;还需获取BackView宽度,因为这个宽度就是侧滑最大范围...使用该控件,必须要让其有2个直接控件,如下布局所示: <?xml version="1.0" encoding="utf-8"?...需要考虑2点: 1.自定义SwipeLayout控件内需要处理3种状态,打开,关闭,拖拽. 2.需要添加一个侧滑监听接口,用于对外暴露当前SwipeLayout打开,关闭,拖拽,将要打开,将要关闭这

    1K51

    Android开发之使用150行代码实现滑动返回效果

    但是依然不妨碍我们效果展示~ OK,接下来惯例,通过阅读本文你能学习到: ViewDragHelper使用(如果你想学习自定义View,那么ViewDragHelper你绝对不能错过) 好像也没有什么了...我们自定义一个SwipeBackFrameLayout继承自FrameLayout 1.1 因为看到左边黄色View是被遮住,而另外一个View宽度是MatchParent,所以FrameLayout...); 1.4 SwipeBackFrameLayout里实例化xml里View private View mDividerView; private View mContentView; @Override...view后还需要自定义一下activity退出动画~ 2.定义activityfinish动画 2.1 anim目录下,创建两个动画xml: //no_anim <alpha android...同学们还是去看源码吧: 源码Github上 总结 以上所述是小编给大家介绍教你150行代码实现滑动返回效果代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家

    55920

    Android使用ViewDragHelper实现图片下拽返回示例

    微信图片下拽返回功能在日常使用中非常方便,同时很多 App 中都见到了类似的设计,可以说一旦习惯这种操作再也回不去了。...ViewDragHelper 是 support v4 兼容包中一个工具类,用来简化自定义 ViewGroup 中手势处理。...使用 ViewDragHelper 可以轻松实现 ViewGroup 里 View 拖拽操作,这里介绍下使用 ViewDragHelper 里几个重要步骤。...自定义 DragLayout,内部使用 ViewDragHelper 来处理拖拽操作。 2....他山之石可以攻玉,翻看其源码,也学到一些很少用到小技巧,比如获取当前触摸位置 View,逆向遍历全部 View 集合然后判断触摸坐标是否范围内,真是简单粗暴: @Nullable public

    1.2K10

    使用ViewDragHelper打造属于自己DragLayout(抽屉开关 )

    https://blog.csdn.net/gdutxiaoxu/article/details/51935896 使用ViewDragHelper打造属于自己DragLayout(抽屉开关...) ---- DrawLayout这个自定义空间很常见,qq,网易新闻,知乎等等,都有这种效果,那这种效果是怎样实现呢?...首先我们先来看一下我们要怎样使用它 其实只需要两个 步骤,使用起来 非常方便 1.XML文件 DragLayout至少要有两个孩子,且都是 ViewGroup或者ViewGroup实现类 <com.xujun.drawerLayout.drag.DragLayout...自定义属性可以通过 app:range=”480”或者setRange()方法,即可设置打开抽屉范围。...本篇博客是使用ViewDragHelper来 处理触摸事件和拖拽事件ViewDragHelper是2013Google IO大会推出,目的是为了给开发者提供一个处理触摸事件,节省开发者时间。

    82720

    Android Scroll分析

    ---- 视图坐标系 Android还有一个视图坐标系,它描述视图图中位置关系。 和上面的Android坐标系相辅相成。...需要注意是: scrollTo和scrollBy方法移动是Viewcontent,即让View中内容移动,如果在ViewGroup中使用scrollTo和scrollBy方法,那么移动将是所有的...View,但如果在View中使用,那么移动将是View内容,比如TextView,content就是它文本,ImageView,content就是它Drawable对象。...使用绝对坐标系时,也可以通过scrollTo来实现相同效果 Code 关键自定义View package com.turing.base.android_hero.chapter5_Scroll;...总体来讲,scrollTo scrollBy方法,View移动都是瞬间事件执行时候平移已经完成了,而Scroller类可以实现平滑移动效果,而不是瞬间完成移动。

    80820
    领券