7、Dp Notes底部导航栏

[size=medium] 想要的图标呢?怎么弄上去。从网上找了几个图标,并做成了字体(为什么做成字体,做成字体,相当于每个图标对应一个字符,如"0"对应着主页的图标,在View里drawText(0),就把对应的图标画上去了(当然要为paint设置字体),方便改变大小,颜色等。怎么做成字体,图标字体(ICONFONT),百度一下),这里只是想介绍一种投机取巧的方法来实现图标显示和之后的颜色渐变。[/size]
[img]http://dl2.iteye.com/upload/attachment/0124/2462/b589926e-c21a-35e2-a57f-02edc6bffe70.jpg[/img]
[size=medium] 字体做好了,QEndBarIcon.ttf,0-主页,1-列表,2-消息,3-用户,4-中间的新建,先是这么想的。工程/assets目录右键→新建folder取名fonts,将做好的QEndBarIcon.ttf复制到该目录下。为paint设置字体,构造函数里,new Paint()后:[/size]

paint.setAntiAlias(true);
paint.setTypeface(Typeface.createFromAsset(context.getAssets(), "fonts/QEndBarIcon.ttf"));

[size=medium]防锯齿开,设置字体为QEndBarIcon.ttf。onDraw()里:
[/size]
canvas.drawText("01423", getWidth()/2-50*3, getHeight()/2, paint);

运行:
[img]http://dl2.iteye.com/upload/attachment/0124/2464/68e2d4eb-6ce4-3a71-9b0e-06ae6b9e92ab.jpg[/img]
[color=gray][size=medium]注:写字01423变成了字体中设置好的图标,可以理解。[/size][/color]

[size=medium] 为每个图标设定位置、颜色,定义几个变量:[/size]

private int widthAll,heightAll;//总宽度,总高度
private int touchX,touchY;//点击时记录X,Y

private float positionItem[]={0,0,0,0,0};//图标位置
private int widthItem;//图标宽度
private int alphaItem[]={255,0,0,0};//图标透明度

private int colorNormal,colorSelect,colorBackground;//几个颜色值

private Paint paintIcon,paintOther;//画笔

[size=medium] 构造函数初始化变量:[/size]

colorNormal=getResources().getColor(R.color.gray_dark);//获取颜色值
colorSelect=getResources().getColor(R.color.app_theme);
colorBackground=getResources().getColor(R.color.white_dark);

paintIcon=new Paint();//新建画笔
paintIcon.setAntiAlias(true);//防锯齿
paintIcon.setTextAlign(Align.CENTER);//字体居中
//设置字体
paintIcon.setTypeface(Typeface.createFromAsset(context.getAssets(), "fonts/Icon.ttf"));

paintOther=new Paint();
paintOther.setAntiAlias(true);

[size=medium] 宽度、高度等不能在构造函数(构造函数执行时宽高为0),重载(Source→O/I Mothods)选择onMeasure()(View被部署到屏幕):[/size]

widthAll=getWidth();//获取宽度
heightAll=getHeight();//获取高度
if(widthAll>0&&heightAll>0){
widthItem=(widthAll-getPaddingLeft()-getPaddingRight())/5;//计算Item宽度
positionItem[0]=widthItem/2+getPaddingLeft();//计算Item位置(X)
positionItem[1]=widthItem/2*3+getPaddingLeft();
positionItem[2]=widthAll-widthItem/2*3-getPaddingRight();
positionItem[3]=widthAll-widthItem/2-getPaddingRight();

positionItem[4]=heightAll/3*2;//计算Item位置(Y)
paintIcon.setTextSize(heightAll/2);//设置图标大小

if(widthItem>heightAll*2){
widthItem=heightAll*2;//限制图标宽度
}
}

[size=medium] 通过宽高计算出每个图标位置,存到变量,onDraw()中:[/size]

paintIcon.setColor(colorNormal);//设置正常颜色
paintIcon.setAlpha(255);
canvas.drawText("0", positionItem[0], positionItem[4], paintIcon);
canvas.drawText("1", positionItem[1], positionItem[4], paintIcon);
canvas.drawText("2", positionItem[2], positionItem[4], paintIcon);
canvas.drawText("3", positionItem[3], positionItem[4], paintIcon);

