项目新需求  要来个连线题...


效果图  这个只是基本的逻辑实现了   具体要做的话还需要继续完善 .核心代码已经写出来了

剩下的就是 体力活 完善界面 和其他的一些逻辑了 比如按下的效果 画线的颜色宽度.等等.

下面是核心代码  如果需要下载 后面有下载链接

package com.example.customview01.view;import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Random;
import java.util.Set;import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Cap;
import android.graphics.Point;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.MotionEvent;
import android.view.View;import com.example.customview01.MLog;
import com.example.customview01.R;public class MyView extends View {String pointText[] = { "第一", "第二", "第三", "第四" };String reaAnswer[] = { "13", "24" };List<MyLine> list;List<Point> beginList;private int selectLine;// 当前画的第几条线///*** 文本*/private String mTitleText;/*** 文本的颜色*/private int mTitleTextColor;/*** 文本的大小*/private int mTitleTextSize;Paint linePaint = new Paint();private float width, height;//// /**// * 绘制时控制文本绘制的范围// */private Rect mBound;private Paint mPaint;public MyView(Context context, AttributeSet attrs) {this(context, attrs, 0);}public MyView(Context context) {this(context, null);}/*** 获得我自定义的样式属性* * @param context* @param attrs* @param defStyle*/public MyView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);/*** 获得我们所定义的自定义样式属性*/TypedArray a = context.getTheme().obtainStyledAttributes(attrs,R.styleable.MyView, defStyle, 0);int n = a.getIndexCount();for (int i = 0; i < n; i++) {int attr = a.getIndex(i);switch (attr) {case R.styleable.MyView_titleText:mTitleText = a.getString(attr);break;case R.styleable.MyView_titleTextColor:// 默认颜色设置为黑色mTitleTextColor = a.getColor(attr, Color.BLACK);break;case R.styleable.MyView_titleTextSize:// 默认设置为16sp,TypeValue也可以把sp转化为pxmTitleTextSize = a.getDimensionPixelSize(attr, (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 16,getResources().getDisplayMetrics()));break;}}a.recycle();initData();/*** 获得绘制文本的宽和高*/mPaint = new Paint();mPaint.setTextSize(mTitleTextSize);// mPaint.setColor(mTitleTextColor);mBound = new Rect();mPaint.getTextBounds(mTitleText, 0, mTitleText.length(), mBound);}/*** 初始化数据*/private void initData() {// TODO Auto-generated method stubinitLinePaint();list = new ArrayList<MyLine>();// 初始化// 根据答案个数 将自定义view分成几块 然后获取每个选项的x y 点}private void initLinePaint() {// TODO Auto-generated method stublinePaint.setColor(Color.RED);linePaint.setStrokeWidth(20);linePaint.setAntiAlias(true);linePaint.setStrokeCap(Cap.ROUND);}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {// super.onMeasure(widthMeasureSpec, heightMeasureSpec);int width = 0;int height = 0;/*** 设置宽度*/int specMode = MeasureSpec.getMode(widthMeasureSpec);int specSize = MeasureSpec.getSize(widthMeasureSpec);switch (specMode) {case MeasureSpec.EXACTLY:// 明确指定了width = getPaddingLeft() + getPaddingRight() + specSize;break;case MeasureSpec.AT_MOST:// 一般为WARP_CONTENTwidth = getPaddingLeft() + getPaddingRight() + mBound.width();break;}/*** 设置高度*/specMode = MeasureSpec.getMode(heightMeasureSpec);specSize = MeasureSpec.getSize(heightMeasureSpec);switch (specMode) {case MeasureSpec.EXACTLY:// 明确指定了height = getPaddingTop() + getPaddingBottom() + specSize;break;case MeasureSpec.AT_MOST:// 一般为WARP_CONTENTheight = getPaddingTop() + getPaddingBottom() + mBound.height();break;}setMeasuredDimension(width, height);initAnswerPoint();}private void initAnswerPoint() {beginList = new ArrayList<Point>();// 根据答案个数 将自定义view分成几块 然后初始化每个选项的x y 点MLog.d("宽 = " + getMeasuredWidth() + "  高 = " + getMeasuredHeight());int size = pointText.length;for (int i = 0; i < size; i++) {beginList.add(getPoint(i));}}// 根据传入的答案返回返回线的点private Point getPoint(final int select) {Point point = null;// TODO Auto-generated method stubint size = pointText.length;MLog.d("==宽度  = " + getMeasuredWidth() + "      高度  = "+ getMeasuredHeight());int item = getMeasuredHeight() / size;int x = 0, y = 0;switch (select) {case 0:x = 0;y = item;break;case 1:x = getMeasuredWidth();y = item;break;case 2:x = 0;y = item * (select + 1);break;case 3:x = getMeasuredWidth();y = item * (select);break;default:break;}point = new Point(x, y);return point;}@Overridepublic boolean onTouchEvent(MotionEvent event) {// TODO Auto-generated method stubMLog.d("觸摸事件");MLog.d("宽 = " + getMeasuredWidth() + "  高 = " + getMeasuredHeight());switch (event.getAction()) {case MotionEvent.ACTION_DOWN:MLog.d("按下事件  x = " + event.getX() + " y= " + event.getY());break;case MotionEvent.ACTION_MOVE:MLog.d("移動事件  x = " + event.getX() + " y= " + event.getY());break;case MotionEvent.ACTION_UP:MLog.d("移動事件  x = " + event.getX() + " y= " + event.getY());break;default:break;}return super.onTouchEvent(event);}@Overrideprotected void onDraw(Canvas canvas) {mPaint.setColor(Color.YELLOW);canvas.drawRect(0, 0, getMeasuredWidth(), getMeasuredHeight(), mPaint);mPaint.setColor(mTitleTextColor);if (list != null && list.size() > 0) {for (int i = 0; i < list.size(); i++) {drawLine(list.get(i), canvas);}}}/*** 根据答案 判断当前选择的是那一条线 并進行設置* * @param answer1* @param answer2*/public void setLine(int answer1, int answer2) {// list.get(location)// 如果没满 或者不存在 那么给他添加 否则 进行设置if (!isExists(answer1, answer2)) {if(isSameSide(answer1,answer2)){return;}// 或者String str = String.valueOf(answer1) + String.valueOf(answer2);MLog.d("存入的答案 = " + str);MyLine myLine = new MyLine(getPoint(answer1), getPoint(answer2),str);list.add(myLine);} else {if(isSameSide(answer1,answer2)){return;}for (int i = 0; i < list.size(); i++) {MyLine myLine = list.get(i);if (myLine.anwer.contains(String.valueOf(answer1))|| myLine.anwer.contains(String.valueOf(answer2))) {list.set(i,new MyLine(getPoint(answer1), getPoint(answer2),String.valueOf(answer1)+ String.valueOf(answer2)));}}}invalidate();}/*** 是否是同一侧* @param answer1* @param answer2* @return*/private boolean isSameSide(int answer1, int answer2) {if (answer1 % 2 == 0 && answer2 % 2 == 0) {//同一侧// i为偶数return true;} if (answer1 % 2 != 0 && answer2 % 2 != 0) {//同一侧// i为奇数return true;}return false; }/*** 根据传入的答案判断 是否已经存入数据* * @param anwer1* @param anwer2* @return*/private boolean isExists(int answer1, int answer2) {if (list.size() <= 0) {return false;}for (int i = 0; i < list.size(); i++) {MyLine myLine = list.get(i);if (myLine.anwer != null&& (myLine.anwer.contains(String.valueOf(answer1)) || myLine.anwer.contains(String.valueOf(answer2)))) {return true;}}return false;}/*** 画线* * @param myLine* @param canvas*/private void drawLine(MyLine myLine, Canvas canvas) {canvas.drawLine(myLine.getStartx(), myLine.getStarty(),myLine.getEndx(), myLine.getEndy(), linePaint);}class MyLine {int startx;int starty;int endx;int endy;String anwer;public MyLine(Point point1, Point point2, String answer1) {this.startx = point1.x;this.starty = point1.y;this.endx = point2.x;this.endy = point2.y;this.anwer = answer1;}public String getAnwer() {return anwer;}public void setAnwer(String anwer) {this.anwer = anwer;}public int getStartx() {return startx;}public void setStartx(int startx) {this.startx = startx;}public int getStarty() {return starty;}public void setStarty(int starty) {this.starty = starty;}public int getEndx() {return endx;}public void setEndx(int endx) {this.endx = endx;}public int getEndy() {return endy;}public void setEndy(int endy) {this.endy = endy;}@Overridepublic String toString() {return "MyLine [startx=" + startx + ", starty=" + starty+ ", endx=" + endx + ", endy=" + endy + ", anwer=" + anwer+ "]";}}
}

