欢迎页导航页SplashActivity-条形进度条指示器-页面布局系列

本文主要是介绍欢迎页导航页SplashActivity-条形进度条指示器-页面布局系列,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Splash Activity 欢迎页,带条形进度条指示器


  • 完整代码ZIP:下载

  • 更多其他页面-自定义View-实用功能合集:点击查看

带圆点指示器可以浏览这篇文章点击跳转
仿ClassIn的欢迎页可以浏览这篇文章点击跳转


实现步骤:
1.使用ViewPager实现左右翻页layout
2.自定义绘制组件RectanglePointerView,通过监听ViewPager.OnPageChangeListener刷新绘制条形指示器
在这里插入图片描述


1.ViewPager.OnPageChangeListener的onPageScrolled可以告诉我们当前的页面滑动状态。position->当前页面位置下坐标,positionOffset->相对于两个页面之间滑动的偏移量 0 ~ 0.99,positionOffsetPixels->滑动相对于屏幕像素偏移量

//监听页面状态class  ViewPagerChangeListener implements ViewPager.OnPageChangeListener {@Overridepublic void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {Log.d("TAG", "onPageScrolled: "+position+" "+positionOffset+" "+positionOffsetPixels);mRectanglePointerView.refreshPointer(position,positionOffset); //刷新条形指示器}@Overridepublic void onPageSelected(int position) {  //翻到最后一页才显示按钮if(position==mArrayList.size()-1){mButton.setVisibility(View.VISIBLE);}else {mButton.setVisibility(View.GONE);}}@Overridepublic void onPageScrollStateChanged(int state) {}}

2.自绘制RectanglePointerView必须传入以下参数

//页面数量,条形width,条形height,选中时drawable,未选中时drawable
public void setPointerStyle(int pageNumber, int dotHeight, int dotWidth, Drawable dotDrawableSelected, Drawable dotDrawableUnSelected)

条形指示器view的总长度 = 设置的条形width x 页面数量(条形数量)
条形指示器view的总高度 = 设置的条形height


/*** 作者:YFZ* Android技术生活-QQ交流群:723592501* 简介:自定义绘制条形指示器,用于翻页* setDotInfor设置圆点信息,页数,长宽,*/
public class RectanglePointerView extends LinearLayout {private Context mContext;private Paint mPaintDotSelected;private Paint mPaintDotUnSelected;private Rect mRect;private int mPageNumber=0;private int mDotWidth=0;private int mDotHeight =0;private int mSelectedPosition=0;private float mSelectedProcess=0;private Drawable mDotDrawableSelected;private Drawable mDotDrawableUnSelected;public RectanglePointerView(Context context) {super(context);initial(context);}public RectanglePointerView(Context context, @Nullable AttributeSet attrs) {super(context, attrs);initial(context);}public RectanglePointerView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);initial(context);}//初始化private void initial(Context context){this.mContext=context;this.mRect=new Rect();initial_paint_dot_selected();initial_paint_dot_unSelected();this.setBackgroundColor(Color.TRANSPARENT);}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);}//初始化-画笔-圆点-被选中的private void initial_paint_dot_selected(){this.mPaintDotSelected=new Paint(Paint.ANTI_ALIAS_FLAG);this.mPaintDotSelected.setStyle(Paint.Style.FILL);this.mPaintDotSelected.setColor(Color.BLACK);}//初始化-画笔-圆点-未被选中的private void initial_paint_dot_unSelected(){this.mPaintDotUnSelected=new Paint(Paint.ANTI_ALIAS_FLAG);this.mPaintDotUnSelected.setStyle(Paint.Style.STROKE);this.mPaintDotUnSelected.setColor(Color.GRAY);this.mPaintDotUnSelected.setStrokeWidth(3f);}//刷新绘制public void refreshUI(){this.invalidate();}//传入页面数量public void setPageNumber(int pageNumber){}//设置圆点信息-数量-高-宽public void setPointerStyle(int pageNumber, int dotHeight, int dotWidth, Drawable dotDrawableSelected, Drawable dotDrawableUnSelected){mPageNumber = pageNumber; //数量mDotHeight  = dotHeight; //高mDotWidth   = dotWidth; //宽mDotDrawableSelected=dotDrawableSelected;mDotDrawableUnSelected=dotDrawableUnSelected;this.getLayoutParams().height= (int)(mDotHeight);this.getLayoutParams().width = (int)(mDotWidth * pageNumber);}//设置当前选中的页面public void refreshPointer(int position, float process){mSelectedPosition=position+1;mSelectedProcess=process+position+1;refreshUI();}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);if(mPageNumber>0 && mDotWidth>0 && mDotHeight>0) { //必须传入数量,Dot长宽,才开始绘制//先绘制条形总长度,未选中drawable)mRect.left=0;mRect.top=0;mRect.right=getWidth();mRect.bottom=getHeight();mDotDrawableUnSelected.setBounds(mRect);mDotDrawableUnSelected.draw(canvas);//再绘制当前进度长度,选中drawable。进度比例% * 组件总长//进度百分比为:onPageScolled / 总页数 *100//组件总长:getwidth();mRect.left=0;mRect.top=0;mRect.right=(int)((mSelectedProcess/mPageNumber)*(getWidth()));mRect.bottom=getHeight();
//               if(mSelectedPosition==i) {mDotDrawableSelected.setBounds(mRect);mDotDrawableSelected.draw(canvas);
//               }else {
//                   mDotDrawableUnSelected.setBounds(mRect);
//                   mDotDrawableUnSelected.draw(canvas);
//               }}}}

