package com.chechezhi.ui.guide;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Rect;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.util.DisplayMetrics;
import android.view.View;
public class GuideView extends View implements OnPageChangeListener {
private static final int DOT_SPACE_DIVIDE = 3;
private static final float DOT_Y_POSITION = 0.8f;
private List<SinglePage> mGuideContent;
private int mPosition;
private float mOffset;
private boolean mDrawDot;
private List<SingleElement> mDotList;
private int mDotXStart;
private int mDotXPlus;
private int mDotY;
private SingleElement mSelectedDot;
/**
* This class could not instantiation from XML
*
* @param context
* @param guideContent
* @param dotSelected
* @param dotDefault
*/
public GuideView(Activity activity, List<SinglePage> guideContent, boolean drawDot, Bitmap dotDefault, Bitmap dotSelected) {
super(activity);
mGuideContent = guideContent;
mDrawDot = drawDot;
// Prepare dot element, if we have only one page, do not show dot
if (guideContent != null && guideContent.size() > 1 && drawDot) {
mDotList = new ArrayList<SingleElement>();
// Just get a rough screen width/height
DisplayMetrics dm = new DisplayMetrics();
activity.getWindowManager().getDefaultDisplay().getMetrics(dm);
Rect frame = new Rect();
activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
int statusBarHeight = frame.top;
int mScreenWidth = dm.widthPixels;
int mScreenHeight = dm.heightPixels - statusBarHeight;
mDotXStart = mScreenWidth / DOT_SPACE_DIVIDE - dotDefault.getWidth() / 2;
mDotXPlus = mScreenWidth / DOT_SPACE_DIVIDE / (guideContent.size() - 1);
mDotY = (int) (mScreenHeight * DOT_Y_POSITION);
for (int i = 0; i < guideContent.size(); i++) {
SingleElement e = new SingleElement(mDotXStart + mDotXPlus * i, mDotY, mDotXStart + mDotXPlus * i, mDotY, 1.0f, 1.0f,
dotDefault);
mDotList.add(e);
}
mSelectedDot = new SingleElement(mDotXStart + mDotXPlus * mPosition, mDotY, mDotXStart + mDotXPlus * mPosition, mDotY, 1.0f,
1.0f, dotSelected);
}
}
@Override
protected void onDraw(Canvas canvas) {
// Draw dot
if (mDrawDot) {
// Draw default dot
for (int i = 0; i < mDotList.size(); i++) {
SingleElement e = mDotList.get(i);
drawElement(canvas, e);
}
// Draw selected dot
int x = mDotXStart + mDotXPlus * mPosition;
mSelectedDot.xStart = x;
mSelectedDot.xEnd = x;
drawElement(canvas, mSelectedDot);
}
SinglePage singlePage = mGuideContent.get(mPosition);
if (singlePage.mElementsList == null) {
// No stuff
super.onDraw(canvas);
return;
}
// Draw custom stuff
for (int i = 0; i < singlePage.mElementsList.size(); i++) {
SingleElement e = singlePage.mElementsList.get(i);
drawElement(canvas, e);
}
super.onDraw(canvas);
}
private void drawElement(Canvas canvas, SingleElement e) {
Bitmap bitmap = e.contentBitmap;
Matrix m = e.m;
Paint p = e.p;
float dx = e.xStart + (e.xEnd - e.xStart) * mOffset;
float dy = e.yStart + (e.yEnd - e.yStart) * mOffset;
float alpha = e.alphaStart + (e.alphaEnd - e.alphaStart) * mOffset;
m.setTranslate(dx, dy);
p.setAlpha((int) (0xFF * alpha));
canvas.drawBitmap(bitmap, m, p);
}
@Override
public void onPageScrollStateChanged(int state) {
// TODO Auto-generated method stub
}
@Override
public void onPageScrolled(int index, float offset, int offsetPixel) {
mPosition = index;
mOffset = offset;
invalidate();
}
@Override
public void onPageSelected(int index) {
// TODO Auto-generated method stub
}
}