zoukankan      html  css  js  c++  java
  • 28 自定义View画坐标和柱状图

    这里写图片描述

    • 自定义View类
      RectView.java
    package com.qf.sxy.day29_customview.widget;
    
    import android.content.Context;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Paint;
    import android.util.AttributeSet;
    import android.view.View;
    
    /**
     * Created by sxy on 2016/9/29.
     */
    public class RectView extends View {
    
        private Paint mPaint;
    
        //设置条形图的 间距和宽度
        private int rectSpace = 50;
        private int rectWith = 50;
    //必须是所有的柱状图高度的最大公约数以下的约数 否则余数高度无法画出
        private int times = 50;//设置走多少次
        private int current = 0;//当前走的次数
    
        //数据   条状态图的高度  颜色
        private int[][]rectArray ={{500,Color.YELLOW},{200,Color.RED},{350,Color.BLACK},{250,Color.GREEN}};
    
        public RectView(Context context, AttributeSet attrs) {
            super(context, attrs);
            //初始化画笔对象
            initPaint();
        }
    
        private void initPaint() {
            mPaint = new Paint();
            mPaint.setAntiAlias(true);
            mPaint.setColor(Color.BLACK);
            mPaint.setStrokeWidth(3);
        }
    
        public RectView(Context context) {
            this(context,null);
        }
    
    
        /**
         * 绘制  条形统计图
         * @param canvas
         */
        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
    
            //画坐标点
            canvas.drawCircle(50,getHeight()-50,2,mPaint);
    
            //画x轴
            canvas.drawLine(50,getHeight()-50,getWidth()-50,getHeight()-50,mPaint);
    
            //画Y轴
            canvas.drawLine(50,getHeight()-50,50,50,mPaint);
    
            //画Y轴箭头
            canvas.drawLine(50,50,25,75,mPaint);
            canvas.drawLine(50,50,75,75,mPaint);
    
            //绘制条形图   n 条
            for(int i=0;i<rectArray.length;i++){
    
                //条形图 左边
                int left = rectSpace +(rectSpace+rectWith)*i;
                //获取顶部位置
                int top = rectArray[i][0]/times*current;
                //重新设置颜色
                mPaint.setColor(rectArray[i][1]);
                //绘制条形图
                canvas.drawRect(left+50,getHeight()-top-50,left+50+rectWith,getHeight()-50,mPaint);
    
    
            }
    //        效果让其柱状图慢慢上升
            current++;
            if(current<times){
                invalidate();//刷新
            }
    
    
        }
    }
    

    activity_main.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context="com.qf.sxy.day29_customview.MainActivity">
    
        <com.qf.sxy.day29_customview.widget.RectView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
             />
    </RelativeLayout>
    
  • 相关阅读:
    SDK Hello world(直接使用SDK封装)
    一个类有多个基类的内存布局
    写个测试程序看看磁盘映像文件中哪个扇区可以使用?
    在服务中以当前用户身份启动一个程序
    在类有成员变量的场景下, 按照虚表原理, 模拟虚函数实现
    pipe----管道
    Qt序列化格式分析(qint,QString)(非常简单好用)
    模拟QQ系统设置面板实现功能
    Qt持久性对象进行序列化(同时比较了MFC与Java的方法)
    使用srvany.exe将任何程序作为Windows服务运行
  • 原文地址:https://www.cnblogs.com/muyuge/p/6152166.html
Copyright © 2011-2022 走看看