課程
/移動開發
/Android
/Android圖表繪制之直方圖
我運行起來后,不報錯,但什么內容都沒有。
2019-07-15
源自:Android圖表繪制之直方圖 3-8
正在回答
沒有用啊,一直說空對象
下面是直方圖自定義控件代碼(直接繼承view,沒有寫BaseView。運行效果如上圖):
已解決,成功運行出來了。
舉報
Android圖表繪制技術實戰
1 回答Android圖表設計用什么軟件?
1 回答MekeChart類沒有
1 回答maxAxisValueY沒講怎么定義,就用了
2 回答mukeChart.java創建過程沒有 ,課程不完整
1 回答從第三章的完善那一節開始 MukeChart.java 的建立過程沒有???
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號-11 京公網安備11010802030151號
購課補貼聯系客服咨詢優惠詳情
慕課網APP您的移動學習伙伴
掃描二維碼關注慕課網微信公眾號
2019-07-25
沒有用啊,一直說空對象
2019-07-15
下面是直方圖自定義控件代碼(直接繼承view,沒有寫BaseView。運行效果如上圖):
package com.xie.com.imoocmusic.views;import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.nfc.FormatException;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import com.alibaba.fastjson.JSON;
import com.xie.com.imoocmusic.R;
public class HistogramView extends View {
? ?private String mHistogramTitle;
? ?private String mXAxisName;
? ?private String mYAxisName;
? ?private float mAxisTextSize;
? ?private int mAxisTextColor;
? ?private Paint paint;
? ?private Context mContext;
? ?private int width; ?//視圖寬
? ?private int height; //視圖高
? ?private int originalX = 100; //起點的X軸坐標值
? ?private int originalY = 800; //起點的Y軸坐標值
? ?private int axisDividedSizeX; //X軸等份
? ?private int axisDividedSizeY; //Y軸等份
? ?private float maxAxisValueY; //Y軸最大值
? ?private float maxAxisValueX; //X軸最大值
? ?public int[][] columnInfo; //二位數組,一維為值,二維為顏色
? ?public HistogramView(Context context) {
? ? ? ?super(context,null);
? ? ? ?init(context,null);
? ?}
? ?public HistogramView(Context context, AttributeSet attrs) {
? ? ? ?super(context, attrs,-1);
? ? ? ?init(context,attrs);
? ?}
? ?public HistogramView(Context context, AttributeSet attrs, int defStyle) {
? ? ? ?super(context, attrs, defStyle);
? ? ? ?init(context,attrs);
? ?}
? ?private void init(Context context, AttributeSet attrs) {
? ? ? ?mContext = context;
? ? ? ?//獲取直方圖自定義樣式
? ? ? ?TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.HistogramStyle);
? ? ? ?mHistogramTitle = typedArray.getString(R.styleable.HistogramStyle_histogramTitle);
? ? ? ?mXAxisName = typedArray.getString(R.styleable.HistogramStyle_xAxisName);
? ? ? ?mYAxisName = typedArray.getString(R.styleable.HistogramStyle_yAxisName);
? ? ? ?mAxisTextSize = typedArray.getDimension(R.styleable.HistogramStyle_axisTextSize,12);
? ? ? ?mAxisTextColor = typedArray.getColor(R.styleable.HistogramStyle_axisTextColor,context.getResources().getColor(R.color.infoColor));
? ? ? ?if (typedArray != null){
? ? ? ? ? ?typedArray.recycle();
? ? ? ?}
? ? ? ?initPaint();
? ?}
? ?@Override
? ?protected void onDraw(Canvas canvas) {
? ? ? ?super.onDraw(canvas);
? ? ? ?width = getWidth() - originalX;
? ? ? ?height = (originalY > getHeight() ? getHeight():originalY)-300;
? ? ? ?drawXAxis(canvas,paint);
? ? ? ?drawYAxis(canvas,paint);
? ? ? ?drawHistogramTitle(canvas,paint);
? ? ? ?drawXAxisScale(canvas,paint);
? ? ? ?drawXAxisScaleValue(canvas,paint);
? ? ? ?drawYAxisScale(canvas,paint);
? ? ? ?drawYAxisScaleValue(canvas,paint);
? ? ? ?drawXAxisArrow(canvas,paint);
? ? ? ?drawYAxisArrow(canvas,paint);
? ? ? ?drawColumn(canvas,paint);
? ?}
? ?/**
? ? * 初始化畫筆
? ? */
? ?private void initPaint() {
? ? ? ?if (paint ==null ){
? ? ? ? ? ?paint = new Paint();
? ? ? ? ? ?paint.setDither(true);
? ? ? ? ? ?paint.setAntiAlias(true);
? ? ? ?}
? ?}
? ?/**
? ? * 畫中間直方圖,抽象方法,由其子類實現
? ? * @param canvas
? ? * @param paint
? ? */
? ?private void drawColumn(Canvas canvas, Paint paint){
? ? ? ?if (columnInfo!=null){
? ? ? ? ? ?float cellWidth = width/maxAxisValueX;
? ? ? ? ? ?for (int i=0;i<columnInfo.length;i++){
? ? ? ? ? ? ? ?paint.setColor(columnInfo[i][1]);
? ? ? ? ? ? ? ?float leftTopY = originalY-height*(columnInfo[i][0])/axisDividedSizeY;
? ? ? ? ? ? ? ?canvas.drawRect(originalX+cellWidth*(i+1),leftTopY,originalX+cellWidth*(i+2),originalY,paint);
? ? ? ? ? ?}
? ? ? ?}
? ?}
? ?/**
? ? * 畫Y軸箭頭,兩條直線相交
? ? * @param canvas
? ? * @param paint
? ? */
? ?private void drawYAxisArrow(Canvas canvas, Paint paint) {
? ? ? ?Path mPathY = new Path();
? ? ? ?mPathY.moveTo(originalX,originalY-height-30);
? ? ? ?mPathY.lineTo(originalX-10,originalY-height);
? ? ? ?mPathY.lineTo(originalX+10,originalY-height);
? ? ? ?mPathY.close();
? ? ? ?canvas.drawPath(mPathY,paint);
? ? ? ?canvas.drawText(mYAxisName,originalX-50,originalY-height-30,paint);
? ?}
? ?/**
? ? * 畫X軸箭頭,兩條直線相交
? ? * @param canvas
? ? * @param paint
? ? */
? ?private void drawXAxisArrow(Canvas canvas, Paint paint) {
? ? ? ?Path mPathX = new Path();
? ? ? ?mPathX.moveTo(originalX+width+10,originalY);
? ? ? ?mPathX.lineTo(originalX+width-20,originalY+10);
? ? ? ?mPathX.lineTo(originalX+width-20,originalY-10);
? ? ? ?mPathX.close();
? ? ? ?canvas.drawPath(mPathX,paint);
? ? ? ?canvas.drawText(mXAxisName,originalX+width-20,originalY+50,paint);
? ?}
? ?/**
? ? * 畫直方圖title
? ? * @param canvas
? ? * @param paint
? ? */
? ?private void drawHistogramTitle(Canvas canvas, Paint paint) {
? ? ? ?if (!TextUtils.isEmpty(mHistogramTitle)){
? ? ? ? ? ?paint.setTextSize(mAxisTextSize);
? ? ? ? ? ?paint.setColor(mAxisTextColor);
? ? ? ? ? ?paint.setFakeBoldText(true);
? ? ? ? ? ?canvas.drawText(mHistogramTitle,(getWidth()/2)-(paint.measureText(mHistogramTitle))/2,originalY+100,paint); ?//設置并固定顯示位置
? ? ? ?}
? ?}
? ?/**
? ? * 畫Y軸刻度值,抽象方法,由其子類實現
? ? * @param canvas
? ? * @param paint
? ? */
? ?private void drawYAxisScaleValue(Canvas canvas, Paint paint) {
? ? ? ?float cellHeight = height/axisDividedSizeY;
? ? ? ?float cellValueY = maxAxisValueY/axisDividedSizeY;
? ? ? ?for (int i=0;i<axisDividedSizeY;i++){
? ? ? ? ? ?canvas.drawText(cellValueY*i+"",originalX-30,originalY-cellHeight*i+10,paint);
? ? ? ?}
? ?}
? ?/**
? ? * 畫Y軸刻度,抽象方法,由其子類實現
? ? * @param canvas
? ? * @param paint
? ? */
? private void drawYAxisScale(Canvas canvas, Paint paint) {
? ? ? ?float cellHeight = height/axisDividedSizeY;
? ? ? ?for (int i=0;i<axisDividedSizeY;i++){
? ? ? ? ? ?canvas.drawLine(originalX,(originalY-cellHeight*(i+1)),originalX+10,(originalY-cellHeight*(i+1)),paint);
? ? ? ?}
? ?}
? ?/**
? ? * 畫X軸刻度值,抽象方法,由其子類實現
? ? * @param canvas
? ? * @param paint
? ? */
? ?private void drawXAxisScaleValue(Canvas canvas, Paint paint) {
? ? ? ?paint.setColor(Color.GRAY);
? ? ? ?paint.setTextSize(16);
? ? ? ?paint.setFakeBoldText(true);
? ? ? ?float cellWidth = width/axisDividedSizeX;
? ? ? ?for (int i=0;i<axisDividedSizeX;i++){
? ? ? ? ? ?if (i>7){
? ? ? ? ? ? ? ?break;
? ? ? ? ? ?}
? ? ? ? ? ?canvas.drawText(i+"",cellWidth*i+originalX-10,originalY+30,paint);
? ? ? ?}
? ?}
? ?/**
? ? * 畫X軸刻度,抽象方法,由其子類實現
? ? * @param canvas
? ? * @param paint
? ? */
? ?private void drawXAxisScale(Canvas canvas, Paint paint) {
? ? ? ?float cellWidth = width/axisDividedSizeX;
? ? ? ?for (int i=0;i<axisDividedSizeX-1;i++){
? ? ? ? ? ?if (i>6){
? ? ? ? ? ? ? ?break;
? ? ? ? ? ?}
? ? ? ? ? ?canvas.drawLine(cellWidth*(i+1)+originalX,originalY,cellWidth*(i+1)+originalX,originalY-10,paint);
? ? ? ?}
? ?}
? ?/**
? ? * 畫Y軸,抽象方法,由其子類實現
? ? * @param canvas
? ? * @param paint
? ? */
? ?private void drawYAxis(Canvas canvas, Paint paint) {
? ? ? ?paint.setColor(Color.BLUE);
? ? ? ?paint.setStrokeWidth(5);
? ? ? ?canvas.drawLine(originalX,originalY,originalX,originalY-height,paint);
? ?}
? ?/**
? ? * 畫X軸
? ? * @param canvas
? ? * @param paint
? ? */
? ?private void drawXAxis(Canvas canvas, Paint paint) {
? ? ? ?paint.setColor(Color.BLACK);
? ? ? ?paint.setStrokeWidth(5);
? ? ? ?canvas.drawLine(originalX,originalY,originalX+width,originalY,paint);
? ?}
? ?public void setColumnInfo(int[][] columnInfo) {
? ? ? ?this.columnInfo = columnInfo;
? ?}
? ?/**
? ? *
? ? * @param maxAxisValuex X軸最大值
? ? * @param scale X軸幾等份
? ? */
? ?public void setXAxisScaleValue(float maxAxisValuex,int scale){
? ? ? ?maxAxisValueX = maxAxisValuex;
? ? ? ?axisDividedSizeX = scale;
? ?}
? ?/**
? ? *
? ? * @param maxAxisValuey Y軸最大值
? ? * @param scale Y軸幾等份
? ? */
? ?public void setYAxisScaleValue(float maxAxisValuey,int scale){
? ? ? ?maxAxisValueY = maxAxisValuey;
? ? ? ?axisDividedSizeY = scale;
? ?}
}
2019-07-15
已解決,成功運行出來了。