paintIcon.setColor(colorSelect);//设置选中颜色
paintIcon.setAlpha(alphaItem[0]);
canvas.drawText("0", positionItem[0], positionItem[4], paintIcon);
paintIcon.setAlpha(alphaItem[1]);
canvas.drawText("1", positionItem[1], positionItem[4], paintIcon);
paintIcon.setAlpha(alphaItem[2]);
canvas.drawText("2", positionItem[2], positionItem[4], paintIcon);
paintIcon.setAlpha(alphaItem[3]);
canvas.drawText("3", positionItem[3], positionItem[4], paintIcon);

paintOther.setColor(colorSelect);//画中间的圆
canvas.drawCircle(widthAll/2, heightAll/2, widthItem/2, paintOther);
paintIcon.setColor(colorBackground);
canvas.drawText("4", widthAll/2, positionItem[4], paintIcon);//画中间图标

[size=medium] 正常颜色画出每个图标,在相同位置画上选中后的图标,通过控制透明度实现单个图标选中效果。运行,是不是想要的效果呢?[/size]
[img]http://dl2.iteye.com/upload/attachment/0124/2466/2b4a215c-3999-3d3c-8202-595726b32ebb.jpg[/img]

[size=medium] 为图标添加点击事件,重载onTouchEvent():[/size]

switch(event.getAction()){
case MotionEvent.ACTION_DOWN:
touchX=(int)event.getX();//记录点击位置
touchY=(int)event.getY();
break;
case MotionEvent.ACTION_UP:
int tempX,tempY;
tempX=(int)event.getX();
tempY=(int)event.getY();//未滑动,滑动小
if(Math.abs((tempX-touchX))<20&&Math.abs((tempY-touchY))<10){
if(Math.abs(touchX-positionItem[0])<widthItem/2){
alphaItem[0]=255;
alphaItem[1]=0;//点击第一个图标
alphaItem[2]=0;
alphaItem[3]=0;
}
else if(Math.abs(touchX-positionItem[1])<widthItem/2){
alphaItem[0]=0;
alphaItem[1]=255;
alphaItem[2]=0;
alphaItem[3]=0;
}
else if(Math.abs(touchX-widthAll/2)<widthItem/2){
//点击中间图标
}
else if(Math.abs(touchX-positionItem[2])<widthItem/2){
alphaItem[0]=0;
alphaItem[1]=0;
alphaItem[2]=255;
alphaItem[3]=0;
}
else if(Math.abs(touchX-positionItem[3])<widthItem/2){
alphaItem[0]=0;
alphaItem[1]=0;
alphaItem[2]=0;
alphaItem[3]=255;
}
}
postInvalidate();//刷新
break;
}
return true;//由子类自己处理,并不向下传递

[size=medium]根据点击的位置,判断哪个图标该被选中,更改透明度,刷新,运行。[/size]
[img]http://dl2.iteye.com/upload/attachment/0124/2468/77d226a3-e803-391a-b1d8-760bb747d0f2.gif[/img]
[color=gray][size=medium]注:这是一个.gif动图,ctrl点击图片查看。[/size][/color]

[size=medium] 自定义View是否可以很好的理解,做出自己希望的,要多思考,理解它的用途。[/size]

[align=right][size=medium]活学巧用——2016/10/25[/size][/align]
AI产品经理30分钟掌握Axure核心交互与AI辅助原型设计 原型设计是产品经理将产品构想可视化的核心能力,其本质是通过交互模型快速验证产品逻辑与用户体验。传统工具如Axure通过元件库、交互事件和动态面板等机制,支持从静态线框图到高保真可交互原型的搭建,其技术价值在于能以低成本、高效率的方式在开发前完成产品演示与用户测试。在AI技术普及的当下,产品经理的工作流正迎来变革,AI生成工具能够辅助完成布局构思、文案生成与素材创建,与Axure的精确交互设计能力形成互补。这种‘AI构思+专业工具实现’的融合模式,尤其适用于AI产品、SaaS平台等需要快速迭代验证的场景,能帮 阅读详情

相关推荐

