同事做的view,拿过来做个记录。

​
/*** */
package com.text.myviewdemo.view;import org.apache.http.conn.routing.RouteInfo.LayerType;import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.DashPathEffect;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Xfermode;
import android.graphics.PorterDuff.Mode;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;/*** @author chenhanrong**/
public class CCView extends View implements android.view.View.OnClickListener{private Paint paint;private float[] line_r,line_l,line_1,line_2,line_3,line_t;
//  private float line1YL,line1YR,line2YL,line2YR,line3YL,line3YR;public Context context;private float radiu;private boolean showPoint = false;private boolean cmP1=false;private boolean cmP2=false;private boolean cmP3=false;private boolean cmP4=false;private boolean cmP5=false;private boolean cmP6=false;private boolean cmP7=false;private boolean cmP8=false;private boolean cmP9=false;private boolean cmP10=false;private boolean isfirst = true;private boolean isMove = false;public final static int D_LEFT =0;public final static int D_RIGHT =1;public final static int TYPE_MIN =0;public final static int TYPE_MAX =1;public CCView(Context context) {this(context,null);}public CCView(Context context, AttributeSet attrs) {this(context,attrs,0);}public CCView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);this.context = context;init();}/*** 初始化控件*/private void init() {paint = new Paint();/*去锯齿*/paint.setAntiAlias(true);/*设置paint的颜色*/paint.setColor(Color.RED);/*设置paint的 style*/paint.setStyle(Paint.Style.FILL);/*设置paint的外框宽度*/paint.setStrokeWidth(10);setOnClickListener(this);setOnTouchListener(new OnTouchListener() {  @Override  public boolean onTouch(View v, MotionEvent event) {  return false;  }  });setLayerType(LAYER_TYPE_HARDWARE, paint);radiu = 20f;}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);canvas.drawColor(0x00000000, PorterDuff.Mode.CLEAR);
//      paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OVER));if(isfirst){line_l = new float[]{getWidth()/4,getHeight()/4,getWidth()/8,getHeight()};line_r = new float[]{3*getWidth()/4, getHeight()/4,7*getWidth()/8, getHeight()};line_1 = new float[]{getPointX(line_l, line_l[1]*2f),line_l[1]*2f,getPointX(line_r, line_r[1]*2f), line_r[1]*2f};line_2 = new float[]{getPointX(line_l, line_l[1]*2.5f), line_l[1]*2.5f, getPointX(line_r, line_r[1]*2.5f), line_r[1]*2.5f};line_3 = new float[]{getPointX(line_l, line_l[1]*3f), line_l[1]*3f, getPointX(line_r, line_r[1]*3f), line_r[1]*3f};isfirst = false;}int canvasWidth = canvas.getWidth();int canvasHeight = canvas.getHeight();int layerId = canvas.saveLayer(0, 0, canvasWidth, canvasHeight, null, Canvas.ALL_SAVE_FLAG);
//      paint.setXfermode(new PorterDuffXfermode(Mode.DST_OVER));line_t = new float[]{getPointX(line_l, line_l[1]), line_l[1], getPointX(line_r, line_r[1]), line_r[1]};if(showPoint){ //四条横线  canvas.drawLines(line_t, paint);paint.setPathEffect(new DashPathEffect(new float[] {20, 5}, 0));    canvas.drawLines(line_1, paint);paint.setColor(Color.GREEN);canvas.drawLines(line_2, paint);paint.setColor(Color.YELLOW);canvas.drawLines(line_3, paint);paint.setColor(Color.RED);paint.setPathEffect(null);//左右两边线canvas.drawLines(line_l, paint);    canvas.drawLines(line_r,  paint);//中间三条横线交点canvas.drawCircle(line_1[0], line_1[1],radiu, paint);canvas.drawCircle(line_1[2], line_1[3],radiu, paint);paint.setColor(Color.GREEN);canvas.drawCircle(line_2[0], line_2[1],radiu, paint);canvas.drawCircle(line_2[2], line_2[3],radiu, paint);paint.setColor(Color.YELLOW);canvas.drawCircle(line_3[0], line_3[1],radiu, paint);canvas.drawCircle(line_3[2], line_3[3],radiu, paint);paint.setColor(Color.RED);//左右四点canvas.drawCircle(line_l[0], line_l[1],radiu, paint);canvas.drawCircle(line_l[2], line_l[3],radiu, paint);canvas.drawCircle(line_r[0], line_r[1],radiu, paint);canvas.drawCircle(line_r[2], line_r[3],radiu, paint);}else{float lf=getDashLineLength(D_LEFT);float rf=getDashLineLength(D_RIGHT);canvas.drawLines(line_t, paint);paint.setPathEffect(new DashPathEffect(new float[] {20, 5}, 0));canvas.drawLine(line_1[0],line_1[1],lf,getPointY(line_1, lf), paint);canvas.drawLine(rf,getPointY(line_1, rf),line_1[2],line_1[3], paint);paint.setColor(Color.GREEN); canvas.drawLine(line_2[0],line_2[1],lf,getPointY(line_2, lf), paint);canvas.drawLine(rf,getPointY(line_2, rf),line_2[2],line_2[3], paint);paint.setColor(Color.YELLOW);canvas.drawLine(line_3[0],line_3[1],lf,getPointY(line_3, lf), paint);canvas.drawLine(rf,getPointY(line_3, rf),line_3[2],line_3[3], paint);paint.setPathEffect(null);paint.setColor(Color.RED);//左右两边线canvas.drawLines(line_l, paint);    canvas.drawLines(line_r,  paint);canvas.drawCircle(line_l[0], line_l[1],paint.getStrokeWidth()/2, paint);canvas.drawCircle(line_r[0], line_r[1],paint.getStrokeWidth()/2, paint);}
//      paint.setStyle(Paint.Style.STROKE);paint.setColor(Color.RED);paint.setPathEffect(null);paint.setXfermode(null);canvas.restoreToCount(layerId);}/*** 获取坐标x* @param line 直线坐标系* @param y y点* @return*/private float getPointX(float[] line,float y){float x = 0;
//      Log.d("chr", "line====>"+line.length+":::y====>"+y);float x1 = line[0];float y1 = line[1];float x2 = line[2];float y2 = line[3];x = ((y-y1)/(y2-y1))*(x2-x1)+x1;return x;}/*** 获取坐标y* @param line:直线坐标系* @param x:x点* @return*/private float getPointY(float[] line,float x){float y = 0;
//      Log.d("chr", "line====>"+line.length+":::y====>"+y);float x1 = line[0];float y1 = line[1];float x2 = line[2];float y2 = line[3];y = ((x-x1)/(x2-x1))*(y2-y1)+y1;return y;}/*** 获取点应该移动到的Y坐标* @param line:线段坐标* @param y:滑动时的y坐标* @return*/private float getMoveY(float[] line,float y){if(y<=line[1]+ radiu){y=line[1]+radiu*2.0f;   } if(y>=line[3]-radiu*2.0f){y=line[3]-radiu*2.0f;          }return y;}/*** * @param direction 获取虚线长度* @return*/private float getDashLineLength(int direction){float length = 0;int a = 20;switch (direction) {case D_LEFT:length = line_t[0]+(line_t[2]-line_t[0])/a;break;case D_RIGHT:length = line_t[0]+(a-1)*(line_t[2]-line_t[0])/a;break;}return length;}/*** 获取最小值* @return*/private float getMinPoint(float point[]){float min = point[0];for(int i=0;i<point.length;i++){if(min>point[i]){min=point[i];}}return min;}/*** 获取最大值* @return*/private float getMaxPoint(float point[]){float max = point[0];for(int i=0;i<point.length;i++){if(max<point[i]){max=point[i];}}return max;}/*** 获取y轴限制点* @param point* @param y* @param type* @return*/private float getLimtMoveY(float point[],float y,int type){if(type == TYPE_MIN){float limt = getMinPoint(point);if(y>limt-radiu*2.0f){y = limt-radiu*2.0f;}}if(type == TYPE_MAX){float limt2 = getMaxPoint(point);if(y<limt2+radiu*2.0f){y = limt2+radiu*2.0f;}}return y;}public void proofView(int direction){switch (direction) {case D_LEFT:line_1[3] = line_1[1];line_1[2] = getPointX(line_r, line_1[1]);line_2[3] = line_2[1];line_2[2] = getPointX(line_r, line_2[1]);line_3[3] = line_3[1];line_3[2] = getPointX(line_r, line_3[1]);break;case D_RIGHT:line_1[1] = line_1[3];line_1[0] = getPointX(line_l, line_1[3]);line_2[1] = line_2[3];line_2[0] = getPointX(line_l, line_2[3]);line_3[1] = line_3[3];line_3[0] = getPointX(line_l, line_3[3]);break;}invalidate();}@Overridepublic boolean onTouchEvent(MotionEvent event) {// TODO Auto-generated method stubfloat x =event.getX();float y =event.getY();switch (event.getAction()) {case MotionEvent.ACTION_DOWN:if(showPoint){    isMove = false;Log.d("chr", "MotionEvent.ACTION_DOWN::x====>"+x+"::::y===>"+y);if(x<=(line_l[0]+radiu*2.0f) && x>=(line_l[0]-radiu*2.0f)&& y>=(line_l[1]-radiu*2.0f)&&y<=(line_l[1]+radiu*2.0f)){cmP1 = true;}else if(x<=(line_r[0]+radiu*2.0f) && x>=(line_r[0]-radiu*2.0f)&& y>=(line_r[1]-radiu*2.0f)&&y<=(line_r[1]+radiu*2.0f)){cmP2 = true;}else if(x<=(line_l[2]+radiu*2.0f )&& x>=(line_l[2]-radiu*2.0f)&& y>=(line_l[3]-radiu*2.0f)&&y<=(line_l[3]+radiu*2.0f)){cmP3 = true;}else if(x<=(line_r[2]+radiu*2.0f )&& x>=(line_r[2]-radiu*2.0f)&& y>=(line_r[3]-radiu*2.0f)&&y<=(line_r[3]+radiu*2.0f)){cmP4 = true;}else if(x<=(line_1[0]+radiu*2.0f )&& x>=(line_1[0]-radiu*2.0f)&& y>=(line_1[1]-radiu*2.0f)&&y<=(line_1[1]+radiu*2.0f)){cmP5 = true;}else if(x<=(line_1[2]+radiu*2.0f )&& x>=(line_1[2]-radiu*2.0f)&& y>=(line_1[3]-radiu*2.0f)&&y<=(line_1[3]+radiu*2.0f)){cmP6 = true;}else if(x<=(line_2[0]+radiu*2.0f )&& x>=(line_2[0]-radiu*2.0f)&& y>=(line_2[1]-radiu*2.0f)&&y<=(line_2[1]+radiu*2.0f)){cmP7 = true;}else if(x<=(line_2[2]+radiu*2.0f)&& x>=(line_2[2]-radiu*2.0f)&& y>=(line_2[3]-radiu*2.0f)&&y<=(line_2[3]+radiu*2.0f)){cmP8 = true;}else if(x<=(line_3[0]+radiu *2.0f)&& x>=(line_3[0]-radiu*2.0f)&& y>=(line_3[1]-radiu*2.0f)&&y<=(line_3[1]+radiu*2.0f)){cmP9 = true;}else if(x<=(line_3[2]+radiu*2.0f )&& x>=(line_3[2]-radiu*2.0f)&& y>=(line_3[3]-radiu*2.0f)&&y<=(line_3[3]+radiu*2.0f)){cmP10 = true;}}break;case MotionEvent.ACTION_MOVE:float[] point_L = new float[]{line_1[1],line_2[1],line_3[1]};float[] point_R = new float[]{line_1[3],line_2[3],line_3[3]};if(cmP1){isMove = true;line_l[0] =x;line_l[1] =getLimtMoveY(point_L, y, TYPE_MIN);line_1[0]= getPointX(line_l,line_1[1]);line_2[0]= getPointX(line_l,line_2[1]);line_3[0]= getPointX(line_l,line_3[1]);}else if(cmP2){isMove = true;line_r[0] = x;line_r[1] = getLimtMoveY(point_R, y, TYPE_MIN);line_1[2]= getPointX(line_r,line_1[3]);line_2[2]= getPointX(line_r,line_2[3]);line_3[2]= getPointX(line_r,line_3[3]);}else if(cmP3){isMove = true;line_l[2] =x;line_l[3] =getLimtMoveY(point_L, y, TYPE_MAX);line_1[0]= getPointX(line_l,line_1[1]);line_2[0]= getPointX(line_l,line_2[1]);line_3[0]= getPointX(line_l,line_3[1]);}else if(cmP4){isMove = true;line_r[2] = x;line_r[3] = getLimtMoveY(point_R, y, TYPE_MAX);line_1[2]= getPointX(line_r,line_1[3]);line_2[2]= getPointX(line_r,line_2[3]);line_3[2]= getPointX(line_r,line_3[3]);}else if(cmP5){isMove = true;y=getMoveY(line_l,y);line_1[0]= getPointX(line_l, y);line_1[1]= y;}else if(cmP6){isMove = true;y=getMoveY(line_r,y);line_1[2]= getPointX(line_r, y);line_1[3]= y;}else if(cmP7){isMove = true;y=getMoveY(line_l,y);line_2[0]= getPointX(line_l, y);line_2[1]= y;}else if(cmP8){isMove = true;y=getMoveY(line_r,y);line_2[2]= getPointX(line_r, y);line_2[3]= y;}else if(cmP9){isMove = true;y=getMoveY(line_l,y);line_3[0]= getPointX(line_l, y);line_3[1]= y;}else if(cmP10){isMove = true;y=getMoveY(line_r,y);line_3[2]= getPointX(line_r, y);line_3[3]= y;}   invalidate();   break;case MotionEvent.ACTION_UP:cmP1= false;cmP2= false;cmP3= false;cmP4= false;cmP5= false;cmP6= false;cmP7= false;cmP8= false;cmP9= false;cmP10= false;if(!isMove)showPoint = !showPoint;invalidate();break;}return super.onTouchEvent(event);}@Overridepublic void onClick(View v) {}}​

使用Android自定义view完成车载可调整轨迹线相关推荐

