package us.shandian.giga.ui.common; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Paint; import android.util.AttributeSet; import android.view.View; import us.shandian.giga.R; import us.shandian.giga.get.DownloadMission; public class BlockGraphView extends View { private static int BLOCKS_PER_LINE = 15; private int mForeground, mBackground; private int mBlockSize, mLineCount; private DownloadMission mMission; public BlockGraphView(Context context) { this(context, null); } public BlockGraphView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public BlockGraphView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); try { TypedArray array = context.obtainStyledAttributes(R.styleable.Theme); mBackground = array.getColor(R.styleable.Theme_colorPrimary, 0); mForeground = array.getColor(R.styleable.Theme_colorPrimaryDark, 0); array.recycle(); } catch (Exception e) { } } public void setMission(DownloadMission mission) { mMission = mission; setWillNotDraw(false); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int width = MeasureSpec.getSize(widthMeasureSpec); mBlockSize = width / BLOCKS_PER_LINE - 1; mLineCount = (int) Math.ceil((double) mMission.blocks / BLOCKS_PER_LINE); int height = mLineCount * (mBlockSize + 1); setMeasuredDimension(width, height); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); Paint p = new Paint(); p.setFlags(Paint.ANTI_ALIAS_FLAG); for (int i = 0; i < mLineCount; i++) { for (int j = 0; j < BLOCKS_PER_LINE; j++) { long pos = i * BLOCKS_PER_LINE + j; if (pos >= mMission.blocks) { break; } if (mMission.isBlockPreserved(pos)) { p.setColor(mForeground); } else { p.setColor(mBackground); } int left = (mBlockSize + 1) * j; int right = left + mBlockSize; int top = (mBlockSize + 1) * i; int bottom = top + mBlockSize; canvas.drawRect(left, top, right, bottom, p); } } } }