【Android 车载 App】实现座椅调节控制十字指针的效果
创始人
2024-05-08 20:06:18
0

【Android 车载 App】实现座椅调节控制十字指针的效果

  • 效果展示
  • 实现方法
    • 思路
    • 代码
      • 第一步,画两条十字虚线
      • 第二步,在每个虚线的末端画出圆角三角形
      • 第三步,在十字虚线的中间位置画出两个同心圆,一个填充内容,一个描边
      • 第四步,复写onTouchEvent方法,实现同心圆的移动逻辑
  • 代码链接

效果展示

在这里插入图片描述

实现方法

思路

  1. 第一步,画两条十字虚线
  2. 第二步,在每个虚线的末端画出圆角三角形
  3. 第三步,在十字虚线的中间位置画出两个同心圆,一个填充内容,一个描边
  4. 第四步,复写onTouchEvent方法,实现同心圆的移动逻辑

代码

第一步,画两条十字虚线

初始化画笔

        PathEffect pathEffect = new DashPathEffect(new float[]{10f,10f}, 1);linePaint.setStyle(Paint.Style.STROKE);linePaint.setStrokeWidth(5f);linePaint.setColor(Color.GRAY);linePaint.setPathEffect(pathEffect);

在onDraw方法中使用画笔,画出两条十字虚线

    @Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);canvas.drawLine(30,getHeight()/2, getWidth()-30,getHeight()/2, linePaint);canvas.drawLine(getWidth()/2, 30, getWidth()/2, getHeight()-30, linePaint);}

第二步,在每个虚线的末端画出圆角三角形