http://download.csdn.net/detail/liudao7994/9664824 下载地址 新加了textview状态选中

android 连线题实现 自定义view  画线相关推荐

  1. android xml画圆,Android自定义View画圆功能

    本文实例为大家分享了Android自定义View画圆的具体代码,供大家参考,具体内容如下 引入布局 xmlns:tools="http://schemas.android.com/tools ...

  2. Android软件开发之盘点自定义View界面大合集(二)

    Android软件开发之盘点自定义View界面大合集(二) - 雨松MOMO的程序世界 - 51CTO技术博客 雨松MOMO带大家盘点Android 中的自定义View界面的绘制 今天我用自己写的一个 ...

  3. 安卓自定义View画钟实现转动

    1.自定义View画钟实现转动 这个和画圆差不多,不过只是价格分针,并实现其转动,要加一个线程.代码如下: Java类中的代码 package com.example.ll.canvas;import ...

  4. 自定义view画走势图(一)

    在之前的许多项目中,在很多地方都需要有统计图来展示数据,其中用的比较多的就是折线图,本来一直想自己画的,无奈每次项目都是赶时间,基本都是在网上找个别人写好的,能基本满足需求的,就直接拿来用了.现在稍微 ...

  5. Android中实现Bitmap在自定义View中的放大与拖动

    一基本实现思路: 基于View类实现自定义View –MyImageView类.在使用View的Activity类中完成OnTouchListener接口,实现对MotionEvent事件的监听与处理 ...

  6. Android 雪花飘落动画效果 自定义View

    在码农的世界里,优美的应用体验,来源于程序员对细节的处理以及自我要求的境界,年轻人也是忙忙碌碌的码农中一员,每天.每周,都会留下一些脚印,就是这些创作的内容,有一种执着,就是不知为什么,如果你迷茫,不 ...

  7. Carson带你学Android:源码解析自定义View Draw过程

    前言 自定义View是Android开发者必须了解的基础 网上有大量关于自定义View原理的文章,但存在一些问题:内容不全.思路不清晰.无源码分析.简单问题复杂化 等 今天,我将全面总结自定义View ...

  8. android 仿360浮动,Android仿360悬浮小球自定义view实现示例

    Android仿360悬浮小球自定义view实现示例 效果图如下: 实现当前这种类似的效果 和360小球 悬浮桌面差不错类似.这种效果是如何实现的呢.废话不多说 ,直接上代码. 1.新建工程,添加悬浮 ...

  9. Android仿IOS滑动关机-自定义view系列(6)

    Android仿IOS滑动关机-自定义view系列 功能简介 GIf演示 主要实现步骤-具体内容看github项目里的代码 Android技术生活交流 更多其他页面-自定义View-实用功能合集:点击 ...

  10. Android 自定义View画一条线

    自定义View代码: public class NavBarBackgroundView extends View {private Paint mPaint = new Paint();public ...

最新文章

  1. Docker容器之macvlan网络
  2. 【机器学习基础】半监督算法概览(Python)
  3. hdu 1561 The more, The Better 树形dp
  4. 【PHP】xampp配置多个监听端口和不同的网站目录(转)
  5. mysql(1):修改数据库密码
  6. CentOS安装Hadoop
  7. sysbench tpcc-mysql_MySQL压测sysbench/tpcc
  8. 软件项目开发过程中应编写的十三类文档
  9. c php乱码,Cknife的PHP功能部分修正,解决SHELL无法回显以及中文乱码
  10. Mysql 语句执行顺序
  11. 集团企业信息化规划和实施研究
  12. 程序员的九阳神功,学会逆天改命!
  13. C语言用梯形法求定积分
  14. 关于excel:具有OR条件的SUMIF
  15. 赤链——区块链底层技术革命
  16. 谈谈个人10几年来的一些经历感悟
  17. java 搜索 下拉列表框_用java编写随用户输入自动弹出下拉列表匹配项目,类似百度搜索...
  18. IDEA运行项目提示找不到程序包
  19. python爬取某网站图片
  20. 小米8国际版MIUI国际版

热门文章

  1. php递归函数及简单实例讲解
  2. Unix编程艺术之第一部分
  3. 使用RTX Server SDK帮助文档开发
  4. SHELLEXECUTEINFO学习
  5. Android CallStack
  6. 微软输入法怎么最小化到托盘_Windows下的五笔输入法哪个最好用?我来推荐几款...
  7. 同济大学高等数学第7版视频
  8. flash 林度_flash怎么制作呢 ?
  9. 华为数通考试正式改版,改版前后有什么区别?
  10. Sql Server2008R2的完全卸载及重新安装