效果图

全部正确:

有对有错:

结果展示,纯黑色:

支持图片:

实现思路

仔细分析可以发现,连线题的布局可以分为两部分,一个是左右两列矩形,另一个是他们之间的连线。

每个矩形的宽高都一样,或者等比例,这样利于给他们定位,添加矩形时使用ViewGroup#ddView(View child, LayoutParams params)方法,我们通过LayoutParams参数来控制每个矩形的位置。

为了方便添加矩形,这里我们的自定义布局继承自RelativeLayout。

public class LinkLineView extends RelativeLayout {...
}

接下来说连线,连线我们通过记录他们的起点和终点数据,然后调用View#invalidate方法,在ViewGgroup#dispatchDraw()方法里面通过canvas.drawLine()方法进行绘制。

我们假设线都是从左向右连的,起点就是左边矩形右边距的中点,终点就是右边矩形左边距的中点。在添加矩形的时候我们可以知道每个矩形的具体参数,所以所有连线的起点和终点的数据我们是知道的,接着就是如何表示一根线的问题。

在所有连线完成之前,连线是可以取消掉的;在所有连线完成后,我们需要用连线结果跟正确结果进行比对的,所以我们需要针对每次连线定义一个数据结构,具体如下:

public class LinkLineBean {/*** 直线的横纵坐标*/private float startX;private float startY;private float endX;private float endY;public LinkLineBean(float startX, float startY, float endX, float endY) {this.startX = startX;this.startY = startY;this.endX = endX;this.endY = endY;}// 省略getter和setter方法@Overridepublic boolean equals(Object o) {if (this == o) {return true;}if (!(o instanceof LinkLineBean)) {return false;}LinkLineBean that = (LinkLineBean) o;return (Float.compare(that.startX, startX) == 0 &&Float.compare(that.startY, startY) == 0 &&Float.compare(that.endX, endX) == 0 &&Float.compare(that.endY, endY) == 0)|| (Float.compare(that.startX, endX) == 0 &&Float.compare(that.startY, endY) == 0 &&Float.compare(that.endX, startX) == 0 &&Float.compare(that.endY, startY) == 0);}@Overridepublic int hashCode() {return Objects.hash(startX, startY, endX, endY);}
}

这里省略了一些不必要的代码。

重写equals和hashCode方法是为了比较是否是同一条连线。如果连线A的起点等于连线B的终点,连线A的终点等于连线B的起点,我们就认为他们是同一条连线,这个也符合我们的常识,同一条线从左向右连和从右向左连是一样的。

核心思路说完了,剩下的就是一些细节处理了。

具体代码请看:LinkLineDemo

如果觉得好用请记得star。

Android实现连线题效果相关推荐

  1. Android 倒车影像车道线,3D效果

    Android 倒车影像车道线 1.直接上代码 public class LaneLineView extends View {private Paint paint;private Camera c ...

  2. Android耳机线控详解,蓝牙耳机按钮监听(仿酷狗线控效果)

    转载请注明出处:http://blog.csdn.net/fengyuzhengfan/article/details/46461253 当耳机的媒体按键被单击后,Android系统会发出一个广播,该 ...

  3. Android实现支付宝AR功能,Android RecyclerView 实现支付宝首页效果

    Android RecyclerView 实现支付宝首页效果 [TOC] 虽然我本人不喜欢支付宝的,但是这个网格本身其实还是不错的,项目更新中更改了一个布局为网格模式,类似支付宝.(估计是产品抄袭的= ...

  4. android自动画线,Android画布画线 - 使线条变粗

    这看起来应该有点微不足道,但是在我的Android应用程序中,我使用画布绘制了连接在一起的一系列线条.出于某种原因,我的线条非常非常微弱.我想知道如何让我的线条变粗?这是我的代码..Android画布 ...

  5. 用flash做连线题(线的一端跟随鼠标)

    帮同事做课件,其中要做个连线测试题,需要实现用户可以用鼠标从一个点拉出一根线来的效果,实际上是线 的一端跟随鼠标,改变线的长度和倾斜角度.这和一般的图象或文字跟随鼠标有点区别.因为把高中的三角函数忘光 ...

  6. Android绘制波浪线

    今天让我们来绘制一条波浪线,并且提供了控制波浪大小和波浪速度的方法,首先我们来看看完成的效果: 效果是不是还不错,接下来我们就来看看具体怎么实现的吧! 如果你学会了这种绘制波浪线的方式,可以了解下波浪 ...

  7. Android利用SVG实现动画效果

    系列文章目录 Android利用SVG实现动画效果 老规矩,文中/文末会放置源码 文章目录 系列文章目录 前言 一.先看看Android中一个简单的SVG图 二.pathdata中参数的定义(三角形是 ...

  8. Android绘制波浪线 进阶

    前言 在我的上一篇博客中,我讲解了如何绘制一条波浪线,今天我们的目的是,绘制一条随心所欲的波浪线,什么叫随心所欲的波浪线呢,由于上篇主要讲解的是绘制波浪线的原理,不过就有人提问了,万一我想要的波浪线长 ...

  9. android自动画线,Android自定义View——扇形统计图

    Android 扇形统计图 先看看效果: 看上去如果觉得还行就继续往下看吧! 效果图1 效果图2 自定义View 定义成员变量 private int mHeight, mWidth;//宽高 pri ...

  10. android特效按钮点击效果

    2019独角兽企业重金招聘Python工程师标准>>> android特效按钮点击效果,动画从里到外渐变放大散花效果,本例子适合做一些特效的app使用, 使用很简单,直接可以把里面代 ...

最新文章

  1. ATL的GUI程序设计(前言)
  2. 你敢在post和get上刁难我,就别怪我装逼了
  3. SQL 分页存储过程(转)
  4. 曝光原理_泰国精戈咖啡效果反馈 作用原理曝光
  5. python程序代码_python基础二
  6. 三流面试问技术,二流面试问平台,一流面试……
  7. Qt+VS2015+番茄助手 个人常用快捷键集锦
  8. iOS申请真机调试证书-图文详解
  9. 超标量处理器设计 姚永斌 第6章 指令解码 摘录
  10. python生成拼音
  11. vue使用高德地图第一次进去点标记有数据,第二次进去就没有了
  12. VS编程,WPF控件增加图片背景的一种方法
  13. 迄今见过的最好的职业规划文章
  14. icon图标制作网站推荐
  15. 用计算机编程做微信,电脑端微信双开,教你两种简单的方法,上手即用!
  16. 元素周期表的118个化学元素
  17. Mysql和Navicat
  18. 【问题思考总结】式子两边同时除以dx万一dx=0呢?
  19. Uniapp苹果登录
  20. 如何对pdf电子文档进行手写签名

热门文章

  1. php 递归函数 示例,php递归函数使用示例详解
  2. Java中的锁 | JDK6 关于锁的优化
  3. ThinkPad T470P拆机加固态硬盘 建兴 T11 plus
  4. java根据id查询名字_Mybatis根据id查询用户信息
  5. Android 电子市场
  6. js中文转拼音插件源码
  7. Matlab非线性拟合函数——nlinfit
  8. 软件测试的支付流程图,软件测试流程图案例.doc
  9. 七个基本量纲_超星尔雅三维建模与仿真答案题库
  10. CLM5.0模式移植篇——驴某人的自我救赎