RecyclerView加上弧形滚动条

Android:RecyclerView滑动到边缘时的光晕效果 对于RecyclerView 都已经不再陌生,我们大家都知道RecyclerView等可滑动控件默认的是会有滚动条以及滑动到边缘时的阴影(光晕)效果的,那么怎样去掉这两个默认属性呢,在这里简单的介绍一下。 阅读详情
  
界面主要是通过GridLayoutManager设置每行显示两个item;
           mRecyclerView = (MyRecyclerView) rootView.findViewById(R.id.id_recyclerview_grid);
        mAppAddBtn = (ImageView)  rootView.findViewById(R.id.app_list_add);
        mManager = new GridLayoutManager(getActivity().getBaseContext(), 2);
        mRecyclerView.setLayoutManager(mManager);


        mRecyclerView.setAdapter(mAdapter);
        mAdapter.setOnItemClickListener(this);
        mAdapter.setOnItemLongClickListener(this);
此处就不做介绍了,本文主要是讲在RecyclerView界面右侧加上弧形滚动条
原理:
        自定义RecyclerView,继承RecyclerView,重写onDraw方法,在onDraw中画出滚动条,通过adapter中getItemCount()方法获得总的item数目来决定滚动条移动部分的长度,
优点:
借助RecyclerView的刷新来刷新滚动条位置,不用自己去做大量的刷新,相比于单独定义view可优化部分性能;
代码实现:
public class MyRecyclerView extends RecyclerView {
	private static final String TAG = "RecyclerView";
	int mArcLength = 0;
	private GridLayoutManager mLayoutManager;
	
	private Paint mBgArcPaint;
	private Paint mArcPaint;
	private Paint mCirclePaint;
	private Paint mBgCirclePaint;

	private final int START_ANGLE = 320;
	private final int SWEEP_ANGLE = 80;
	private final int PADDING =12;
	private boolean mIndicatorVisible = false;  // 是否显示滚动条
	private int mVisibleItemCount = 0;
	private Handler mHandler = new Handler();
	private int mYscroll = 0;
	private MyAdapter mAdapter;
	private int mItemHeight = 0;
	private float mStrokeWidth = 6;
     private int topBottomPadding = 30+40 ;


	public MyRecyclerView(Context context) {
		super(context);
		// TODO Auto-generated constructor stub
		init();
	}


	public MyRecyclerView(Context context, AttributeSet attrs) {
		super(context, attrs);
		// TODO Auto-generated constructor stub
		init();
	}

   /**
   *定义画笔样式
   **/
	private void init() {
		mBgArcPaint = new Paint();
		mBgArcPaint.setAntiAlias(true);
		mBgArcPaint.setColor(Color.GRAY);
		mBgArcPaint.setStrokeWidth(mStrokeWidth);
		mBgArcPaint.setStyle(Style.STROKE);
		mArcPaint = new Paint();
		mArcPaint.setAntiAlias(true);
		mArcPaint.setColor(Color.WHITE);
		mArcPaint.setStrokeWidth(mStrokeWidth);
		mArcPaint.setStyle(Style.STROKE);
//		setOnScrollListener(mOnScrollListener);
		mCirclePaint = new Paint();
		mCirclePaint.setAntiAlias(true);
		mCirclePaint.setColor(Color.WHITE);
		mBgCirclePaint = new Paint();
		mBgCirclePaint.setAntiAlias(true);
		mBgCirclePaint.setColor(Color.GRAY);
		setOnScrollListener(mOnScrollListener);
	}


	public void clear() {
		Paint paint = new Paint();
		paint.setXfermode(new PorterDuffXfermode(Mode.CLEAR));
		paint.setXfermode(new PorterDuffXfermode(Mode.SRC));
		invalidate();
	}

	@Override
	public void draw(Canvas arg0) {
		// TODO Auto-generated method stub
		super.draw(arg0);
	}

