Recycleview侧边添加拖拽控件
来源:互联网 发布:网络摄像头的安装步骤 编辑:程序博客网 时间:2024/06/06 01:36
一.概述
为了满足recycleview数据过多时,能够快速滑动到指定位置,特意自定义了一个控件,用来实现该功能,先看下效果图:
二.创建一个SlideBar类继承View
1.重写onMeasue方法:
@Override protected 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方法:
@Override protected 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)方法:
@Override public 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滑动到指定的位置.
点击下载源码
阅读全文
0 0
- Recycleview侧边添加拖拽控件
- 给recycleview添加一个拖拽更换位置
- Flex 侧边停靠控件
- 联系人侧边栏控件
- RecycleView添加分割线。
- Recycleview添加分割线
- Recycleview添加底部
- recycleView添加间隔线
- RecycleView添加动画
- RecycleView添加分割线
- RecycleView添加分割线
- recycleview的添加删除
- ViewPager与Recycleview控件
- RecycleView实现拖拽效果
- RecycleView添加HeaderView宽度不能撑满,第一次加载HeaderView的子控件获取不到焦点
- RecycleView控件的使用(二) 为RecyclerView添加头文件和尾部文件
- 给recycleview添加头布局并能点击item多个子控件
- firefox添加侧边栏工具
- 一个web项目web.xml的配置中<context-param>配置作用
- RxJava+Retrofit+OkHttp实战
- 正则表达式
- 前后端nginx部署(反向代理解决跨域问题)
- 图
- Recycleview侧边添加拖拽控件
- 51Nod-1711-平均数
- ecjtu-summer training #1 F (UVA 11461)
- 《例子实践1》 进度条慢慢往前增长
- Retrofit2 完全解析(一)
- linux下常用命令查看端口占用
- Android studio 快捷键
- selenium开发环境搭建
- GIS软件开发工具包TatukGIS Developer Kernel v11.6发布丨附下载