当前位置: 首页 > news >正文

安卓framework美化手势导航侧滑返回UI

文章目录

  • 手势导航的侧滑返回效果图
    • 原生效果如下:
    • 要实现的功能,:
  • 实现代码
    • 1. 初始化代码
    • 2. 修改绘制的代码,进行箭头与退出UI的显示
    • 3. 拖动的时候手指上下移动时,箭头ui跟着移动
  • 以下是一些其他可以美化安卓右滑手势拖动 UI 的方法:
    • 视觉效果方面
    • 形状和布局方面

安卓原生手势导航的侧滑返回效果很单一, 就一个箭头, 大部分手机厂商都会定制这块

手势导航的侧滑返回效果图

原生效果如下:

在这里插入图片描述

要实现的功能,:

  1. 美化箭头
  2. 显示一个动态的凸出画面
  3. 画面跟随手指位置上下滑动
    如下图
    在这里插入图片描述

实现代码

主要修改
frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarEdgePanel.java

1. 初始化代码

//初始化代码
private float mLastY;
private Paint mWavePaint;
private Path mBezierPath;
private Paint mArrowPaint;
mBezierPath = new Path();
mWavePaint = new Paint();
mWavePaint.setAntiAlias(true);
mWavePaint.setStrokeWidth(dp(1.5f));
mWavePaint.setStyle(Paint.Style.FILL);
mWavePaint.setColor(mProtectionColor);mArrowPaint = new Paint();
mArrowPaint.setStrokeWidth(mArrowThickness);
mArrowPaint.setStrokeCap(Paint.Cap.ROUND);
mArrowPaint.setAntiAlias(true);
mArrowPaint.setColor(Color.WHITE);
mArrowPaint.setStyle(Paint.Style.STROKE);
mArrowPaint.setStrokeJoin(Paint.Join.ROUND);

mLastY用于记录上次手势UI显示的坐标, 在手指按下的瞬间, 更新mLastY的值.

