重写控件时 getScrollX() 获取的值是

本文通过实际测试解释了Android中getScrollX方法的功能。该方法返回当前水平滚动位置的坐标,即视图最左侧相对于其父容器的横坐标。文章还对比了触摸事件坐标与getScrollX坐标的不同。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 重写控件,发现不知道这方法取的值是什么,   看api的没理解

  没理解 所以打log,看值  (以类似slidingmenu那种效果测试)

 手指往右移动的时候 中间view往右移动,左菜单出现 时 getScrollX()的值未负的,反之 手指往左边移动,则正的

 手指往右移动的时候         手指往左边移动


 那是否可以这么理解以 (0,0)坐标点  减去  view最左边所在位置的X值

  view部分到左边隐藏了,自然是负的,


  那么  0 - x的值 ==> getScrollX();

 





 以下是转载的

  http://hi.baidu.com/huazai30000/item/1f400ce1db7f8d18585dd816

今天写了一个Scroller的demo

遇到一个问题getScrollX

这个函数获得的是什么啊?

在网上没有找到答案 我就自己写 进行测试

我在一个ViewGroup中添加图片,然后进行Scroller

实际上ViewGroup的大小是超过屏幕的大小的 所以必然会隐藏了View

那么在触摸的时候屏幕上的ontouch事件会获得一个坐标值,而getScroller会获得一个值

ontouch事件获得的始终是屏幕大小那一块的坐标值

但是getScrollX获得的是整个View的坐标

也就是说getScrollX获得的是你开始触摸的位置的横坐标

当翻滚到另一个图片的时候 那么他会他的坐标原点始终是View最左边的那个点 但是那个点不一定是屏幕的坐标原点

