android 非框架 分时图和K线图分时图(三)

最后一层是绘制手势触发的十字线

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;  //分时是否显示十字线


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值