Recycleview侧边添加拖拽控件

2024-04-19 16:18

本文主要是介绍Recycleview侧边添加拖拽控件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一.概述
为了满足recycleview数据过多时,能够快速滑动到指定位置,特意自定义了一个控件,用来实现该功能,先看下效果图:
这里写图片描述

二.创建一个SlideBar类继承View

1.重写onMeasue方法:

  @Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);int width = getMySize(MeasureSpec.getSize(widthMeasureSpec), widthMeasureSpec);int height = getMySize(MeasureSpec.getSize(heightMeasureSpec), heightMeasureSpec);//设置控件的大小setMeasuredDimension(width, height);}private int getMySize(int defaultSize, int measureSpec) {int mySize = defaultSize;int mode = MeasureSpec.getMode(measureSpec);int size = MeasureSpec.getSize(measureSpec);switch (mode) {case MeasureSpec.UNSPECIFIED: {//如果没有指定大小,就设置为默认大小mySize = defaultSize;break;}case MeasureSpec.AT_MOST: {//如果测量模式是最大取值为size//我们将大小取最大值,你也可以取其他值mySize = size;break;}case MeasureSpec.EXACTLY: {//如果是固定的大小,那就不要去改变它mySize = size;break;}}return mySize;}

自定义控件继承view一般都需要重写onMeasuer方法,这个方法目的就是测量控件的大小而已.
2.重写onDraw方法:

  @Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);//加载拖拽图片Bitmap bitmap =BitmapFactory.decodeResource(getResources(), R.mipmap.title_scroll_n);//分别得到图片的宽,高int height = bitmap.getHeight();mWidth = bitmap.getWidth();//记录宽,高中的较大值用来滑动的时候判断mSlideBarHeight = height > mWidth ? height : mWidth;//将图片画出来canvas.drawBitmap(bitmap,getMeasuredWidth()- mWidth,0,mPaint);}

ondraw方法主要就是滑出我们的view需要显示的内容,我们这里就只要显示拖拽图片即可.

3.重写onTouchEvent(MotionEvent event)方法:

@Overridepublic boolean onTouchEvent(MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN://记录按下的x,y坐标float downX = event.getX();mDownY = event.getY();//如果按下的位置不是拖拽图片就不响应事件if (downX > getMeasuredWidth() || downX < getMeasuredWidth()- mWidth|| mDownY > Math.abs(getScrollY()) + mSlideBarHeight|| mDownY < Math.abs(getScrollY())) {return false;}break;case MotionEvent.ACTION_MOVE://计算滑动的距离的百分百float diffY = move(event);//滑动拖拽图片scrollBy(0, -(int) diffY);mDownY = event.getY();break;case MotionEvent.ACTION_UP:move(event);break;case MotionEvent.ACTION_OUTSIDE:move(event);break;}return true;}private float move(MotionEvent event) {float diffY = event.getY() - mDownY;//判断界限if (getScrollY() - diffY > 0) {diffY = getScrollY();}if (getScrollY() - diffY < -(getMeasuredHeight()-mSlideBarHeight)) {diffY = getScrollY() + getMeasuredHeight()-mSlideBarHeight;}//已经滑动的距离int scrollHeight = getScrollY() - (int) diffY;//求出滑动的距离占View的高度的百分比float progress = Math.abs(scrollHeight)*1.0f / (getMeasuredHeight()-mSlideBarHeight);//使得返回的position的范围在0~size之间if (progress >= 0 && progress <= 1) {//计算已经滑动的距离,应该时recycleview滑动到的位置int position = (int) Math.ceil(progress * size);if (mOnTouchingChangedListener != null) {mOnTouchingChangedListener.onTouchingChanged(position);}}return diffY;}

重写onTouchevent方法主要是做2件事,一是让拖拽图片滑动,而是计算已经滑动的距离,应该时recycleview滑动到的位置,然后回调给使用者,然后将recycleview滑动到指定的位置.

点击下载源码

这篇关于Recycleview侧边添加拖拽控件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/918033

相关文章

C#实现WinForm控件焦点的获取与失去

《C#实现WinForm控件焦点的获取与失去》在一个数据输入表单中,当用户从一个文本框切换到另一个文本框时,需要准确地判断焦点的转移,以便进行数据验证、提示信息显示等操作,本文将探讨Winform控件... 目录前言获取焦点改变TabIndex属性值调用Focus方法失去焦点总结最后前言在一个数据输入表单

lvgl8.3.6 控件垂直布局 label控件在image控件的下方显示

在使用 LVGL 8.3.6 创建一个垂直布局,其中 label 控件位于 image 控件下方,你可以使用 lv_obj_set_flex_flow 来设置布局为垂直,并确保 label 控件在 image 控件后添加。这里是如何步骤性地实现它的一个基本示例: 创建父容器:首先创建一个容器对象,该对象将作为布局的基础。设置容器为垂直布局:使用 lv_obj_set_flex_flow 设置容器

小程序button控件上下边框的显示和隐藏

问题 想使用button自带的loading图标功能,但又不需要button显示边框线 button控件有一条淡灰色的边框,在控件上了样式 border:none; 无法让button边框隐藏 代码如下: <button class="btn">.btn{border:none; /*一般使用这个就是可以去掉边框了*/} 解决方案 发现button控件有一个伪元素(::after

MFC中Spin Control控件使用,同时数据在Edit Control中显示

实现mfc spin control 上下滚动,只需捕捉spin control 的 UDN_DELTAPOD 消息,如下:  OnDeltaposSpin1(NMHDR *pNMHDR, LRESULT *pResult) {  LPNMUPDOWN pNMUpDown = reinterpret_cast(pNMHDR);  // TODO: 在此添加控件通知处理程序代码    if

MFC 控件重绘(2) NM_CUSTOMDRAW, WM_DRAWITEM, 虚函数DrawItem

控件重绘有三种方法: 1 设定界面属性 2 利用Windows的消息机制,通过Windows消息映射(Message Mapping)和反映射(Message Reflecting),在合适的时机修改控件的状态和行为。此方式涉及NM_CUSTOMDRAW和WM_DRAWITEM 3 利用虚函数机制,重载虚函数。即DrawItem虚函数。 对于NM_CUSTOMDRAW,某些支持此消息的控件

C# 通过拖控件移动窗体

目录 引言一、通过控件事件移动窗体1、创建窗体界面2、添加控件事件3、添加代码 二、通过windowsAPI移动窗体1、 构建窗体和添加事件2、代码展示 引言 在C#Form窗体设计中,如果我们不需要使用默认边框设计自己个性化的窗体(FromBorderStyle=none时),这时候你会发现拖动窗体的功能就没有了,这里需要自己构建方法让用户可以拖动整个窗体,这里我们使用前辈的

Qt-常用控件(3)-多元素控件、容器类控件和布局管理器

1. 多元素控件 Qt 中提供的多元素控件有: QListWidgetQListViewQTableWidgetQTableViewQTreeWidgetQTreeView xxWidget 和 xxView 之间的区别,以 QTableWidget 和 QTableView 为例. QTableView 是基于 MVC 设计的控件.QTableView 自身不持有数据,使用 QTab

类codepen的实现可拖拽窗口demo

首先说下思想 flex或者其他布局方式,实现左右分割布局,主盒子宽度100%,左右布局中包含一个分割条(可在布局容器中,也可以单独定义)为分隔条绑定鼠标点击事件,为document绑定鼠标移动事件和鼠标放开事件,通过监听鼠标移动事件和上一个状态保存下来的鼠标位置作对比,判断当前鼠标移动方向(往左还是往右)然后计算当前鼠标位置和鼠标点击位置的距离,来计算左右容器的变化,然后通过dom的方式设置宽度

ASP.NET手动触发页面验证控件事件

开发环境:.NET Framework 3.5.1 sp1 参考文章: http://www.codeproject.com/KB/aspnet/JavascriptValidation.aspx http://msdn.microsoft.com/zh-cn/library/aa479045.aspx http://www.cnblogs.com/minsentinel/archive/

兔子--计算listview的高度,解决listview与scrollview控件冲突

/** * 计算ListView的高度 * * @param listView */ public void setListViewHeightBasedOnChildren(ListView listView) { // 获取ListView对应的Adapter OrderGoodsAdapter listAdapter = (OrderGoodsAdapter) listView.getAda