	@Override
	public void onDraw(Canvas canvas) {
		// TODO Auto-generated method stub
		super.onDraw(canvas);


		if (mIndicatorVisible) {  
			int width = getWidth();
			int height = getHeight();
			int diameter = Math.max(width, height)-PADDING;//diameter should < 200
			int count = getAdapter().getItemCount();
			int first = mLayoutManager.findFirstVisibleItemPosition();
			int last = mLayoutManager.findLastVisibleItemPosition();
			View v = mLayoutManager.getChildAt(first);
			if (v != null) {
				mItemHeight = v.getHeight();
			}
			if (mVisibleItemCount == 0) {
				mVisibleItemCount = last - first;
			}
			Log.e(TAG,"------mItemHeight="+mItemHeight+", width = "+width+",height="+height);
			int totalHeight = mItemHeight * (mAdapter.getItemCount()/mLayoutManager.getSpanCount()+mAdapter.getItemCount()%mLayoutManager.getSpanCount())+ topBottomPadding;
			float offsetAngle = 0;
			
		
			float sweepAngle = (height * SWEEP_ANGLE / totalHeight);
			if (totalHeight != 0) {
				offsetAngle = (SWEEP_ANGLE * ((float) mYscroll) / totalHeight);
			} else {
				offsetAngle = (SWEEP_ANGLE * ((float) first) / count);
			}
			RectF rect = new RectF((width - diameter) / 2,
					(height - diameter) / 2, (width + diameter) / 2,
					(height + diameter) / 2);
			canvas.drawCircle(
					(float) (width / 2 + diameter/ 2* Math.cos((START_ANGLE) * Math.PI/ 180)),
					(float) (height / 2 + diameter/ 2* Math.sin((START_ANGLE) * Math.PI/ 180)), mStrokeWidth / 2, mBgCirclePaint);
			canvas.drawArc(rect, START_ANGLE, SWEEP_ANGLE, false, mBgArcPaint);
			
			canvas.drawCircle((float) (width / 2 + diameter/ 2* Math.cos((START_ANGLE + SWEEP_ANGLE) * Math.PI/ 180)),
					(float) (height / 2 + diameter/ 2* Math.sin((START_ANGLE + SWEEP_ANGLE) * Math.PI/ 180)), 
					mStrokeWidth / 2, mBgCirclePaint);
			RectF rect2 = new RectF((width - diameter) / 2,
					(height - diameter) / 2, (width + diameter) / 2,
					(height + diameter) / 2);
			Log.d(TAG, "-------sweepAngle=" + sweepAngle + ",offsetAngle="+ offsetAngle);
			canvas.drawCircle(
(float) (width / 2 + diameter
/ 2
* Math.cos((START_ANGLE + offsetAngle) * Math.PI
/ 180)),
(float) (height / 2 + diameter
/ 2
* Math.sin((START_ANGLE + offsetAngle) * Math.PI
/ 180)), mStrokeWidth / 2, mCirclePaint);
canvas.drawArc(rect2, START_ANGLE + offsetAngle, sweepAngle, false,
mArcPaint);

canvas.drawCircle(
(float) (width / 2 + diameter
/ 2
* Math.cos((START_ANGLE + offsetAngle+sweepAngle) * Math.PI
/ 180)),
(float) (height / 2 + diameter
/ 2
* Math.sin((START_ANGLE + offsetAngle+sweepAngle) * Math.PI
/ 180)), mStrokeWidth / 2, mCirclePaint);
		} else {
			Paint paint = new Paint();
			paint.setXfermode(new PorterDuffXfermode(Mode.CLEAR));
			canvas.drawPaint(paint);
			paint.setXfermode(new PorterDuffXfermode(Mode.SRC));
		}


	}


	@Override
	public void setLayoutManager(LayoutManager layout) {
		// TODO Auto-generated method stub
		super.setLayoutManager(layout);
		if (mLayoutManager != layout) {
			
//			mLayoutManager = (LinearLayoutManager) layout;
			mLayoutManager = (GridLayoutManager) layout;
		}


	}
	@Override
	protected void onAttachedToWindow() {
		// TODO Auto-generated method stub
		super.onAttachedToWindow();
		if (getAdapter() != null) {
			Log.e(TAG, "-----" + getAdapter().getItemCount());


		}
	}


	Runnable mRun = new Runnable() {
		public void run() {
			mIndicatorVisible = false;
			invalidate();
		}
	};


	@Override
	public boolean onTouchEvent(MotionEvent arg0) {
		// TODO Auto-generated method stub
		int action = arg0.getAction();
		if (action == MotionEvent.ACTION_MOVE) {
			mIndicatorVisible = true;
		} else if (action == MotionEvent.ACTION_UP) {
			mHandler.removeCallbacks(mRun);
			mHandler.postDelayed(mRun, 3000);
		}
		return super.onTouchEvent(arg0);
	}
@Override
	public void setAdapter(Adapter adapter) {
		// TODO Auto-generated method stub
		super.setAdapter(adapter);
		mAdapter = (MyAdapter) adapter;
	}