<think>我们正在寻找Android平台上实现左滑删除功能的控件或库。根据提供的引用,我们可以了解到实现左滑删除通常需要自定义ViewGroup(如HorizontalScrollView)或者使用现有的库。引用[1]提到:自定义控件需要继承ViewGroup,因为左滑删除包含两个子控件(内容区域和按钮区域)。引用[2]则提供了一个具体的自定义HorizontalScrollView的实现(LeftSlideHorizontalScrollView)以及一个用于控制多个视图联动(同只能展开一个)的工具类LeftSlideUtils。引用[3]也提到了类似的实现。因此,我们可以总结出两种方式:1.自己实现自定义控件(如继承HorizontalScrollView)。2.使用现有的开源库。考虑到用户可能希望快速实现而不想自己从头开发,我们可以推荐一些成熟的开源库。同,也可以简要介绍自定义实现的关键步骤。在开源库方面,Android平台上常用的左滑删除库有:-AndroidSwipeLayout:一个功能强大的滑动布局库,支持左右滑动显示菜单项。-RecyclerView的ItemTouchHelper:这是官方支持库中的类,可以配合RecyclerView实现滑动删除(包括左滑和右滑)和拖拽排序。其中,ItemTouchHelper是官方推荐的方式,但它的滑动删除通常是一次性滑动触发删除操作,而左滑删除并显示操作按钮(如删除、收藏等)则可以使用AndroidSwipeLayout。下面分别介绍:###1.使用RecyclerView的ItemTouchHelper(适用于简单滑动删除)这种方式通常用于滑动删除整个条目,而不是显示多个操作按钮。但我们可以通过自定义ItemTouchHelper.Callback来实现显示操作按钮,不过实现起来稍复杂。###2.使用AndroidSwipeLayout这是一个流行的开源库,支持在ListView、RecyclerView等控件中实现滑动显示操作按钮。项目地址:https://github.com/daimajia/AndroidSwipeLayout####使用步骤:1.在build.gradle中添加依赖:```groovyimplementation"com.daimajia.swipelayout:library:1.2.0@aar"```2.在布局文件中使用SwipeLayout包裹你的内容布局和操作按钮布局:```xml<com.daimajia.swipe.SwipeLayoutandroid:id="@+id/swipe"android:layout_width="match_parent"android:layout_height="wrap_content"><!--底部操作按钮(滑动显示)--><LinearLayoutandroid:background="#FF0000"android:layout_width="wrap_content"android:layout_height="match_parent"android:gravity="center"android:orientation="horizontal"><Buttonandroid:id="@+id/delete"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Delete"/></LinearLayout><!--表面内容(正常显示)--><FrameLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:background="#ffffff"><!--这里放你的正常内容--></FrameLayout></com.daimajia.swipe.SwipeLayout>```3.在代码中设置滑动属性(可选):```javaswipeLayout.setShowMode(SwipeLayout.ShowMode.LayDown);//设置滑动底部视图的显示方式swipeLayout.addDrag(SwipeLayout.DragEdge.Right,swipeLayout.findViewById(R.id.bottom_wrapper));//设置从右边滑动```###3.自定义实现(参考引用[2])如果你希望自己实现,可以继承HorizontalScrollView,并管理两个子视图:内容视图和操作按钮视图。在触摸事件中,根据滑动的距离来控制HorizontalScrollView的滚动,从而实现左滑显示按钮的效果。同,需要处理联动(即当滑动一个条目,关闭其他已展开的条目)。关键点:-在onMeasure和onLayout中正确测量和布局两个子视图。-在onTouchEvent中处理滑动事件,根据手指移动的距离滚动视图。-添加回调接口,如引用[2]中的MoveClickListener。###推荐对于大多数情况,使用AndroidSwipe库是快速且功能丰富的选择。如果你使用的是RecyclerView,并且希望使用官方支持,也可以考虑结合ItemTouchHelper和自定义视图来实现(但相对复杂)。因此,根据用户需求,我们推荐使用AndroidSwipeLayout库。§§相关问题§§1.如何在RecyclerView中使用ItemTouchHelper实现滑动删除?2.如何自定义一个左滑删除控件(继承HorizontalScrollView)?3.使用AndroidSwipeLayout,如何实现多个条目同只能展开一个?</think>在 Android 平台上实现左滑删除功能,主要有以下三种实现方式: ### 一、推荐方案:使用成熟开源库 **AndroidSwipeLayout** 是最流行的选择: ```groovy // build.gradle 添加依赖 implementation "com.daimajia.swipelayout:library:1.2.0@aar" ``` ```xml <!-- 布局示例 --> <com.daimajia.swipe.SwipeLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <!-- 隐藏的操作区域(右侧)--> <LinearLayout android:id="@+id/bottom_wrapper" android:background="#E74C3C" android:layout_width="100dp"> <Button android:text="删除"/> </LinearLayout> <!-- 内容区域 --> <TextView android:background="#FFFFFF" android:text="可滑动内容"/> </com.daimajia.swipe.SwipeLayout> ``` **特点**: - 支持多方向滑动(左/右/上/下) - 提供滑动事件监听 - 与 ListView/RecyclerView 完美兼容 - 支持自动关闭其他已展开项[^2] ### 二、官方方案:RecyclerView + ItemTouchHelper ```java // 在 RecyclerView 中使用 ItemTouchHelper.SimpleCallback callback = new ItemTouchHelper.SimpleCallback( 0, ItemTouchHelper.LEFT) { @Override public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) { // 滑动删除回调 adapter.removeItem(viewHolder.getAdapterPosition()); } @Override public boolean onMove(...) { return false; } // 不需要拖拽 }; new ItemTouchHelper(callback).attachToRecyclerView(recyclerView); ``` **优点**: - 官方支持库实现 - 无需额外依赖 - 天然支持动画效果 ### 三、自定义控件方案(参考引用实现) 如引用中提到的 `LeftSlideHorizontalScrollView`[^2]: ```java public class SlideDeleteLayout extends HorizontalScrollView { private int menuWidth; // 删除按钮宽度 @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { super.onLayout(changed, l, t, r, b); scrollTo(0, 0); // 初始隐藏删除按钮 } @Override public boolean onTouchEvent(MotionEvent ev) { switch(ev.getAction()) { case MotionEvent.ACTION_UP: if (getScrollX() > menuWidth / 2) { smoothScrollTo(menuWidth, 0); // 展开 } else { smoothScrollTo(0, 0); // 收起 } return true; } return super.onTouchEvent(ev); } } ``` **关键实现点**: 1. 继承 `HorizontalScrollView` 作为容器 2. 左侧放置内容视图,右侧放置操作按钮 3. 通过 `scrollTo()` 控制按钮显示/隐藏 4. 重写 `onTouchEvent` 处理滑动逻辑[^1] ### 方案对比 | 方案 | 优点 | 适用场景 | |--------------------|-----------------------------|-----------------------| | AndroidSwipeLayout | 功能全面,定制性强 | 复杂交互需求 | | ItemTouchHelper | 官方支持,集成简单 | RecyclerView标准删除 | | 自定义控件 | 无依赖,完全可控 | 特殊布局定制需求 | 根据需求推荐: - **快速实现** → 选用 `AndroidSwipeLayout` - **RecyclerView标准列表** → 选用 `ItemTouchHelper` - **特殊定制需求** → 参考自定义控件实现[^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值