画三角形需要用到Path的相关知识(这部分内容请同学们自行百度),声明及Path的初始化如下:

	Path upTrianglePath = new Path();Path downTrianglePath = new Path();Path leftTrianglePath = new Path();Path rightTrianglePath = new Path();private Path getTrianglePath(int direction) {initTrianglePath();switch (direction) {case 0:// 上return upTrianglePath;case 1: // 下return downTrianglePath;case 2: // 左return leftTrianglePath;case 3: // 右return rightTrianglePath;default:break;}return upTrianglePath;}private void initTrianglePath() {upTrianglePath.moveTo(getWidth()/2, 0);upTrianglePath.lineTo(getWidth()/2 - 30, 52);upTrianglePath.lineTo(getWidth()/2 + 30, 52);upTrianglePath.close();downTrianglePath.moveTo(getWidth()/2, getHeight());downTrianglePath.lineTo(getWidth()/2 - 30, getHeight() - 52);downTrianglePath.lineTo(getWidth()/2 + 30, getHeight() - 52);downTrianglePath.close();leftTrianglePath.moveTo(0, getHeight()/2);leftTrianglePath.lineTo(52, getHeight()/2 + 30);leftTrianglePath.lineTo(52, getHeight()/2 - 30);leftTrianglePath.close();rightTrianglePath.moveTo(getWidth(), getHeight()/2);rightTrianglePath.lineTo(getWidth() - 52, getHeight()/2 + 30);rightTrianglePath.lineTo(getWidth() - 52, getHeight()/2 - 30);rightTrianglePath.close();}

除了使用 Path 之外,因为我们需要画出圆角三角形,所以还需要对 Paint 对象的 PathEffect 做一下设置:

    private void initPaint() {
//...trianglePaint.setStyle(Paint.Style.FILL);trianglePaint.setColor(Color.GRAY);float radius = 10f;CornerPathEffect corEffect = new CornerPathEffect(radius);trianglePaint.setPathEffect(corEffect);
//...}

然后在 onDraw 方法中画出四个顶点位置的三角形:

    @Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);//....canvas.drawPath(getTrianglePath(0), trianglePaint);canvas.drawPath(getTrianglePath(1), trianglePaint);canvas.drawPath(getTrianglePath(2), trianglePaint);canvas.drawPath(getTrianglePath(3), trianglePaint);//....}

第三步,在十字虚线的中间位置画出两个同心圆,一个填充内容,一个描边

画圆只需要使用canvas.drawCircle方法即可,但是由于两个圆一个需要填充内容,一个需要描边,所以我们使用两个Paint对象来分别实现对应的效果。
声明Paint对象:

    Paint circlePaint1 = new Paint();Paint circlePaint2 = new Paint();private void initPaint() {// ...circlePaint1.setStyle(Paint.Style.FILL);// 填充内容circlePaint1.setColor(Color.GRAY);circlePaint2.setStyle(Paint.Style.STROKE); // 描边circlePaint2.setStrokeWidth(14);circlePaint2.setColor(Color.GRAY);}

然后在 onDraw 方法中画出中心的两个同心圆:

    @Overrideprotected void onDraw(Canvas canvas) {// ...canvas.drawCircle(getCircleX(), getCircleY(), 20, circlePaint1);canvas.drawCircle(getCircleX(), getCircleY(), 48, circlePaint2);}

第四步,复写onTouchEvent方法,实现同心圆的移动逻辑

复写onTouchEvent方法前,需要先设置clickabletrue,否则我们的View只能接收到 ACTION_DOWN 事件,无法接收到其他事件。

    public SeatAdaptionView(Context context, @Nullable AttributeSet attrs) {
//...setClickable(true);}

然后复写 onTouchEvent 方法,实现同心圆的移动逻辑,实现的思路是:

  1. ACTION_DOWN 时记录初始触摸点
  2. ACTION_MOVE 时计算X轴与Y轴的偏移值 deltaXdeltaY,比较二者绝对值大小,根据比较结果设定滑动方向。deltaX大,则延X轴滑动,deltaY大则延Y轴滑动。
  3. 根据 deltaX(或deltaY)的值,改变圆心位置,并执行重绘。
  4. ACTION_UP时,恢复到初始状态。
    @Overridepublic boolean onTouchEvent(MotionEvent event) {int action = event.getAction();switch(action) {case MotionEvent.ACTION_DOWN:// 1.记录初始触摸点touchX = event.getX();touchY = event.getY();lastX = event.getX();lastY = event.getY();break;case MotionEvent.ACTION_MOVE:// 2.计算X轴与Y轴的偏移值 `deltaX` 与 `deltaY`touchX = event.getX();touchY = event.getY();float deltaX = lastX - touchX;float deltaY = lastY - touchY;if (moveDirection == -1) {// 比较二者绝对值大小,根据比较结果设定滑动方向。`deltaX`大,则延X轴滑动,`deltaY`大则延Y轴滑动。if (Math.abs(deltaX) >= Math.abs(deltaY)) {moveDirection = 0;} else {moveDirection = 1;}} else if (moveDirection == 0) {// 水平方向移动mDeltaX = deltaX;// 3.根据 `deltaX`(或`deltaY`)的值,改变圆心位置,并执行重绘。invalidate();} else {// 垂直方向移动mDeltaY = deltaY;// 根据 `deltaX`(或`deltaY`)的值,改变圆心位置,并执行重绘。invalidate();}break;case MotionEvent.ACTION_UP:// 4.恢复到初始状态。touchX = -1;touchY = -1;moveDirection = -1;mDeltaX = 0;mDeltaY = 0;invalidate();break;default:break;}Log.d("SeatAdaptionView", "onTouchEvent: Action = " + event.getAction() + " touchX = " + touchX + " touchY = " + touchY);return super.onTouchEvent(event);}

代码链接

代码链接(github)

相关内容

热门资讯

安卓子系统windows11,... 你知道吗?最近科技圈可是炸开了锅,因为安卓子系统在Windows 11上的兼容性成了大家热议的话题。...
电脑里怎么下载安卓系统,电脑端... 你有没有想过,你的电脑里也能装上安卓系统呢?没错,就是那个让你手机不离手的安卓!今天,就让我来带你一...
索尼相机魔改安卓系统,魔改系统... 你知道吗?最近在摄影圈里掀起了一股热潮,那就是索尼相机魔改安卓系统。这可不是一般的改装,而是让这些专...
安卓系统哪家的最流畅,安卓系统... 你有没有想过,为什么你的手机有时候像蜗牛一样慢吞吞的,而别人的手机却能像风一样快?这背后,其实就是安...
安卓最新系统4.42,深度解析... 你有没有发现,你的安卓手机最近是不是有点儿不一样了?没错,就是那个一直在默默更新的安卓最新系统4.4...
android和安卓什么系统最... 你有没有想过,你的安卓手机到底是用的是什么系统呢?是不是有时候觉得手机卡顿,运行缓慢,其实跟这个系统...
平板装安卓xp系统好,探索复古... 你有没有想过,把安卓系统装到平板上,再配上XP系统,这会是怎样一番景象呢?想象一边享受着安卓的便捷,...
投影仪装安卓系统,开启智能投影... 你有没有想过,家里的老式投影仪也能焕发第二春呢?没错,就是那个曾经陪你熬夜看电影的“老伙计”,现在它...
安卓系统无线车载carplay... 你有没有想过,开车的时候也能享受到苹果设备的便利呢?没错,就是那个让你在日常生活中离不开的iOS系统...
谷歌安卓8系统包,系统包解析与... 你有没有发现,手机更新换代的速度简直就像坐上了火箭呢?这不,最近谷歌又发布了安卓8系统包,听说这个新...
微软平板下软件安卓系统,开启全... 你有没有想过,在微软平板上也能畅享安卓系统的乐趣呢?没错,这就是今天我要跟你分享的神奇故事。想象你手...
coloros是基于安卓系统吗... 你有没有想过,手机里的那个色彩斑斓的界面,背后其实有着一个有趣的故事呢?没错,我要说的就是Color...
安卓神盾系统应用市场,一站式智... 你有没有发现,手机里的安卓神盾系统应用市场最近可是火得一塌糊涂啊!这不,我就来给你好好扒一扒,看看这...
黑莓平板安卓系统升级,解锁无限... 亲爱的读者们,你是否还记得那个曾经风靡一时的黑莓手机?那个标志性的全键盘,那个独特的黑莓体验,如今它...
安卓文件系统采用华为,探索高效... 你知道吗?最近安卓系统在文件管理上可是有了大动作呢!华为这个科技巨头,竟然悄悄地给安卓文件系统来了个...
深度系统能用安卓app,探索智... 你知道吗?现在科技的发展真是让人惊叹不已!今天,我要给你揭秘一个超级酷炫的话题——深度系统能用安卓a...
安卓系统的分区类型,深度解析存... 你有没有发现,你的安卓手机里藏着不少秘密?没错,就是那些神秘的分区类型。今天,就让我带你一探究竟,揭...
安卓系统铠无法兑换,揭秘无法兑... 最近是不是有很多小伙伴在玩安卓系统的游戏,突然发现了一个让人头疼的问题——铠无法兑换!别急,今天就来...
汽车安卓系统崩溃怎么刷,一键刷... 亲爱的车主朋友们,你是否曾遇到过汽车安卓系统崩溃的尴尬时刻?手机系统崩溃还能重启,但汽车系统崩溃了,...
miui系统可以刷安卓p系统吗... 亲爱的手机控们,你是否对MIUI系统情有独钟,同时又对安卓P系统的新鲜功能垂涎欲滴?今天,就让我带你...