  1. android 车辆轨迹,Android自定义view实现车载可调整轨迹线

    本文实例为大家分享了Android自定义view完成车载可调整轨迹线的具体代码,供大家参考,具体内容如下 同事做的view,拿过来做个记录. /** * */ package com.text.myv ...

  2. android中仿qq最新版抽屉,Android 自定义View实现抽屉效果

    Android 自定义View实现抽屉效果 说明 这个自定义View,没有处理好多点触摸问题 View跟着手指移动,没有采用传统的scrollBy方法,而是通过不停地重新布局子View的方式,来使得子 ...

  3. android 自定义 对号,Android自定义View实现打钩动画功能

    先上效果图 动图 静态图 1. 回顾 [Android自定义View:一个精致的打钩小动画]上一篇文章,我们已经实现了基本上实现了控件的效果了,但是...但是...过了三四天后,仔细看回自己写的代码, ...

  4. Android 自定义view完全解析--带你通透了解自定义view

    参考转自郭霖博客带你一步步深入了解View系列 Android LayoutInflater原理分析 相信接触Android久一点的朋友对于LayoutInflater一定不会陌生,都会知道它主要是用 ...

  5. android 自定义view 动画效果,Android自定义view实现阻尼效果的加载动画

    效果: 需要知识: 1. 二次贝塞尔曲线 2. 动画知识 3. 基础自定义view知识 先来解释下什么叫阻尼运动 阻尼振动是指,由于振动系统受到摩擦和介质阻力或其他能耗而使振幅随时间逐渐衰减的振动,又 ...

