安卓炫酷柱状图开发

话不多说先效果图,关于如何画椭圆,画直线了,也就一行代码,难度不大,难度最大是要如何排版,计算每个子图的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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值