Android集成Google Maps实现真实道路导航路线绘制

在移动开发中,‘两点间路线绘制’常被误解为简单几何绘图,实则涉及地理坐标系统、道路拓扑建模与动态路径渲染等核心概念。其原理基于调用专业路线规划服务(如Google Directions API)获取带转向指令与真实道路走向的经纬度序列,再经坐标解码、屏幕适配、图层叠加等步骤完成高保真渲染。该技术具备精准定位、交互响应、缩放自适应等工程价值,广泛应用于物流调度、本地生活、出行服务等场景。本文聚焦 Android 平台下 Google Maps SDK 与 Directions API 的协同实践,深入解析 P

weixin_30514745的博客 331

Android底部导航栏,三种风格和实现

一、效果图展示    如果动图没有动的话,也可以看下面这个静态图    以下挨个分析每个的实现,这里只做简单的效果展示,大家可以基于目前代码做二次开发。二、BottomNavigationView    这是 Google 给我们提供的一个专门用于底部导航的 View,你只需要在新建 Activity 的时候选择 “Bottom Navigation Activity”,IDE 就会自动使用 Bo...

阿飞的博客 14万+

GX_Configurator_DP 7.13

安装程序压缩包,英文,Profibus模块设置软件,用于QJ71PB92D、QJ71PB93D、QJ71PB92V,FX3U-64DP-M

GX 添加面板

1. development\app\menu\win_full_screen.c printf("key 0x%x \n",event->key.scancode);//查看按键的键值信息 2. gxapp_common\include\key\remote_enum.h #define KEY_JIMO 18 3. gxapp_common\include\key\panel_key.

kuikuitage的博客 775

基于 Qt 6 / C++17 的多算法加解密工具(学习研究用途) 涵盖编码、古典密码、对称/非对称加密、哈希摘要共 24 种算法,全部纯 C++ 自实现,不依赖 OpenSSL/GmSSL

基于 Qt 6 / C++17 的多算法加解密工具(学习研究用途)。涵盖编码、古典密码、对称/非对称加密、哈希摘要共 24 种算法,全部纯 C++ 自实现,不依赖 OpenSSL/GmSSL。含图形界面、批量文件加解密、密钥管理、性能测试与操作日志。提供标准测试向量自测。

考虑一次调频以及二次调频和各机组调频特性的双目标风光水火储动态调度研究(Matlab代码实现)

考虑一次调频以及二次调频和各机组调频特性的双目标风光水火储动态调度研究(Matlab代码实现)内容概要:本文研究了一种考虑一次调频、二次调频以及各机组调频特性的双目标优化模型,用于风光水火储多能互补系统的动态调度问题。该模型以系统运行成本最小化和新能源消纳最大化为双重优化目标,综合考虑了各类电源的出力特性、储能系统的充放电行为及电网频率响应要求。通过Matlab编程实现了完整的求解流程,采用多目标优化算法对复杂约束条件下的调度方案进行求解,并对不同场景下的调度结果进行仿真分析,验证了所提模型在提升系统经济性与稳定性方面的有效性。研究还探讨了储能系统在平抑新能源波动、参与频率调节中的关键作用,为高比例可再生能源接入下的电力系统调度提供了理论支持和技术路径。; 适合人群:具备一定电力系统基础知识和Matlab编程能力,从事新能源调度、电力系统优化等相关领域的研究生、科研人员及工程技术人员。; 使用场景及目标:①解决含多种能源形式的复杂电力系统在实际运行中的动态调度问题;②研究储能系统在调频和促进新能源消纳中的协同机制;③掌握多目标优化在电力系统调度中的建模与实现方法; 阅读建议:建议读者结合Matlab代码深入理解模型构建与求解过程,重点关注目标函数设计、约束条件处理及多目标折衷分析方法,同时可通过修改参数进行不同场景的仿真实验,以加深对系统动态行为的理解。

8、Dp Notes底部导航栏

[size=medium] 实现了点击切换效果(只是图标状态变化),如何结合页面,点击时切换页面,页面滑动时图标有渐变。需要一个新的控件ViewPager,看名字就知道是管理页面切换的,在底部的QEndBar之上加入一个ViewPager:[/size] [code="xml"] [/code] [size=medium] ViewPager控件在android-...

