【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)

相关内容

热门资讯

美国不提安卓系统华为,迈向自主... 华为与美国:一场关于技术、市场与政策的较量在当今这个数字化的世界里,智能手机已经成为我们生活中不可或...
安卓系统怎么打开ppt,选择文... 你有没有遇到过这种情况:手里拿着安卓手机,突然需要打开一个PPT文件,却怎么也找不到方法?别急,今天...
谷歌退回到安卓系统,探索创新未... 你知道吗?最近科技圈可是炸开了锅,谷歌竟然宣布要退回到安卓系统!这可不是一个简单的决定,背后肯定有着...
安卓系统待机耗电多少,深度解析... 你有没有发现,手机电量总是不经用?尤其是安卓系统,有时候明明没怎么用,电量就“嗖”的一下子就下去了。...
小米主题安卓原生系统,安卓原生... 亲爱的手机控们,你是否曾为手机界面单调乏味而烦恼?想要给手机换换“衣服”,让它焕然一新?那就得聊聊小...
voyov1安卓系统,探索创新... 你有没有发现,最近你的手机是不是变得越来越流畅了?没错,我要说的就是那个让手机焕发青春的Vivo V...
电脑刷安卓tv系统,轻松打造智... 你有没有想过,家里的安卓电视突然变得卡顿,反应迟钝,是不是时候给它来个“大保健”了?没错,今天就要来...
安卓系统即将要收费,未来手机应... 你知道吗?最近有个大消息在科技圈里炸开了锅,那就是安卓系统可能要开始收费了!这可不是开玩笑的,这可是...
雷凌车载安卓系统,智能出行新体... 你有没有发现,现在的汽车越来越智能了?这不,我最近就体验了一把雷凌车载安卓系统的魅力。它就像一个聪明...
怎样拍照好看安卓系统,轻松拍出... 拍照好看,安卓系统也能轻松搞定!在这个看脸的时代,拍照已经成为每个人生活中不可或缺的一部分。无论是记...
安卓车机系统音频,安卓车机系统... 你有没有发现,现在越来越多的汽车都开始搭载智能车机系统了?这不,咱们就来聊聊安卓车机系统在音频方面的...
老苹果手机安卓系统,兼容与创新... 你手里那台老苹果手机,是不是已经陪你走过了不少风风雨雨?现在,它竟然还能装上安卓系统?这可不是天方夜...
安卓系统7.dns,优化网络连... 你有没有发现,你的安卓手机最近是不是有点儿“慢吞吞”的?别急,别急,让我来给你揭秘这可能与你的安卓系...
安卓手机系统怎么加速,安卓手机... 你有没有发现,你的安卓手机最近变得有点“慢吞吞”的?别急,别急,今天就来给你支几招,让你的安卓手机瞬...
小米note安卓7系统,探索性... 你有没有发现,手机更新换代的速度简直就像坐上了火箭呢?这不,小米Note这款手机,自从升级到了安卓7...
安卓和鸿蒙系统游戏,两大系统游... 你有没有发现,最近手机游戏界可是热闹非凡呢!安卓和鸿蒙系统两大巨头在游戏领域展开了一场激烈的较量。今...
安卓手机没有系统更,揭秘潜在风... 你有没有发现,现在安卓手机的品牌和型号真是五花八门,让人挑花了眼。不过,你知道吗?尽管市面上安卓手机...
充值宝带安卓系统,安卓系统下的... 你有没有发现,最近手机上的一款充值宝APP,在安卓系统上可是火得一塌糊涂呢!这不,今天就来给你好好扒...
安卓系统8.0镜像下载,轻松打... 你有没有想过,想要给你的安卓手机升级到最新的系统,却不知道从哪里下载那个神秘的安卓系统8.0镜像呢?...
安卓系统修改大全,全方位修改大... 你有没有想过,你的安卓手机其实是个大宝藏,里面藏着无数可以让你手机焕然一新的秘密?没错,今天就要来个...