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

本文详细介绍了如何使用canvas绘制竖屏数据视图,并提供了模型转换方法,包括绘制数据线、均线、阴影以及价格文本。重点讨论了如何通过调整数组结构实现数据的正确连接,并附上了模型类的实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有了基础的X、Y轴坐标 现在需要绘制数据了

这里的绘制是用了canvas.drawLines(pts, paint);方法 参数为pts为一个float[] 数组,但是需要注意一下 这个数组的绘图方式,eg:如果单纯的依次写入4个坐标(每个坐标为两个数,x\y) 1,2,3,4.绘制出来的结果为 1连2 3连4 ,2、3之间无连接。所以如果要连接成一条直线 需要数组写入 1,2,2,3,3,4。这样的方式。之后会附上转换方法。

二、TimeShareViewPortrait (竖屏数据视图)

</pre><p><pre name="code" class="java">public class TimeShareViewPortrait extends View
{
	public TimeShareViewPortrait(Context context)
	{
		super(context);
	}

	public TimeShareViewPortrait(Context context, AttributeSet attrs)
	{
		super(context, attrs);
	}

	public TimeShareViewPortrait(Context context, AttributeSet attrs, int defStyle)
	{
		super(context, attrs, defStyle);
	}

	/**
	 * 显示图形界面
	 */
	@Override
	public void onDraw(Canvas canvas)
	{
		super.onDraw(canvas);
		List<TimeShareModel> list = Tool_Line.draw_list;
		draw_Date(canvas,list);
	}
	
	/**
	 * 绘制数据
	 * @param canvas
	 * @param list
	 */
	private void draw_Date(Canvas canvas,List<TimeShareModel> list)
	{
		draw_Line(Tool_Line.pts_price_port,Tool_Line.pts_avg_port, canvas); // 画数据线
		draw_Shader(canvas,list); //绘制阴影
		draw_price(canvas,TimeShareAdapter.getInstance().getPriceY(Tool.commodityid)); // 画坐标价格文本
	}

	/**
	 * 绘制均线
	 * 
	 * @param list
	 * @param canvas
	 * @param paint
	 */
	private void draw_Line(float[] pts_price,float[] pts_avg, Canvas canvas)
	{
		Paint paint = new Paint();
		paint.setAntiAlias(true);
		paint.setStrokeWidth(Tool.strokeWidth);
		Resources res = Main.getInstance().getResources();
		paint.setColor(res.getColor(R.color.yellow));
		canvas.drawLines(pts_avg, paint);
		paint.setColor(res.getColor(R.color.white));
		canvas.drawLines(pts_price, paint);
	}

	/**
	 * 绘制阴影
	 * @param canvas
	 * @param list
	 */
	private void draw_Shader(Canvas canvas,List<TimeShareModel> list)
	{
		Paint paint = new Paint();
		paint.setAntiAlias(true);
		paint.setStrokeWidth(1);
		Resources res = Main.getInstance().getResources();
		paint.setColor(res.getColor(R.color.white));
		paint.setAlpha(70);
		//颜色的渐进 参数为 初始X\Y坐标 终点X\Y坐标 初始颜色 终点颜色 渐进模式 
		LinearGradient lg = new LinearGradient(Tool.startLine_timeshare_port, Tool.bottomLine_timeshare_port,
				Tool.startLine_timeshare_port, 0,res.getColor(R.color.white), Color.BLUE, Shader.TileMode.CLAMP);
		paint.setShader(lg);
		Path path = initPath(list);
		if (path != null)
		{
			canvas.drawPath(path, paint);
		}
	}
	
	/**
	 * 设置阴影路径
	 * 
	 * @param list
	 * @return
	 */
	private Path initPath(List<TimeShareModel> list)
	{
		Path path = new Path();
		if (list != null)
		{
			TimeShareModel model;
			path.moveTo(list.get(0).getxPort(), Tool.bottomLine_timeshare_port);
			for (int i = 0; i < list.size(); i++)
			{
				if (i != list.size() - 1)
				{
					model = list.get(i);
					path.lineTo(model.getxPort(), model.getPriYPort());
				}
			}
			model = list.get(list.size()-1);
			path.lineTo(model.getxPort(),model.getPriYPort());
			path.lineTo(model.getxPort(), Tool.bottomLine_timeshare_port);
			path.close();
		}
		return path;
	}

	/**
	 * 绘制价格文本
	 * @param canvas
	 * @param prices
	 * @param paint
	 */
	private void draw_price(Canvas canvas, String[] prices)
	{
		Paint paint = new Paint();
		paint.setAntiAlias(true);
		paint.setStrokeWidth(Tool.strokeWidth);
		paint.setTextSize(Tool.textSize);
		paint.setTextAlign(Align.RIGHT);
		Resources res = Main.getInstance().getResources();
		
		float diff = Tool.bottomLine_timeshare_port-Tool.topLine_timeshare_port;
		
		for (int i = 0; i < prices.length; i++)
		{
			switch (i)
			{
				case 0:
				case 1:
				case 2:
				{
					paint.setColor(res.getColor(R.color.green));
					break;
				}
				case 3:
				{
					paint.setColor(res.getColor(R.color.white));
					break;
				}
				case 4:
				case 5:
				case 6:
				{
					paint.setColor(res.getColor(R.color.red2));
					break;
				}
				default:
					break;
			}
			canvas.drawText(prices[i], Tool.startLine_timeshare_port,Tool.topLine_timeshare_port + (6-i)*diff/6-3, paint);
		}
	}
}