zdphpn的博客 181

图腾柱无桥PFC变换器+平均电流控制+PI电压双闭环前馈控制设计(Simulink仿真实现)

内容概要:本文系统研究了图腾柱无桥PFC变换器的高性能控制策略,采用平均电流控制与PI电压双闭环前馈控制相结合的方法,并基于Simulink平台构建了完整的仿真模型进行验证。文章深入剖析了控制系统的结构设计,重点阐述了电压外环与电流内环的协同工作机理,其中前馈控制的引入显著增强了系统对输入扰动的抑制能力和动态响应速度。通过仿真结果表明,该复合控制策略能够有效实现单位功率因数运行,大幅降低输入电流的总谐波畸变率(THD),同时确保直流母线电压具有优异的稳态精度和快速跟踪能力。本研究为高效率、高功率密度的PFC变换器设计提供了坚实的理论支撑和可靠的实践范例。; 适合人群:从事电力电子、电气自动化、新能源变换器研发的高校研究生、科研人员及企业工程师。; 使用场景及目标:①掌握图腾柱无桥PFC变换器的工作原理与建模方法;②深入理解平均电流控制、PI双闭环及前馈控制在电力电子系统中的综合应用;③学习使用Simulink进行电力电子变换器的系统级仿真与性能分析。; 阅读建议:建议读者结合文中提供的仿真模型,分模块(主电路、控制逻辑、调制环节)进行参数设置与仿真调试,重点关注电压环与电流环的动态响应、稳态精度以及THD指标的变化,以深化对控制策略的理解。

9、Dp Notes底部导航栏

