package com.example.view; import java.util.ArrayList; import java.util.List; import com.example.util.Constants; import com.example.util.WeatherPic; import android.R; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Paint.Align; import android.graphics.Paint.FontMetrics; import android.graphics.Paint.Style; import android.util.AttributeSet; import android.view.View; /** * * @author Mark * */ public class TrendView extends View { private Paint mPointPaint; private Paint mTextPaint; private Paint mLinePaint1; private Paint mLinePaint2; private Paint mbackLinePaint; private int count = 5; private int x[] = new int[count]; private float radius = 8; private int h; private List<Integer> topTem; private List<Integer> lowTem; private Bitmap[] topBmps; private Bitmap[] lowBmps; private Context c; public TrendView(Context context) { super(context); this.c = context; init(); } public TrendView(Context context, AttributeSet attr) { super(context, attr); this.c = context; init(); } private void init() { topBmps = new Bitmap[count]; lowBmps = new Bitmap[count]; topTem = new ArrayList<Integer>(); lowTem = new ArrayList<Integer>(); mbackLinePaint = new Paint(); mbackLinePaint.setColor(Color.WHITE); mPointPaint = new Paint(); mPointPaint.setAntiAlias(true); mPointPaint.setColor(Color.BLUE); mLinePaint1 = new Paint(); mLinePaint1.setColor(Color.RED); mLinePaint1.setAntiAlias(true); mLinePaint1.setStrokeWidth(4); mLinePaint1.setStyle(Style.FILL); mLinePaint2 = new Paint(); mLinePaint2.setColor(Color.GREEN); mLinePaint2.setAntiAlias(true); mLinePaint2.setStrokeWidth(4); mLinePaint2.setStyle(Style.FILL); mTextPaint = new Paint(); mTextPaint.setAntiAlias(true); mTextPaint.setColor(getResources().getColor(com.example.absdemo.R.color.my__holo_blue_light)); mTextPaint.setTextSize(25F); mTextPaint.setTextAlign(Align.CENTER); } public void setPosition(int... a) { for (int i : a) { x[i] = a[i]; } } public void setWidthHeight(int w, int h) { int parts = 2 * count; int distanceUnit = w / parts; int pointDistance = 2 * distanceUnit; x[0] = distanceUnit; for (int i = 1; i < count; i++) { x[i] = x[i - 1] + pointDistance; } this.h = h; } public void setTemperature(List<Integer> top, List<Integer> low) { this.topTem = top; this.lowTem = low; postInvalidate(); } public void setBitmap(List<Integer> topList, List<Integer> lowList) { topBmps[0] = WeatherPic.getSmallPic(c, topList.get(0), 0); topBmps[1] = WeatherPic.getSmallPic(c, topList.get(1), 0); topBmps[2] = WeatherPic.getSmallPic(c, topList.get(2), 0); topBmps[3] = WeatherPic.getSmallPic(c, topList.get(3), 0); topBmps[4] = WeatherPic.getSmallPic(c, topList.get(4), 0); lowBmps[0] = WeatherPic.getSmallPic(c, lowList.get(0), 1); lowBmps[1] = WeatherPic.getSmallPic(c, lowList.get(1), 1); lowBmps[2] = WeatherPic.getSmallPic(c, lowList.get(2), 1); lowBmps[3] = WeatherPic.getSmallPic(c, lowList.get(3), 1); lowBmps[4] = WeatherPic.getSmallPic(c, lowList.get(4), 1); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); float space = 0f; float space1 = 0f; int temspace = 10; FontMetrics fontMetrics = mTextPaint.getFontMetrics(); float fontHeight = fontMetrics.bottom - fontMetrics.top; int h = this.h / 2; int h2 = (int) (h - fontHeight / 2); int h3 = (int) (h - fontHeight - Constants.picSize); int h4 = (int) (h + fontHeight); int h5 = (int) (h + fontHeight); canvas.drawLine(x[0], 50 , x[0]+60, 50, mLinePaint1); canvas.drawText("最高温度 ℃", x[0]+140, 57, mTextPaint); canvas.drawLine(x[0], 80 , x[0]+60, 80, mLinePaint2); canvas.drawText("最低温度 ℃", x[0]+140, 87, mTextPaint); for (int i = 0; i < topTem.size(); i++) { space = (-topTem.get(i)) * temspace; if (topTem.get(i) != 100) { if (i != topTem.size() - 1) { space1 = (-topTem.get(i + 1)) * temspace; canvas.drawLine(x[i], h + space, x[i + 1], h + space1, mLinePaint1); } if (i == 0) { mTextPaint.setColor(getResources().getColor( com.example.absdemo.R.color.my__holo_blue_light)); mPointPaint.setColor(getResources().getColor( com.example.absdemo.R.color.my__holo_blue_light)); } else { mTextPaint.setColor(Color.WHITE); mPointPaint.setColor(Color.WHITE); } canvas.drawText(topTem.get(i) + "℃", x[i], h2 + space, mTextPaint); canvas.drawCircle(x[i], h + space, radius, mPointPaint); canvas.drawBitmap(topBmps[i], x[i] - topBmps[i].getWidth() / 2, h3 + space, null); } } for (int i = 0; i < lowTem.size(); i++) { space = (-lowTem.get(i)) * temspace; if (i != lowTem.size() - 1) { space1 = (-lowTem.get(i + 1)) * temspace; canvas.drawLine(x[i], h + space, x[i + 1], h + space1, mLinePaint2); } if (i == 0) { mTextPaint.setColor(getResources().getColor( com.example.absdemo.R.color.my__holo_blue_light)); mPointPaint.setColor(getResources().getColor( com.example.absdemo.R.color.my__holo_blue_light)); } else { mTextPaint.setColor(Color.WHITE); mPointPaint.setColor(Color.WHITE); } canvas.drawText(lowTem.get(i) + "℃", x[i], h4 + space, mTextPaint); canvas.drawCircle(x[i], h + space, radius, mPointPaint); canvas.drawBitmap(lowBmps[i], x[i] - lowBmps[i].getWidth() / 2, h5 + space, null); } } }