最后一层是绘制手势触发的十字线
public class TimeShareViewCrossPortrait extends View
{
private float x = -1, y = -1; //手势坐标
// private float width = 0, height = 0;
private long start_time = 0; //手势开始时间
private long stop_time = 0; //手势结束时间
public TimeShareViewCrossPortrait(Context context)
{
super(context);
}
public TimeShareViewCrossPortrait(Context context, AttributeSet attrs)
{
super(context, attrs);
}
public TimeShareViewCrossPortrait(Context context, AttributeSet attrs, int defStyle)
{
super(context, attrs, defStyle);
}
/**
* 显示图形界面
*/
@Override
public void onDraw(Canvas canvas)
{
super.onDraw(canvas);
if(Tool.isShow_tsl && Tool_Line.index != -1)
{
List<TimeShareModel> list =Tool_Line.draw_list;
if(list!=null && list.size()!=0)
{
drawCross(canvas,Tool_Line.index,list);
}
}
}
/**
* 绘制十字线
* @param canvas
* @param index
* @param list
*/
private void drawCross(Canvas canvas,int index,List<TimeShareModel> list)
{
Tool_Line.setTimeSareText(index); //更新数据
x = list.get(index).getxPort();
y = list.get(index).getPriYPort();
if (x != -1 && y != -1 && Tool.isShow_tsl)
{
//设定画笔
Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setStrokeWidth(2);
paint.setColor(Main.getInstance().getResources().getColor(R.color.cross_color));
PathEffect effects = new DashPathEffect(new float[] { 5, 5, 5, 5 }, 1);
paint.setPathEffect(effects);
paint.setStyle(Paint.Style.STROKE);
//设定路径
Path path_height = new Path();
path_height.moveTo(x, 0);
path_height.lineTo(x, Tool_Line.view_height); //画横线
canvas.drawPath(path_height, paint);
Path path_width = new Path();
path_width.moveTo(0, y);
path_width.lineTo(Tool_Line.view_width, y); //画竖线
canvas.drawPath(path_width, paint);
}
}
/**
* 二分法距离手势x获取最近的点坐标
* @param x
* @return
*/
private int getPointX(float x)
{
List<TimeShareModel> list = Tool_Line.draw_list;
int left = 0 ;
int right = 0;
if(list != null && list.size() > 0)
{
for (right = list.size() - 1; left != right;)
{
int midIndex = (right + left) / 2; //获得中间值
int diff = (right - left);
float midValue = list.get(midIndex).getxPort();
if (x == midValue)
{
return midIndex;
}
if (x > midValue)
{
left = midIndex;
} else
{
right = midIndex;
}
if (diff <= 2)
{
break;
}
}
if((list.get(right).getxPort()+list.get(left).getxPort())/2 < x)
{
return right;
}else
{
return left;
}
}
return 0;
}
@Override
public boolean onTouchEvent(MotionEvent event)
{
if(Tool_Line.draw_list!=null&&Tool_Line.draw_list.size()!=0)
{
switch (event.getAction())
{
case MotionEvent.ACTION_DOWN:
{
start_time = System.currentTimeMillis(); //按下时设定起始时间
break;
}
case MotionEvent.ACTION_MOVE:
{
if (Tool.isShow_tsl) //显示十字线的时候,才进行操作
{
long move_time = System.currentTimeMillis();
if (move_time > start_time + 300)
{
Tool_Line.index = getPointX(event.getX());
Tool_Line.setTimeSareText(Tool_Line.index); //变更数据
this.invalidate();
}
}
break;
}
case MotionEvent.ACTION_UP:
{
stop_time = System.currentTimeMillis(); //捕获结束时间
long diff = stop_time - start_time; //操作间隔
if (diff < 1000)
{
x = event.getX();
y = event.getY();
if (Tool.isShow_tsl)
{
Tool.isShow_tsl = false;
if(Tool_Line.draw_list != null && Tool_Line.draw_list.size() != 0)
{
Tool_Line.setTimeSareText(Tool_Line.draw_list.size()-1); //更新数据
}
} else
{
Tool.isShow_tsl = true;
Tool_Line.index = getPointX(x);
}
this.invalidate();
}
break;
}
}
}
return true;
}
}
附上一些有用的变量
public static boolean isShow_tsl = false; //分时是否显示十字线