当前位置: 移动技术网 > IT编程>移动开发>Android > Android自定义view实现车载可调整轨迹线

Android自定义view实现车载可调整轨迹线

2019年07月23日  | 移动技术网IT编程  | 我要评论

soundhound是什么,看台搭建,地理地图

本文实例为大家分享了android自定义view完成车载可调整轨迹线的具体代码,供大家参考,具体内容如下

同事做的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;
 }
 
 @override
 protected 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();
 }
 
 
 @override
 public boolean ontouchevent(motionevent event) {
 // todo auto-generated method stub
 float 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);
 }
 
 
 @override
 public void onclick(view v) {
 }
 
 
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网