[size=medium] 将ViewPager和QEndBar结合起来,点击图标时切换ViewPager页面,ViewPager滑动时改变图标状态。打开QEndBar.java,定义ViewPager对象viewPager,新建一个函数setViewPager():[/size] [code="java"]public void setViewPager(ViewPager vi...

zdphpn的博客 196

基于可靠性评估序贯蒙特卡洛模拟法的配电网可靠性评估研究(Matlab代码实现)

内容概要:本文系统研究了基于序贯蒙特卡洛模拟法的配电网可靠性评估方法,重点聚焦于其在含分布式电源的复杂配电网中的应用。文章深入阐述了该方法的理论基础与实现流程,通过建立配电网元件的故障与修复过程的时间序列模型,模拟系统在长期运行中的状态演变,进而精确统计系统及负荷点的关键可靠性指标,如系统平均停电频率(SAIFI)、系统平均停电持续时间(SAIDI)、用户平均停电时间(CAIDI)等。研究依托Matlab平台完成了完整的仿真程序开发,并通过典型算例验证了所提方法的有效性与工程实用性。该方法能够充分考虑系统的时序特性与元件间的相关性,尤其适用于高比例分布式电源接入后带来的随机性与波动性较强的新型配电网可靠性分析。; 适合人群:具备电力系统分析基础知识和一定Matlab编程能力的高校研究生、科研机构研究人员,以及从事配电网规划、运行维护与风险管理的工程技术人员。; 使用场景及目标:①掌握序贯蒙特卡洛模拟法在电力系统可靠性评估中的核心原理与具体实施步骤;②学习如何利用Matlab进行配电网时序仿真建模与可靠性指标的自动化计算;③为含分布式电源的现代配电网的规划设计、运行风险评估及韧性提升提供科学的量化分析工具与技术支撑。; 阅读建议:建议读者结合文中提供的Matlab代码实现,逐行调试并运行仿真程序,深入理解状态抽样、时间推进、故障遍历、指标累加等关键算法环节,并鼓励尝试将其应用于不同的网络拓扑结构或引入更多类型的分布式电源模型,以深化对方法适应性与扩展性的理解。

基于多策略改进蜣螂算法(MSDBO)的多无人机协同三维避障路径规划研究(Matlab代码实现)

内容概要:本文研究基于多策略改进的蜣螂优化算法(MSDBO)在多无人机协同三维避障路径规划中的应用,旨在解决复杂环境下多无人机安全、高效飞行的路径规划问题。通过引入多种优化策略对传统蜣螂算法进行改进,显著增强了算法的全局搜索能力、收敛速度与避障性能,并结合三维空间建模与多无人机协同机制,构建以路径成本(如距离、高度、威胁、转角等)为目标函数的优化模型。文中系统阐述了算法设计原理、路径规划建模方法及仿真实验过程,通过多场景对比实验验证了MSDBO算法在路径安全性、规划效率和多机协同性方面的优越性与鲁棒性。; 适合人群:具备一定算法基础和MATLAB编程能力,从事无人机控制、路径规划、智能优化算法研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①解决城市、山区等复杂环境下的多无人机协同飞行路径规划问题;②提升无人机集群在动态障碍物环境中的自主避障与协同能力;③为智能交通、应急救援、军事侦察等领域的多智能体路径规划提供技术支持。; 阅读建议:建议结合提供的Matlab代码进行仿真实践,深入理解算法实现细节与参数调优方法,同时可尝试在不同场景下测试算法性能,进一步掌握其适用边界与优化潜力。

基于HarmonyOS API 24宠物健康追踪应用采用传统的 `for` 循环而非 `Array.prototype.find`,在 HarmonyOS ArkTS 环境中能获得更好的运行性能

在 HarmonyOS NEXT 正式商用的背景下,ArkTS 作为鸿蒙生态的官方应用开发语言,正在从传统的命令式 UI 开发范式向声明式 UI 范式全面迁移。ArkUI 框架以组件化、声明式、状态驱动为核心特征,要求开发者以"描述 UI 应该是什么样"而非"一步步操作 UI 怎么变"的思维方式构建界面。本文以一个名为"智能账单"的三标签页记账应用为切入点,逐层拆解其数据模型设计、@Builder 组件复用策略、@State 状态管理机制、条件渲染导航模式,以及静态写死渲染与动态循环渲染之间的性能权衡,为

2301_79651252的博客 124

阅读档案 低年级版.docx

阅读档案 低年级版.docx

宠物照护应用基于HarmonyOS API 24实战解析数值型字段便于计算(如体重趋势分析、卡路里统计),而日期时间由于 ArkTS 标准库中日期处理能力的限制

本文将对一个基于 HarmonyOS ArkTS 开发的读书笔记管理应用进行逐段深入分析。该应用采用经典的底部 Tab 导航架构,包含书架、正在阅读、读书笔记、发现好书和个人中心五大功能模块,整体代码结构清晰、设计模式规范、UI 交互丰富,是学习和理解 ArkTS 声明式开发范式的优秀范例。 深度解析:这两个接口是应用元数据配置体系的基础。 定义了图书分类的元信息结构,包含四个视觉维度: 用于中文展示名称, 作为该分类的主题色贯穿整个 UI, 使用 Emoji 作为分类的视觉标识, 则定义了分类在列表中的背

2302_79499487的博客 190

在LinuxMint 22.1(Ubuntu24.04)上安装使用同花顺远航版

Linux用户成功在LinuxMint22.1系统上通过Wine9.0运行同花顺远航版,解决了长期困扰的股票行情软件问题。此前Linux原生版同花顺功能简陋且停止更新,Wine版通达信存在显示问题。作者作为自由软件支持者,通过调整Wine配置文件解决了高分屏显示异常问题,实现了远航版的正常使用。期待同花顺能重启Linux原生版开发,支持更多处理器架构,完善国产软件生态。该方案为Linux股票软件用户提供了实用参考。

5144

非sudo用户如何安全使用Docker:Rootless模式实战指南

Docker Rootless模式是一种基于Linux用户命名空间(userns)的容器运行时安全机制,它通过UID/GID映射、fuse-overlayfs文件系统和slirp4netns网络栈,在不提升权限的前提下实现容器隔离。其核心原理是将容器内root身份映射为宿主机非特权用户,从而规避docker组等价root的安全风险。相比传统root模式,Rootless在权限控制、逃逸防护和多租户隔离方面具备天然优势,适用于CI/CD流水线、Kubernetes边缘节点及受限生产环境。本文聚焦无sudo权限

weixin_30274627的博客 351

基于HarmonyOS API 24实战解析Blank() 组件自动填充标题栏中剩余的空白空间,通过 Row 的 alignItems(VerticalAlign.Center) 实现垂直居中对齐

健身管理类应用与之前分析的外卖、招聘等应用有本质差异——它的核心数据不是"交易"或"任务",而是"时间序列的身体状态数据":每次训练有时长、卡路里、组数、重量;每次饮食有热量、蛋白质、碳水、脂肪;每周有运动时长趋势图。这些数据的共同特征是"随时间积累,用户需要横向对比和趋势分析"。这导致健身App的数据层设计必须从第一天就考虑"历史数据查询"和"多维度聚合"的需求,而非仅关注当前单条记录的增删改查。健身应用的用户行为模式也有独特之处:用户使用健身App的目标是"坚持",而不是"一次性完成任务"。这意味着激励

2401_86031952的博客 205

FPGA新手必看:Create HDL Wrapper和Generating Output Products到底该先用哪个?

本文深入解析了FPGA设计中Create HDL Wrapper与Generating Output Products的正确使用顺序,帮助新手避免常见错误。详细介绍了两者的功能差异、执行顺序的底层逻辑以及工程管理的最佳实践,特别适合使用Vivado进行FPGA开发的初学者。

xk7n92h3p5m的博客 1065

健身运动管理应用对象内部的属性在 ArkTS 运行时可能被修改,使用 Object.freeze() 或只读类型 Readonly<Record<...>> 来强化

健身管理类应用与之前分析的外卖、招聘等应用有本质差异——它的核心数据不是"交易"或"任务",而是"时间序列的身体状态数据":每次训练有时长、卡路里、组数、重量;每次饮食有热量、蛋白质、碳水、脂肪;每周有运动时长趋势图。这些数据的共同特征是"随时间积累,用户需要横向对比和趋势分析"。这导致健身App的数据层设计必须从第一天就考虑"历史数据查询"和"多维度聚合"的需求,而非仅关注当前单条记录的增删改查。健身应用的用户行为模式也有独特之处:用户使用健身App的目标是"坚持",而不是"一次性完成任务"。这意味着激励

2302_79499487的博客 231

cst-python联合仿真的问题解决

cst与python联合仿真出现无法调用CST的问题解决

ayihu_的博客 2375

CF鼠标宏防封指南:手把手教你调校罗技G HUB压枪脚本的延迟与随机数

本文详细解析了如何通过罗技G HUB的Lua脚本功能调校鼠标宏,实现拟真操作体验。重点介绍了随机数应用、动态后坐力补偿和智能操作序列等高级技术,帮助玩家在不违反游戏规则的前提下提升操作精度。

weixin_26841957的博客 336

智慧图书阅读基于HarmonyOS ArkTS 24实现完成为了支持本地持久化(书架列表的progress直接读取避免每次计算),这种“缓存trade-off“在性能敏感场景下是合理的工程选择

在 HarmonyOS NEXT 正式商用的背景下,ArkTS 作为鸿蒙生态的官方应用开发语言,正在从传统的命令式 UI 开发范式向声明式 UI 范式全面迁移。ArkUI 框架以组件化、声明式、状态驱动为核心特征,要求开发者以"描述 UI 应该是什么样"而非"一步步操作 UI 怎么变"的思维方式构建界面。

2301_79516720的博客 301

android 运动目标检测_MindSpore应用案例:AI对篮球运动员目标的检测

MindSpore作为一个端边云协同的开源的全场景AI框架,今年3月份开源以来,受到了业界的广泛关注和应用,欢迎大家参与开源贡献、模型众智合作、行业创新与应用、学术合作等,贡献您在云侧、端侧 (HiMindSpore 应用程序)、边侧以及安全领域的应用案例。MindSpore与您在AI领域共同成长,让AI使能千行百业,释放出强大的生产力。本文讲述的是MindSpore对篮球运动员目标的检测应用,通...

weixin_33603813的博客 835
上一篇: 6、Dp Notes底部导航栏(自定义控件(View))
下一篇: 8、Dp Notes底部导航栏
zdphpn
博客等级 码龄15年 2粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值