Android技术生活交流

微信 ----- qq群


这篇关于欢迎页导航页SplashActivity-条形进度条指示器-页面布局系列的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Python中实现进度条的多种方法总结

《Python中实现进度条的多种方法总结》在Python编程中,进度条是一个非常有用的功能,它能让用户直观地了解任务的进度,提升用户体验,本文将介绍几种在Python中实现进度条的常用方法,并通过代码... 目录一、简单的打印方式二、使用tqdm库三、使用alive-progress库四、使用progres

使用JavaScript将PDF页面中的标注扁平化的操作指南

《使用JavaScript将PDF页面中的标注扁平化的操作指南》扁平化(flatten)操作可以将标注作为矢量图形包含在PDF页面的内容中,使其不可编辑,DynamsoftDocumentViewer... 目录使用Dynamsoft Document Viewer打开一个PDF文件并启用标注添加功能扁平化

SpringBoot如何访问jsp页面

《SpringBoot如何访问jsp页面》本文介绍了如何在SpringBoot项目中进行Web开发,包括创建项目、配置文件、添加依赖、控制层修改、测试效果以及在IDEA中进行配置的详细步骤... 目录SpringBoot如何访问JSP页python面简介实现步骤1. 首先创建的项目一定要是web项目2. 在

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

如何在页面调用utility bar并传递参数至lwc组件

1.在app的utility item中添加lwc组件: 2.调用utility bar api的方式有两种: 方法一,通过lwc调用: import {LightningElement,api ,wire } from 'lwc';import { publish, MessageContext } from 'lightning/messageService';import Ca

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

flume系列之:查看flume系统日志、查看统计flume日志类型、查看flume日志

遍历指定目录下多个文件查找指定内容 服务器系统日志会记录flume相关日志 cat /var/log/messages |grep -i oom 查找系统日志中关于flume的指定日志 import osdef search_string_in_files(directory, search_string):count = 0

GPT系列之:GPT-1,GPT-2,GPT-3详细解读

一、GPT1 论文:Improving Language Understanding by Generative Pre-Training 链接:https://cdn.openai.com/research-covers/languageunsupervised/language_understanding_paper.pdf 启发点:生成loss和微调loss同时作用,让下游任务来适应预训