安卓炫酷柱状图开发
来源:互联网 发布:深入浅出node.js mobi 编辑:程序博客网 时间:2024/06/16 16:15
话不多说先效果图,关于如何画椭圆,画直线了,也就一行代码,难度不大,难度最大是要如何排版,计算每个子图的left,top,right,bottom,这就需要有点数学功底了
下面来看自定义VIEW
2.需要重写两个方法,onSizeChange和onDraw方法,这里是不需要重写onMeasure方法的,因为这个自定义View的视图大小没有发生改变,但是如果需要也是可以重写的。
自定义的View中三个最重要的方法解释:
onMeasure可以得到并控制本身和子View的大小
onSizeChange可以得到自身视图View的大小
onDraw绘制视图View的具体实现
public class HistogramCharView extends View { private int mWidth; private int mHeight; private Paint mPaint; private int paintColors; private List<Integer> listNumber = new ArrayList<Integer>(); private List<String> listRange = new ArrayList<String>(); private List<Integer> listColors = new ArrayList<Integer>(); private String name; public HistogramCharView(Context context) { this(context, null); } public HistogramCharView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public HistogramCharView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } private void init() { mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); mPaint.setStrokeWidth(2f); mPaint.setColor(Color.WHITE); setBackgroundColor(Color.BLACK); } public void setData(List<Integer> listNumber) { this.listNumber.clear(); this.listNumber.addAll(listNumber); this.listRange.clear(); //initNumber(); listRange.add("水分含量%"); listRange.add("温度状况°C"); listRange.add("植物高度h"); listColors.add(0xFF185be2); listColors.add(0xFFea3d08); listColors.add(0xFF26de9a); postInvalidate(); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); drawBackGroudLines(canvas); //画矩形图 drawRectFView(canvas); } //画矩形图 private void drawRectFView(Canvas canvas) { mPaint.setColor(paintColors); float pointWidth = (mWidth)/7f; float pointHeight = (float) (mHeight-20) / 100f; //绘制文字 mPaint.setTextSize(30); mPaint.setColor(0xFF00fffd); for (int i = 0; i < 11; i++) { String text = i * 10 + ""; canvas.drawText(text, 10, mHeight+10 - i * 10 * pointHeight, mPaint); } //绘制虚线 for (int i = 0; i < 11; i++) { mPaint.setStyle(Paint.Style.STROKE);//空心 mPaint.setColor(0xFF00fffd); //画笔颜色 Path path = new Path(); //路径 path.moveTo(70, mHeight - i * 10 * pointHeight); //画笔起点位置点 d path.lineTo(mWidth, mHeight - i * 10 * pointHeight); //画笔终点位置点 //使用DashPathEffect来创建一个虚线的轮廓(短横线/小圆点),而不是使用实线 //float[] { 5, 5, 5, 5 }值控制虚线间距,密度 PathEffect effects = new DashPathEffect(new float[]{3, 3, 3, 3}, 1); mPaint.setPathEffect(effects); canvas.drawPath(path, mPaint); } //画完虚线后再设置一下画笔 mPaint.setColor(paintColors); mPaint.setStyle(Paint.Style.STROKE);//空心 for (int i = 0; i < listNumber.size(); i++) { mPaint.setColor(0xFF62666c); mPaint.setStyle(Paint.Style.STROKE);//空心 mPaint.setTextSize(50); float left=pointWidth*(i*2+1); float right=pointWidth+left; canvas.drawRoundRect(left, 20, right, mHeight,20,20 ,mPaint); mPaint.setColor(0xaF00fffd); mPaint.setTextSize(30); mPaint.setStyle(Paint.Style.FILL); canvas.drawRoundRect(left, pointHeight*(100-listNumber.get(i))+20, right,mHeight,20, 20, mPaint); canvas.drawText(String.valueOf(listRange.get(i)), left+(pointWidth-150)/2f, getHeight()-10, mPaint); canvas.drawText(String.valueOf(listNumber.get(i)), left+(pointWidth-40)/2f, pointHeight*(100-listNumber.get(i))-3, mPaint); } } private void drawBackGroudLines(Canvas canvas) { //背景颜色 mPaint.setColor(0xFF373d4a); canvas.drawRect(0, 0, mWidth, getHeight(), mPaint); mPaint.setColor(0xFF00fffd); canvas.drawLine(70, 0, 70, mHeight, mPaint); canvas.drawLine(70, mHeight, mWidth, mHeight, mPaint); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); mWidth = getWidth(); mHeight = getHeight() - 40; }}
接下来的是布局文件
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/activity_main3"android:layout_width="match_parent"android:layout_height="match_parent" android:orientation="vertical" android:background="#373d4a"tools:context="com.example.andream.learnone.Main3Activity"><com.example.andream.learnone.HistogramCharView android:layout_width="match_parent" android:layout_height="300dp" android:layout_marginTop="20dp" android:id="@+id/histogramCharView"/> <TextView android:layout_width="wrap_content" android:text="植物生长状况" android:textSize="18sp" android:layout_marginTop="20dp" android:layout_gravity="center" android:textColor="#00fffd" android:layout_height="wrap_content" /> <Button android:layout_width="match_parent" android:layout_height="50dp" android:layout_marginTop="100dp" android:background="#00fffd" android:text="数据改变" android:layout_gravity="bottom" android:onClick="close" /></LinearLayout>
接下来的是主界面代码
public class Main3Activity extends AppCompatActivity {private HistogramCharView histogramCharView; private List<Integer> datas; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main3); datas = new ArrayList<Integer>(); datas.add(46); datas.add(34); datas.add(13); // 画笔颜色的数组 int paintColor = 0xFF26de9a; histogramCharView = (HistogramCharView) findViewById(R.id.histogramCharView); histogramCharView.setData(datas); } //关闭页面 public void close(View view) { datas.clear(); datas.add(64); datas.add(25); datas.add(30); // 画笔颜色的数组 int paintColor = 0xFF26de9a; histogramCharView.setData(datas); }}
就这样就实现了,大家慢慢研究吧,一定也可以画出根据好看的图像
参考 :http://blog.csdn.net/wenzhi20102321/article/details/66971269
阅读全文
0 0
- 安卓炫酷柱状图开发
- jfreechart 柱状图 开发实例
- jCharts 柱状图开发实例
- IOS开发-画饼图画柱状图
- MPAndroidChart之柱状图开发总结
- iOS Charts 混合柱状图开发
- iOS Charts 混合柱状图开发
- 柱状图
- 柱状图
- 柱状图
- 柱状图
- 柱状图
- 柱状图
- 柱状图
- 柱状图
- 柱状图
- 柱状图
- JFreeChart开发Web图形报表(柱状图)
- 从输入 URL 到页面加载完成的过程中都发生了什么事情?
- 如何用QuickBI制作图表联动的销售报表
- web开发常用插件总结
- Java反射 类类型就是可以操作的类本身 如何通过反射得到函数 函数返回值 函数参数
- 用_beginthreadex不用 CreateThread
- 安卓炫酷柱状图开发
- c 迷惑2
- 线程同步
- linux 配置虚拟主机
- 【Swift学习】闭包(Closure)
- 局部变量 局部静态变量 全局变量
- mac 电脑Apache php MySQL安装
- \\和/
- PAT 1020月饼