android-风力风向图
2015-10-10 10:42
393 查看
最近在做气象方面的项目,其中会用到折线图的效果,但是风力风向的就没有现成的控件,代码也很简单,所以就自己写了一下
代码如下:
效果图:
也可以加点动画效果,这里就不写了
代码如下:
import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.RectF; import android.util.Log; import android.view.MotionEvent; import android.view.View; import android.widget.Toast; /** * * 风力风向图 * */ public class LineCharView extends View { private Context mContext; public int xOrigin;// x原点 public int yOrigin;// y原地 public int xLenght;// x轴长 public int yLenght;// y轴长 public int xScale;// x刻度 public int yScale;// y刻度 public String[] xData;// x轴值 public String[] yData;// y轴值 public String[] Data;// 数据 public String Title;// 标题 private int[] Xbitmaps;// 风向x private int[] Ybitmaps;// 风向Y private int bitmapsLenght; private Paint paint; private Bitmap bitmap;// 风向图标 private int[] FX;//风向 private int[] FL;//风力 private int xS;//x刻度数 private int yS;//y刻度数 // private int xDialog = -1; // private int yDialog = -1; public LineCharView(Context context) { super(context); this.mContext = context; } public void setLineCharViewInfo(int xOrigin, int yOrigin, int xLenght, int yLenght, int xScale, int yScale, String[] xData, String[] yData, String[] Data, String Title, int bitmapsLenght,int[] FX,int[] FL) { this.xOrigin = xOrigin; this.yOrigin = yOrigin; this.xLenght = xLenght; this.yLenght = yLenght; this.xScale = (int)xLenght/xScale; this.yScale = (int)yLenght/yScale; this.xData = xData; this.yData = yData; this.Title = Title; this.bitmapsLenght = bitmapsLenght; this.FX = FX; this.FL = FL; this.xS = xScale; this.yS = yScale; } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); paint = new Paint(); paint.setStyle(Paint.Style.STROKE); paint.setColor(Color.BLUE); paint.setAntiAlias(true); paint.setTextSize(20); canvas.drawLine(xOrigin, yOrigin - yLenght, xOrigin, yOrigin, paint);//x轴 canvas.drawLine(xOrigin, yOrigin, xOrigin + xLenght, yOrigin, paint);//y轴 for (int i = 0; i * yScale < yLenght; i++) { // if (i > 0) { // PathEffect effects = new DashPathEffect(new float[] { 5, 5, 5, 5 }, 1);// 画虚线 // paint.setPathEffect(effects); if (i < yS) { paint.setColor(Color.GRAY); canvas.drawLine(xOrigin, yOrigin - i * yScale, xOrigin + xLenght, yOrigin - i * yScale, paint); } paint.setColor(Color.BLUE); canvas.drawText(yData[i], xOrigin - 40, yOrigin - i * yScale + 5, paint); // } } canvas.drawLine(xOrigin, yOrigin - yLenght, xOrigin - 5, yOrigin - yLenght + 10, paint);//箭头 canvas.drawLine(xOrigin, yOrigin - yLenght, xOrigin + 5, yOrigin - yLenght + 10, paint); Xbitmaps = new int[bitmapsLenght]; Ybitmaps = new int[bitmapsLenght]; for (int i = 0; i * xScale < xLenght; i++) { if (i < xS) { paint.setColor(Color.GRAY); canvas.drawLine(xOrigin + i * xScale, yOrigin, xOrigin + i * xScale, yOrigin - yLenght, paint); } paint.setColor(Color.BLUE); canvas.drawText(xData[i], xOrigin + i * xScale - 5, yOrigin + 30, paint); if (i < xS) { int bit = FX[i]; int y = FL[i]; //根据风向的值设置不同的图片显示,风向有8个方向 if (bit == 1) { bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.a1); } else if (bit == 2) { bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.a2); } else if (bit == 3) { bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.a3); } else if (bit == 4) { bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.a4); }else if (bit == 5) { bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.a2); } else if (bit == 6) { bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.a3); } else if (bit == 7) { bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.a4); } else if (bit == 8) { bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.a4); } canvas.drawBitmap(bitmap, xOrigin + i * xScale - 10, yOrigin - y, paint); Xbitmaps[i] = xOrigin + i * xScale - 8; Ybitmaps[i] = yOrigin - y; } } /*if (xDialog != -1) { RectF rectF = new RectF(xDialog-10, yDialog-100, xDialog+120, yDialog-50); canvas.drawRect(rectF, paint); canvas.drawLine(xDialog-10, yDialog-50, xDialog-15, yDialog+10, paint); canvas.drawText("X:"+xDialog+"\nY:"+yDialog, xDialog, yDialog-70, paint); }*/ canvas.drawLine(xOrigin + xLenght, yOrigin, xOrigin + xLenght - 10, yOrigin - 5, paint); canvas.drawLine(xOrigin + xLenght, yOrigin, xOrigin + xLenght - 10, yOrigin + 5, paint); paint.setColor(Color.BLUE); paint.setTextSize(26); canvas.drawText(Title, xOrigin + xLenght / 3, yOrigin + 60, paint); } @Override public boolean onTouchEvent(final MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { Log.d("TAG", "ACTION_DOWN" + event.getX() + "--" + event.getY()); int checkBitmapClick = CheckBitmapClick(event.getX(), event.getY()); // xDialog = (int)event.getX(); // yDialog = (int)event.getY(); if (checkBitmapClick > -1) { // Toast.makeText(mContext, checkBitmapClick + ":checkBitmapClick", Toast.LENGTH_LONG).show(); new AlertDialog.Builder(mContext).setTitle(Title) .setMessage("x:" + event.getX() + "\ny:" + event.getY()+"\n风向:"+FX[checkBitmapClick]+"\n风力:"+FL[checkBitmapClick]).setNegativeButton("no", null) .setPositiveButton("ok", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //invalidate(); } }).show(); } } return true; } private int CheckBitmapClick(float DownX, float DownY) { for (int j = 0; j < Ybitmaps.length; j++) { for (int i = 0; i < Xbitmaps.length; i++) {//判断点击的范围是否是风向图片的范围内 if ((Xbitmaps[i] <= (int) DownX && (int) DownX <= Xbitmaps[i] + 32) && (Ybitmaps[j] <= (int) DownY && (int) DownY <= Ybitmaps[j] + 32)) { Log.d("TAG", "CheckBitmapClick" + DownX + "--" + DownY+"--"+Xbitmaps[i]+"---"+Ybitmaps[j]); return i; } } } return -1; } }调用:
import android.os.Bundle; import android.app.Activity; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); LineCharView lineCharView = new LineCharView(this); lineCharView.setLineCharViewInfo(60, 400, 580, 380, 7, 6, new String[] { "1", "2", "3", "4", "5", "6", "7", "day"}, new String[] { "","50", "100", "150", "200", "250","km/h"}, new String[] { "1", "2", "3", "4", "5", "6", "7", ""}, "LineCharView",12,new int[]{1,2,3,1,3,4,6},new int[]{50,200,50,30,60,140,150}); setContentView(lineCharView); } }
效果图:
也可以加点动画效果,这里就不写了
相关文章推荐
- 开始写点东西
- android上传图片至服务器
- Android_显示器本身被卸载应用程序
- 【Android布局】在程序中设置android:gravity 和 android:layout_Gravity属性
- android 调用系统电话功能
- 汇聚各种android开源项目源码分类总汇-IT蓝豹
- 【Android实战】用ViewPager偏移看到下一页部分内容
- Android - 应用程序AndroidManifest Application节点介绍
- Android源代码工程环境搭建
- Android Studio设置界面风格和字体大小
- Android源码编译
- Android 代码重构
- Android之发送短信的两种方式
- C#开发Android应用之小试牛刀(一)
- Android实现FM收音机
- android 中导入外部jar包出错(找不到)
- Android源码学习初步
- Android全局捕获崩溃异常记录日志保存至本地并定时删除
- Android中RelativeLayout各个属性
- Android新增一个emmc 上层的实现