android studio数据下标越界问题

来源:互联网 发布:车床数控编程基本知识 编辑:程序博客网 时间:2024/05/16 08:14
public class TrendGraphView extends View {

/**
 * 趋势图的高度
 */
private int viewHeight;

/**
 * 趋势图的宽度
 */
private int viewWidth;

/**
 * 最低温度
 */
private int minTemp;

/**
 * 最高温度
 */
private int maxTemp;

/**
 * 每度的单位长度
 */
int mSpace;

int[] dx = new int[4];
private ArrayList<Integer> mTopTemp;
private ArrayList<Integer> mLowTemp;

private Paint mPointPaint;
private Paint mPoint2Paint;
private Paint mLine1Paint;
private Paint mline2Paint;
private Paint mTextPaint;
private Paint mPath1Paint;
private Paint mPath2Paint;

public TrendGraphView(Context context) {
super(context);
}

public TrendGraphView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
mTopTemp = new ArrayList<Integer>();
mTopTemp.add(10);
mTopTemp.add(11);
mTopTemp.add(12);
mTopTemp.add(15);

mLowTemp = new ArrayList<Integer>();
mLowTemp.add(4);
mLowTemp.add(5);
mLowTemp.add(6);
mLowTemp.add(9);
init();
}

public void setTemperature(ArrayList<Integer> top, ArrayList<Integer> low){
this.mTopTemp = top;
this.mLowTemp = low;

postInvalidate();
}


@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// TODO Auto-generated method stub
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
setMeasuredDimension(measureWidth(widthMeasureSpec),
measureHeight(heightMeasureSpec));
}

private int measureHeight(int heightMeasureSpec) {

int result = 0;
int specMode = MeasureSpec.getMode(heightMeasureSpec);
int specSize = MeasureSpec.getSize(heightMeasureSpec);

if (specMode == MeasureSpec.EXACTLY) {
result = specSize;
} else {
result = getPaddingBottom() + getPaddingTop();
if (specMode == MeasureSpec.AT_MOST) {
result = Math.min(result, specSize);
}
}

return result;
}

private int measureWidth(int widthMeasureSpec) {
int result = 0;
int size = MeasureSpec.getSize(widthMeasureSpec); // 每次调用此方法,测量用到的size会发生变化
int mode = MeasureSpec.getMode(widthMeasureSpec); // 根据定义的Layout_width,Layout_height,会对此值产生影响
if (mode == MeasureSpec.EXACTLY) {
result = size;
} else if (mode == MeasureSpec.UNSPECIFIED) {
result = getPaddingLeft() + getPaddingRight();
} else {
result = Math.min(result, size);
}
System.out.println("Height size:" + size);
System.out.println("Height mode:" + mode);
return result;

}

@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
viewHeight = getHeight();
viewWidth = getWidth();
Log.i("icer", viewHeight + "");
Log.i("icer", viewWidth + "");

spaceHeightWidth();

FontMetrics fontMetrics = mTextPaint.getFontMetrics();
// 计算文字高度
float fontHeight = fontMetrics.bottom - fontMetrics.top;
Path path = new Path();
Path path2=new Path();


for (int i = 0; i < mTopTemp.size(); i++) {
int _hTop = (maxTemp - mTopTemp.get(i) + 2) * mSpace + 30;
if (i < mTopTemp.size() - 1) {
canvas.drawLine(dx[i], _hTop, dx[i + 1],
(maxTemp - mTopTemp.get(i + 1) + 2) * mSpace + 30,
mLine1Paint);
}
if(i==0){
path.moveTo(dx[0], _hTop);
path2.moveTo(dx[0], _hTop);
}
if(i==1){
path2.lineTo(dx[i], _hTop);
}

path.lineTo(dx[i], _hTop);

canvas.drawText(mTopTemp.get(i) + "", dx[i], _hTop - fontHeight
, mTextPaint);
canvas.drawCircle(dx[i], _hTop, 10, mPointPaint);

}

for (int i = mLowTemp.size() - 1; i >= 0; i--) {
int _hLow = (maxTemp - mLowTemp.get(i) + 2) * mSpace + 30;
if (i > 0) {
canvas.drawLine(dx[i], _hLow, dx[i - 1],
(maxTemp - mLowTemp.get(i - 1) + 2) * mSpace + 30,
mline2Paint);

}
if(i==1){
path2.lineTo(dx[i], _hLow);
}
if(i==0){
path2.lineTo(dx[i], _hLow);
}

path.lineTo(dx[i], _hLow);
canvas.drawText(mLowTemp.get(i) + "", dx[i], _hLow + fontHeight*3/2,
mTextPaint);
canvas.drawCircle(dx[i], _hLow, 10, mPoint2Paint);
}

path.close();
path2.close();


canvas.drawPath(path, mPath1Paint);
canvas.drawPath(path2, mPath2Paint);


}

