有了基础的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
}