	private RecyclerView.OnScrollListener mOnScrollListener = new RecyclerView.OnScrollListener() {

		@Override
		public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
			// TODO Auto-generated method stub
			super.onScrollStateChanged(recyclerView, newState);
		}

		@Override
		public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
			// TODO Auto-generated method stub
			super.onScrolled(recyclerView, dx, dy);
			mYscroll = mYscroll + dy;
		}


	};


}

        
Android-改造LayoutManager实现弧形滚动和中间放大的效果 改造LayoutManager实现弧形滚动和中间放大的效果 立即下载

相关推荐

保姆级教程:STK 11.0 从下载到安装成功(附Matlab互联配置与常见问题解决)

本文提供STK 11.0的完整安装指南,包括下载、安装步骤、Matlab互联配置及常见问题解决方案。详细介绍了系统要求核查、分步安装流程、关键文件替换和许可证配置,确保用户能够顺利完成STK 11.0的部署并实现与Matlab的无缝对接。

weixin_30698297的博客 347

android弧形左右滑动空间,自定义LayoutManager 实现弧形以及滑动放大效果RecyclerView...

我们都知道RecyclerView可以通过将LayoutManager设置为StaggeredGridLayoutManager来实现瀑布流的效果。默认的还有LinearLayoutManager用于实现线性布局,GridLayoutManager用于实现网格布局。然而RecyclerView可以做的不仅限于此,通过重写LayoutManager我们可以按自己的意愿实现更为复杂的效果。而且将控件与...

weixin_42405890的博客 1321

从0开始部署基础的AlwaysOn

在这个快餐文化盛行的时代,应该没多少人真的会沉下心来看理论和具体步骤,加上我自己也需要一篇可以扩展的快速搭建环境的指引,所以特别写了这篇文章。 我们在这里要做的事情有以下几个:安装环境。包括虚拟机和网络配置等。安装Windows域、配置必要的账号密码及功能。搭建域环境并进行配置。安装配置Windows Server Failover Cluster(WSFC)。安装SQL Server。配置Alw

MVP黄钊吉(發糞塗牆) 7577

Android 弧形列表转盘的实现(三),View跟随RecyclerView做旋转动画;

前两篇博客: Android 弧形转盘的实现(一),弧形列表; Android 弧形转盘的实现(二),列表自动选中;RecyclerView滑动后自动选中居中的条目,RecyclerView实现WheelView效果; 已经大致实现了弧形转盘的效果,还有一个动画需要做,这个比较简单; 效果图左边的刻度轮盘是个半圆,其实应该是个整圆只显示一半,另外一半在屏幕外面; 尝试使用PaddingLift把ImageView挤到屏幕外面,默认效果是可以,但是旋转的时候也是个半圆在旋转,这样就不行了;索性直

Choi晨的博客 4796

小鹏P7车载以太网诊断实战:从OBD口定义到DoIP协议验证

本文详细解析了小鹏P7车载以太网诊断的实战过程。从OBD接口的针脚定义入手,依据ISO13400标准,确认了以太网线对位置,并指导制作专用的RJ45转OBD线束。通过搭建测试环境,使用Ping、端口扫描及Wireshark抓包,最终成功验证了车辆对DoIP协议的支持,为基于以太网的高速诊断与刷写提供了完整的技术路径。

CAT789的专栏 526

SAP ABAP 缓冲同步揭秘——从 DDLOG 表到 RSDBBUF3 的完整实践指南

DDLOG 看似一张不起眼的系统表,却承担着 SAP 多实例环境下的数据一致性重任。通过掌握其字段意义、解析方法及周边监控工具,你可以在性能与一致性之间找到最佳平衡;通过精细化的参数管理与主动刷新策略,更能在关键业务场景中确保“数据永远是最新的”。愿本文能成为你日常排障与架构决策的参考手册。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 315

Android 弧形列表转盘的实现(二),列表自动选中;RecyclerView滑动后自动选中居中的条目,RecyclerView实现WheelView效果;

这篇主要是列表滑动后停止后,自动选中居中的条目,类似于WheelView的效果;通俗的讲就是用RecyclerView实现WheelView的效果; 接上篇:Android 弧形转盘的实现,弧形列表;弧形列表已经实现了,下面就是自动选中的功能了; 先来分析一波: 红色的这条线是RecyclerView的竖向的中心线,当列表滑动停止后遍历可见区域的所有View,计算出距离中心线最近的一个View(是该View的中心点距离中心线最近),然后移动该View至中心线位置; 1、RecyclerView.