@Override
public void onMotionEvent(MotionEvent event) {if (mVelocityTracker == null) {mVelocityTracker = VelocityTracker.obtain();}mVelocityTracker.addMovement(event);switch (event.getActionMasked()) {case MotionEvent.ACTION_DOWN:mDragSlopPassed = false;resetOnDown();mStartX = event.getX();mStartY = event.getY();mLastY = mStartY; // 手势按下时,重新赋值mLastY

2. 修改绘制的代码,进行箭头与退出UI的显示

添加的UI基于贝塞尔曲线实现的

@Override
protected void onDraw(Canvas canvas) {float pointerPosition = mCurrentTranslation - mArrowThickness / 2.0f;/*canvas.save();canvas.translate(mIsLeftPanel ? pointerPosition : getWidth() - pointerPosition,(getHeight() * 0.5f) + mVerticalTranslation);// Let's calculate the position of the end based on the anglefloat x = (polarToCartX(mCurrentAngle) * mArrowLength);float y = (polarToCartY(mCurrentAngle) * mArrowLength);Path arrowPath = calculatePath(x,y);if (mShowProtection) {canvas.drawPath(arrowPath, mProtectionPaint);}canvas.drawPath(arrowPath, mPaint);canvas.restore();*/float height = getHeight();float maxWidth = getWidth();float centerY = height / 2;float progress = currentWidth / maxWidth;if (progress == 0) {return;}float footX = mIsLeftPanel ? 0 : getWidth();mWavePaint.setAlpha((int) (200 * progress));float bezierWidth = mIsLeftPanel ? currentWidth / 2 : (getWidth() - currentWidth / 2);mBezierPath.reset();mBezierPath.moveTo(footX, 0);// 使用常量代替重复计算的分数值final float quarterHeight = height / 4f;final float threeEighthsHeight = height * 3f / 8;final float fiveEighthsHeight = height * 5f / 8;final float threeQuartersHeight = height * 3f / 4;mBezierPath.cubicTo(footX, quarterHeight, bezierWidth, threeEighthsHeight, bezierWidth, centerY);mBezierPath.cubicTo(bezierWidth, fiveEighthsHeight, footX, threeQuartersHeight, footX, height);canvas.drawPath(mBezierPath, mWavePaint);mArrowPaint.setAlpha((int) (255 * progress));// 画箭头float arrowLeft = mIsLeftPanel? currentWidth / 6 : getWidth() - currentWidth / 6;float arrowEnd = arrowLeft + mArrowLength * progress;float[] lines = {arrowEnd, centerY - mArrowLength, arrowLeft, centerY,arrowLeft, centerY, arrowEnd, centerY + mArrowLength};canvas.drawLines(lines, mArrowPaint);
}

3. 拖动的时候手指上下移动时,箭头ui跟着移动

private void handlemoveevent(motionevent event) {float x = event.getx();float y = event.gety();if ((x - mstartx)<0){// 忽略左滑return;}// .....// 拖动的时候手指上下移动时,箭头ui跟着移动float movey = event.gety() - mlasty;if (movey != 0) {mlasty = event.gety();mlayoutparams.y += movey;// 更新位置mwindowmanager.updateviewlayout(this, mlayoutparams);}
}

以下是一些其他可以美化安卓右滑手势拖动 UI 的方法:

视觉效果方面

  1. 添加渐变颜色:
    在绘制拖动 UI 的画笔(Paint)上设置渐变效果。例如,使用线性渐变(LinearGradient)或者径向渐变(RadialGradient)。这样在拖动过程中,颜色可以从一种过渡到另一种,增加视觉丰富度。
  2. 增加光影效果:
    使用不同的阴影绘制技巧。比如,在拖动元素的下方绘制一个半透明的、模糊的阴影,模拟出元素浮于界面之上的效果。可以通过设置 Paint 的阴影属性或者使用专门的图形处理库来实现更复杂的阴影效果。
  3. 粒子效果:
    当进行右滑拖动时,在拖动元素的周围产生一些粒子(如发光的小点、星尘等)。这些粒子可以随机运动、逐渐消失,给用户带来更加生动的交互体验。可以通过自定义粒子类和动画来实现。
    动画效果方面
  4. 弹性动画:
    当拖动接近最大距离或者释放拖动时,让拖动 UI 元素表现出弹性效果。例如,使用弹性插值器(如 OvershootInterpolator)来使元素在动画过程中超出目标位置然后再回弹,增加交互的趣味性。

形状和布局方面

  1. 复杂形状设计:
    设计更加复杂的拖动 UI 形状,不仅仅局限于常见的几何形状或者贝塞尔曲线。例如,设计一个类似花瓣形状、或者具有独特艺术风格的形状,通过路径绘制(Path)来实现。
  2. 嵌套布局:
    在拖动 UI 元素内部使用嵌套的布局和元素。比如,在一个主要的拖动形状内部包含一些小的装饰元素、图标或者文字,这些内部元素可以有自己独立的动画和交互效果。
    作者:帅得不敢出门

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 使用CUBE_MX实现STM32 DMA 功能(存储器到存储器)
  • 打开VSCod安装“PHP Intelephense”或“PHP Server”PHP扩展
  • 通过SQL语句判断奇偶数的几种方法
  • QXml 使用方法
  • 物联网之ESP32与微信小程序实现指示灯、转向灯
  • FloodFill算法(DFS+BFS)【上】
  • NLP基础及其代码-tokenizer
  • 如何保证消息不重复消费
  • 【Power Compiler手册】13.UPF多电压设计实现(3)
  • Vant 按需引入导致 Typescript,eslint 报错问题
  • 【专题】2024跨境出海供应链洞察-更先进供应链报告合集PDF分享(附原数据表)
  • 什么是 Grafana?
  • 【组件】前端js HEIC/HEIF 转换为JPEG、PNG或GIF格式 苹果格式
  • 前端开发macbook——NVM环境配置以及git配置流程
  • 【Python机器学习】循环神经网络(RNN)——超参数
  • 分享一款快速APP功能测试工具
  • [Vue CLI 3] 配置解析之 css.extract
  • [数据结构]链表的实现在PHP中
  • 【RocksDB】TransactionDB源码分析
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • angular2 简述
  • Docker: 容器互访的三种方式
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • ES学习笔记(12)--Symbol
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • Java方法详解
  • java架构面试锦集:开源框架+并发+数据结构+大企必备面试题
  • js学习笔记
  • miaov-React 最佳入门
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • SegmentFault 2015 Top Rank
  • SQLServer之创建数据库快照
  • vue自定义指令实现v-tap插件
  • XForms - 更强大的Form
  • 浮动相关
  • 干货 | 以太坊Mist负责人教你建立无服务器应用
  • 猫头鹰的深夜翻译:Java 2D Graphics, 简单的仿射变换
  • 世界上最简单的无等待算法(getAndIncrement)
  • 通过git安装npm私有模块
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • 组复制官方翻译九、Group Replication Technical Details
  • ​埃文科技受邀出席2024 “数据要素×”生态大会​
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • ###C语言程序设计-----C语言学习(6)#
  • #Z0458. 树的中心2
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (C语言)fread与fwrite详解
  • (done) 两个矩阵 “相似” 是什么意思?
  • (不用互三)AI绘画:科技赋能艺术的崭新时代
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (附源码)ssm高校运动会管理系统 毕业设计 020419
  • (附源码)计算机毕业设计SSM智慧停车系统