这里 附上model转化为float[] 方法:这个方法在Tool中 通过这个方法可以得到 上边的两个数据数组pts_price_port 和 pts_avg_port

/**
	 *  将数据转化为绘图用的数组
	 */
	private static void getPts(List<TimeShareModel> list)
	{
		TimeShareModel t = null;
		float x_port = 0,x_land=0;
		float y_avg_port = 0,y_price_port=0 ;
		float y_avg_land = 0,y_price_land = 0;
		if(list!=null && list.size()!=0)
		{
			if(list.size()==1)
			{
				pts_price_port = new float[2];
				pts_avg_port = new float[2];
				pts_price_land = new float[2];
				pts_avg_land = new float[2];
			}else
			{
				pts_price_port = new float[(list.size()-1)*4];
				pts_avg_port = new float[(list.size()-1)*4];
				pts_price_land = new float[(list.size()-1)*4];
				pts_avg_land = new float[(list.size()-1)*4];
			}
			
			for (int i = 0; i < list.size(); i++) // 画折线
			{
				t = list.get(i);
				x_port = t.getxPort();
				x_land = t.getxLand();
				y_avg_port = t.getAvgYPort();
				y_avg_land = t.getAvgYLand();
				y_price_port = t.getPriYPort();
				y_price_land = t.getPriYLand();
				if(i==0)
				{
					pts_price_port[0]=x_port;
					pts_price_port[1]=y_price_port;
					pts_avg_port[0]=x_port;
					pts_avg_port[1]=y_avg_port;
					pts_price_land[0]=x_land;
					pts_price_land[1]=y_price_land;
					pts_avg_land[0]=x_land;
					pts_avg_land[1]=y_avg_land;
				}else if(i==list.size()-1)
				{
					pts_price_port[pts_price_port.length-2] = x_port;
					pts_price_port[pts_price_port.length-1] = y_price_port;
					pts_avg_port[pts_avg_port.length-2] = x_port;
					pts_avg_port[pts_avg_port.length-1] = y_avg_port;
					pts_price_land[pts_price_land.length-2] = x_land;
					pts_price_land[pts_price_land.length-1] = y_price_land;
					pts_avg_land[pts_avg_land.length-2] = x_land;
					pts_avg_land[pts_avg_land.length-1] = y_avg_land;
				}else
				{
					pts_price_port[i*4-2] = x_port;
					pts_price_port[i*4-1] = y_price_port;
					pts_price_port[i*4] = x_port;
					pts_price_port[i*4+1] = y_price_port;
					pts_avg_port[i*4-2] = x_port;
					pts_avg_port[i*4-1] = y_avg_port;
					pts_avg_port[i*4] = x_port;
					pts_avg_port[i*4+1] = y_avg_port;
					
					pts_price_land[i*4-2] = x_land;
					pts_price_land[i*4-1] = y_price_land;
					pts_price_land[i*4] = x_land;
					pts_price_land[i*4+1] = y_price_land;
					pts_avg_land[i*4-2] = x_land;
					pts_avg_land[i*4-1] = y_avg_land;
					pts_avg_land[i*4] = x_land;
					pts_avg_land[i*4+1] = y_avg_land;
				}
			}
		}else
		{
			pts_price_port = new float[0];
			pts_avg_port = new float[0];
			pts_price_land = new float[0];
			pts_avg_land = new float[0];;
		}
	}
最后附上 model

public class TimeShareModel
{
	private String date;//日期 yyyy-mm-dd hh:mm:ss
	private String priceStr = "--";//当前价的格式化str,用于显示
	private String avgStr = "--";//均价的格式化str,用于显示
	private double price;//当前价
	private double avg;//均价
	private float xPort;//对应竖屏的x坐标
	private float avgYPort;//对应竖屏的均价Y
	private float priYPort;//对应竖屏的当前价Y
	private float xLand;//对应横屏的x坐标
	private float avgYLand;//对应横屏的均价Y
	private float priYLand;//对应横屏的当前价Y
	private String change;//涨跌幅
	private int upOrDown = 0;//涨1/跌-1/平0
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值