private void spaceHeightWidth() {

minTemp = Collections.min(mLowTemp);
maxTemp = Collections.max(mTopTemp);

int h = maxTemp - minTemp;
System.out.println("温差:" + h);
if (h < 20) {
mSpace = (viewHeight - 30) / (h + 4);

} else {
mSpace = (viewHeight - 30) / (h + 10);
}

dx[0] = viewWidth * 1 / 12;
dx[1] = viewWidth * 4 / 12;
dx[2] = viewWidth * 7 / 12;
dx[3] = viewWidth * 10 / 12;
// dx[4] = viewWidth * 9 / 12;
// dx[5] = viewWidth * 11 / 12;
}

/**
 * 得到最高温度
 * 
 * @param topTemp
 * @return
 */
private int getMaxiTemperature(int[] topTemp) {
return getMaxByBubbleSort(topTemp);
}

/**
 * 得到最低温度
 * 
 * @param lowTemp
 * @return
 */
private int getMiniTemperature(int[] lowTemp) {
return getMinByBubbleSort(lowTemp);

}



}

错误日志 :
 Process: com.amap.navi.demo, PID: 10334
                                                   java.lang.ArrayIndexOutOfBoundsException: length=4; index=4
                                                       at com.amap.navi.demo.util.TrendGraphView.onDraw(TrendGraphView.java:198)
                                                       at android.view.View.draw(View.java:14497)
                                                       at android.view.View.getDisplayList(View.java:13394)
                                                       at android.view.View.getDisplayList(View.java:13436)
                                                       at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3077)
                                                       at android.view.View.getDisplayList(View.java:13332)
                                                       at android.view.View.getDisplayList(View.java:13436)
                                                       at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3077)
                                                       at android.view.View.getDisplayList(View.java:13332)
                                                       at android.view.View.getDisplayList(View.java:13436)
                                                       at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3077)
                                                       at android.view.View.getDisplayList(View.java:13332)
                                                       at android.view.View.getDisplayList(View.java:13436)
                                                       at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3077)
                                                       at android.view.View.getDisplayList(View.java:13332)
                                                       at android.view.View.getDisplayList(View.java:13436)
                                                       at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3077)
                                                       at android.view.View.getDisplayList(View.java:13332)
                                                       at android.view.View.getDisplayList(View.java:13436)
                                                       at android.view.HardwareRenderer$GlRenderer.buildDisplayList(HardwareRenderer.java:1570)
                                                       at android.view.HardwareRenderer$GlRenderer.draw(HardwareRenderer.java:1449)
                                                       at android.view.ViewRootImpl.draw(ViewRootImpl.java:2438)
                                                       at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2310)
                                                       at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1940)
                                                       at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1057)
                                                       at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5666)
                                                       at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
                                                       at android.view.Choreographer.doCallbacks(Choreographer.java:574)
                                                       at android.view.Choreographer.doFrame(Choreographer.java:544)
                                                       at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
                                                       at android.os.Handler.handleCallback(Handler.java:733)
                                                       at android.os.Handler.dispatchMessage(Handler.java:95)
                                                       at android.os.Looper.loop(Looper.java:136)
                                                       at android.app.ActivityThread.main(ActivityThread.java:5072)
                                                       at java.lang.reflect.Method.invokeNative(Native Method)
                                                       at java.lang.reflect.Method.invoke(Method.java:515)
                                                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
                                                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:609)
                                                       at dalvik.system.NativeStart.main(Native Method)
03-23 15:28:39.332 1139-1314/? A/ActivityManager: Service ServiceRecord{4401bae8 u0 com.amap.navi.demo/com.amap.api.location.APSService} in process ProcessRecord{43119738 10334:com.amap.navi.demo/u0a200} not same as in map: null


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 qq登录后未响应怎么办 微信安装包损坏怎么办 酷狗音乐想退款怎么办 手机qq影音闪退怎么办 胃疼超过24小时怎么办 小米4s无法开机怎么办 微信语音不好听怎么办 微信语音太难听怎么办 苹果x耳机用不了怎么办 10个月幼儿便秘怎么办 太阳晒了长斑怎么办 膀胱癌复发5回了怎么办 右肾囊肿有1cm,怎么办, 牙侧面有小小洞怎么办 喝酒喝的手抖怎么办 孩子在幼儿园不爱说话怎么办 孕妇吃了方头鱼怎么办 油炸的东西软了怎么办 跑步小腿疼怎么办 知乎 健身后小腿粗了怎么办 背心式内衣大了怎么办 运动文胸买大了怎么办 喝碳酸饮料胖了怎么办 奥鹏学费迟交了怎么办 侧乌鸦做不起来怎么办 发烧很难受怎么办 知乎 上班后奶水越来越少怎么办 孕晚期胖的厉害怎么办 怀孕后猛长胖怎么办啊 怀孕坐了按摩椅怎么办 怀孕8个月胎位不正怎么办 缓刑期间被打了怎么办 非法集资人跑了怎么办 玩游戏恶心想吐怎么办 中奖了填了信息怎么办 穿开衫老是溜肩怎么办 开车开久了腰疼怎么办 西药吃了胃难受怎么办 铁海棠叶子变黄怎么办 四季海棠根烂了怎么办 水银弄到皮肤上怎么办