Choi晨的博客 3339

Matlab可调用MODTRAN5封装器之Mod5

MODTRAN 是一个计算地球大气中电磁辐射传输的软件代码。MODTRAN是通过使用具有严格格式的输入文本文件来控制的。这个文件被称为“tape5”,扩展名为.tp5或.ltn。手工创建或编辑这个文件是不方便的。Mod5提供了一组函数来简化MODTRAN用例的处理。这些方法包括将tape5文件格式读取到Mod5类“实例”或“对象”中,更改文件中描述的案例实例,将tape5格式写回文件,在案例上运行MODTRAN并将MODTRAN输出文件中的各种结果读取回Matlab。还有许多绘图方法可用。

qq_19512613的博客 3255

Android实现圆弧滑动效果之FanLayout篇

前言 在上篇文章(Android实现圆弧滑动效果之ArcSlidingHelper篇)中,我们把圆弧滑动手势处理好了,那么这篇文章我们就来自定义一个ViewGroup,名字叫就风扇布局吧,接地气。 在开始之前,我们先来看2张效果图 (表情包来自百度贴吧): 哈哈,其实还有以下特性的,就先不发那么多图了: 简单分析 圆弧手势滑动我们现在可以跳过了(因为在上一篇文章中做好了)...

陈小缘的博客 9595

全面解读AI Infra:架构、生态与未来趋势

文章摘要 大模型时代下,AI基础设施(AI Infra)成为关键技术基建,涵盖从数据准备到模型服务的全栈技术体系。文章系统解构了AI Infra的四层架构(硬件资源层、资源管理调度层、开发框架层、平台工具层),并分析了全球AI Infra生态图谱,包括云计算巨头、芯片厂商等全栈服务商,以及中国特色的多元竞合格局。通过对比Data Infra与AI Infra的核心差异,指出AI Infra更关注智能应用的规模化与自动化。文章还探讨了从传统数据设施向AI基础设施的转型路径,强调自主可控、软硬协同等发展趋势,为

技术引领业务创新 612

1 电科院FTU检测标准学习笔记-外观检查

作者简介:本人从事电力系统多年,岗位包含研发,测试,工程等,具有丰富的经验在配电自动化验收测试以及电科院测试中,本人全程参与,积累了不少现场的经验。

sixtome 1852

RecyclerView去除上下滑动的阴影和侧边的滚动条

RecyclerView在拉到最顶部和最底部的时候会出现一个阴影的效果,包括右侧也会有一个滚动条,如果想要去除可以设置如下属性。 &lt;android.support.v7.widget.RecyclerView android:id="@+id/setting_recycler_layout" android:layout_width="match_parent" ...

bobby_fu的博客 4387

RK3568笔记六十一:MIPI摄像头应用程序编写

V4L2设备驱动框架向应用层提供了一套统一、标准的接口规范,应用程序按照该接口规范来进行应用编程,从而使用摄像头。对于摄像头设备来说,其编程模式如下所示:1.首先是打开摄像头设备;2.查询设备的属性或功能;3.设置设备的参数,譬如像素格式、帧大小、帧率;4.申请帧缓冲、内存映射;5.帧缓冲入队;6.开启视频采集;7.帧缓冲出队、对采集的数据进行处理;8.处理完后,再次将帧缓冲入队,往复;9.结束采集。

1004

去掉RecyclerView等可滑动控件滑动到边缘时的阴影(光晕)效果

RecyclerView等可滑动控件默认的是会有滚动条以及滑动到边缘时的阴影(光晕)效果的,那么怎样去掉这两个默认属性呢,在这里简单的介绍一下 滚动条效果 1、通过xml文件设置 android:scrollbars=”“有三个属性 a.none:去掉滚动条 b.horizontal:设置水平的滚动条 c.vertical:设置垂直的滚动条 2、通过java代码设置 a.Recy

码出人生 5101

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

android 水平 无限滚动条,RecyclerView无限滚动的实现

packagename.azurefx.demoimportandroid.view.LayoutInflaterimportandroid.view.Viewimportandroid.view.ViewGroupimportandroidx.recyclerview.widget.LinearLayoutManagerimportandroidx.recyclerview.widg...

weixin_39599372的博客 397

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

记录一下,去掉ScrollView滑动到边缘时出现的弧形阴影效果