  6. android自定义虚线,Android自定义view的方式绘制虚线

    Android自定义view绘制虚线 最近项目中有个需求,通过自定义view的方式绘制虚线 别的不多说先看一眼效果 这个需求在我们的开发中应该是一个很常见的需求了吧,有人会说有更简单的实现方式,对,但 ...

  7. Android 自定义View之随机数验证码(仿写鸿洋)

    前言 本文面向自定义view新手,但是希望你最好有一定的理论知识,或基础概念,有的地方可能会一笔带过并不会细讲,细讲篇幅就太长了. 本文仿写自鸿洋的自定义View (一),尽管过去了将近快7年之久,我 ...

  8. android自定义View: 饼状图绘制(四)

    本系列自定义View全部采用kt 系统mac android studio: 4.1.3 kotlin version1.5.0 gradle: gradle-6.5-bin.zip 本篇效果: 画矩 ...

  9. android自定义View: 九宫格解锁

    本系列自定义View全部采用kt 系统:mac android studio: 4.1.3 kotlin version1.5.0 gradle: gradle-6.5-bin.zip 废话不多说,先 ...

最新文章

  1. P3 Simulink仿真-《Matlab/Simulink与控制系统仿真》程序指令总结
  2. 记一次安装docker的坑
  3. 腾讯AI Lab副主任俞栋:语音识别领域的现状与进展
  4. 利用GBDT模型构造新特征具体方法
  5. 自动躲避障碍物,微型蜂鸟机器人靠AI算法飞行
  6. AndroidStudio_从Eclipse到AndroidStudio开发工具_认识使用AndroidStudio_导入用eclipse开发的工程---Android原生开发工作笔记69
  7. 使用lvs实现负载均衡(V2.0)
  8. 刚接触新工作的程序员:直接运行include
  9. 前段基础html常用标签,web前端开发网络课程,HTML常用的五种标签
  10. 黑马JAVA P165 代码与文件编码不一致读取乱码的问题、转换流来解决
  11. 软件测试工程师太累了?
  12. 关于360评估的全面介绍
  13. matlab 球坐标绘图,在Matlab中绘制球坐标系
  14. 微信的WXML和HTML WXSS和CSS的区别详解
  15. 水晶报表(Crystal Report)- 水晶报表常见问题总结
  16. Redis分布式锁-这一篇全了解(Redission实现分布式锁完美方案)
  17. 一图看懂QChart间距
  18. ios上编译c语言的app_CppCode –适用于IOS的免费C / C ++ IDE和编译器
  19. ZigBee定位系统与网络拓扑
  20. 微信小程序登录页php后台,微信小程序php后台登录

热门文章

  1. 外星人入侵游戏python学习_外星人入侵:使用Python开发游戏
  2. STM32毕业设计题目项目汇总 - 100例
  3. VCS命令详解(一):编译命令
  4. 关于getaddrinfo()函数阻塞时间过长的问题
  5. 1454 糖果的游戏
  6. android webview 深度链接,Deeplink(深度链接)是什么?如何做到高效场景还原
  7. 双网卡的正确使用方式
  8. 公务员考试(计算机专业知识),公务员考试计算机专业知识
  9. jQuery Cookie 插件
  10. Unity简单第一人称移动和摄像机旋转