关闭方法一,在xml中设置属性 Android:overScrollMode=”never” 关闭方法二,使用代码 setOverScrollMode(OVER_SCROLL_NEVER)

Dovar_66的博客 1362

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

ListView/RecyclView 设置滑动到边缘时无效果模式

ListView/RecyclView的过度滚动会在顶部添加拖拽的效果,如下图 1、ListView/RecyclView 设置滑动到边缘时无效果模式 效果图 这是recycleView自带的特性,不需要可以通过设置上面参数进行关闭 recyclerView.setOverScrollMode(View.OVER_SCROLL_NEVER); android:overScrollMode=""同样有三个属性 a.never:去掉光晕效果 b.always:设置总是出现光晕效果 c.ifC

qq_34096265的博客 887

滑动光晕

情景 ScrollView、GrdidView、RecyclerView、ViewPager、WebView等控件滑至边缘现光晕效果。 取消 xml android:overScrollMode="never" 代码 recyclerView.setOverScrollMode(View.OVER_SCROLL_NEVER); 总结 setOverScrol...

snpmyn 622

Android 弧形列表转盘的实现(一),弧形列表;

Android 弧形列表转盘的实现 简单的说一下效果图,横向来区分的话可以把UI图分为三部分(左边是轮盘 , 中间是弧形列表 也是一级菜单 , 右边是列表是二级菜单): 要求: 实现一个围绕轮盘的弧形列表; 弧形列表滑动后自动选中居中的条目,然后更新右边的二级菜单; 弧形列表点击后自动滑动到居中位置并选中,然后更新右边的二级菜单; 弧形列表所有条目都可以选择; 左边的轮盘跟随弧形列表旋转; 好的、需求很明确,一级菜单弧形列表可滑可点自动选中,轮盘跟随旋转; 第一步:先实现弧形列表;.

Choi晨的博客 4896

Android自定义弧型View

好久没动手玩View自定义,有点生疏了。效果如下 思路很简单,onDraw绘制弧线、绘制Text canvas.drawArc(oval, startAngle, sweepAngle, false, paint); canvas.drawText(integralValue, rectF.centerX(), baseline, textPaint); draw 动画效果实现:invalidate canvas.drawArc(oval, startAngle, i, false, paint

AnalyzeSystem的博客 1027

自定义 LayoutManager 实现弧形以及滑动放大效果 RecyclerView

作者 | Dajavu地址 | http://www.jianshu.com/p/7bb7556bbe10声明 | 本文是 Dajavu 原创,已获授权发布,未经原作者允许请勿转载前言我们都知道 RecyclerView 可以通过将 LayoutManager 设置为StaggeredGridLayoutManager 来实现瀑布流的效果。默认的还有LinearLayoutManager 用于实现

code小生 2146

【Android入门到项目实战--3.5】—— 滚动控件RecyclerView的使用

Android入门到项目实战—— 滚动控件RecyclerView的基本用法,横向滚动和瀑布流布局,以及RecyclerView的点击事件。

个人博客 3074

RecyclerView实现滚动效果-Android

RecyclerView

weixin_58124208的博客 2062

Android 自定义view画带指针带动画的上半圆弧刻度盘

之前工作中有用到环形进度条等的,为了赶进度都是在网上找到相似的效果的然后再进行修改。一直都想自己画一个,今天就和大家一起来学习刻度盘的绘制。 先看一下截图: 效果演示请看刻度盘演示 代码下载:CalibrationView.zip 在文章后面也会贴出全部代码 实现思路主要有: 1.确定中心点坐标 2.画出背景圆弧以及刻度点 3.画出实际进度值及刻度点 4.画指针 5.增......

肖波的博客 4766

仿探探的卡片滑动效果-recyclerView实现

这里是一个通过自定义view和自定义recyclerView、layoutManager,再结合ItemTouchHelper实现的一个仿探探的卡片滑动的效果: 效果图已经奉上,接下来是代码: 首先是每张图片的布局:item <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

分享人生 1万+

RecyclerView滚动条

android:scrollbars=”vertical”是否显示滚动条,它的取值可以是vertical,horizontal或none。 android:fadeScrollbars=”true”(默认参数)是在滑块不滚动时,隐藏 android:fadeScrollbars=”false”是在滑块不滚动时,不隐藏 android:scrollbarThumbVertical=”@drawable/ic_launcher”自定义滑块的背景图 android:scrollbarStyle=”...

SuperHreo的博客 4467
下一篇: TvtsAssistantTest
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值