From 16ba9d3962e4fe0ff693cd6e248dbd98199513ac Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Fri, 19 Aug 2016 11:40:32 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=BA=90=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CustomView/Advance/Code/CheckView.java | 182 ++++++++++++++++++++++++ CustomView/Advance/Code/CheckView.md | 185 +++++++++++++++++++++++++ 2 files changed, 367 insertions(+) create mode 100644 CustomView/Advance/Code/CheckView.java create mode 100644 CustomView/Advance/Code/CheckView.md diff --git a/CustomView/Advance/Code/CheckView.java b/CustomView/Advance/Code/CheckView.java new file mode 100644 index 0000000..be82e5d --- /dev/null +++ b/CustomView/Advance/Code/CheckView.java @@ -0,0 +1,182 @@ +package com.sloop.canvas; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Rect; +import android.os.Handler; +import android.os.Message; +import android.util.AttributeSet; +import android.util.Log; +import android.view.View; + +/** + * + */ +public class CheckView extends View { + + private static final int ANIM_NULL = 0; //动画状态-没有 + private static final int ANIM_CHECK = 1; //动画状态-开启 + private static final int ANIM_UNCHECK = 2; //动画状态-结束 + + private Context mContext; // 上下文 + private int mWidth, mHeight; // 宽高 + private Handler mHandler; // handler + + private Paint mPaint; + private Bitmap okBitmap; + + private int animCurrentPage = -1; // 当前页码 + private int animMaxPage = 13; // 总页数 + private int animDuration = 500; // 动画时长 + private int animState = ANIM_NULL; // 动画状态 + + private boolean isCheck = false; // 是否只选中状态 + + public CheckView(Context context) { + super(context, null); + + } + + public CheckView(Context context, AttributeSet attrs) { + super(context, attrs); + init(context); + } + + /** + * 初始化 + * @param context + */ + private void init(Context context) { + mContext = context; + + mPaint = new Paint(); + mPaint.setColor(0xffFF5317); + mPaint.setStyle(Paint.Style.FILL); + mPaint.setAntiAlias(true); + + okBitmap = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.checkres); + + mHandler = new Handler() { + @Override + public void handleMessage(Message msg) { + super.handleMessage(msg); + if (animCurrentPage < animMaxPage && animCurrentPage >= 0) { + invalidate(); + if (animState == ANIM_NULL) + return; + if (animState == ANIM_CHECK) { + + animCurrentPage++; + } else if (animState == ANIM_UNCHECK) { + animCurrentPage--; + } + + this.sendEmptyMessageDelayed(0, animDuration / animMaxPage); + Log.e("AAA", "Count=" + animCurrentPage); + } else { + if (isCheck) { + animCurrentPage = animMaxPage - 1; + } else { + animCurrentPage = -1; + } + invalidate(); + animState = ANIM_NULL; + } + } + }; + } + + + /** + * View大小确定 + * @param w + * @param h + * @param oldw + * @param oldh + */ + @Override + protected void onSizeChanged(int w, int h, int oldw, int oldh) { + super.onSizeChanged(w, h, oldw, oldh); + mWidth = w; + mHeight = h; + } + + /** + * 绘制内容 + * @param canvas + */ + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + + // 移动坐标系到画布中央 + canvas.translate(mWidth / 2, mHeight / 2); + + // 绘制背景圆形 + canvas.drawCircle(0, 0, 240, mPaint); + + // 得出图像边长 + int sideLength = okBitmap.getHeight(); + + // 得到图像选区 和 实际绘制位置 + Rect src = new Rect(sideLength * animCurrentPage, 0, sideLength * (animCurrentPage + 1), sideLength); + Rect dst = new Rect(-200, -200, 200, 200); + + // 绘制 + canvas.drawBitmap(okBitmap, src, dst, null); + } + + + /** + * 选择 + */ + public void check() { + if (animState != ANIM_NULL || isCheck) + return; + animState = ANIM_CHECK; + animCurrentPage = 0; + mHandler.sendEmptyMessageDelayed(0, animDuration / animMaxPage); + isCheck = true; + } + + /** + * 取消选择 + */ + public void unCheck() { + if (animState != ANIM_NULL || (!isCheck)) + return; + animState = ANIM_UNCHECK; + animCurrentPage = animMaxPage - 1; + mHandler.sendEmptyMessageDelayed(0, animDuration / animMaxPage); + isCheck = false; + } + + /** + * 设置动画时长 + * @param animDuration + */ + public void setAnimDuration(int animDuration) { + if (animDuration <= 0) + return; + this.animDuration = animDuration; + } + + /** + * 设置背景圆形颜色 + * @param color + */ + public void setBackgroundColor(int color){ + mPaint.setColor(color); + } +} \ No newline at end of file diff --git a/CustomView/Advance/Code/CheckView.md b/CustomView/Advance/Code/CheckView.md new file mode 100644 index 0000000..3e78d12 --- /dev/null +++ b/CustomView/Advance/Code/CheckView.md @@ -0,0 +1,185 @@ +``` java +package com.sloop.canvas; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Rect; +import android.os.Handler; +import android.os.Message; +import android.util.AttributeSet; +import android.util.Log; +import android.view.View; + +/** + * + */ +public class CheckView extends View { + + private static final int ANIM_NULL = 0; //动画状态-没有 + private static final int ANIM_CHECK = 1; //动画状态-开启 + private static final int ANIM_UNCHECK = 2; //动画状态-结束 + + private Context mContext; // 上下文 + private int mWidth, mHeight; // 宽高 + private Handler mHandler; // handler + + private Paint mPaint; + private Bitmap okBitmap; + + private int animCurrentPage = -1; // 当前页码 + private int animMaxPage = 13; // 总页数 + private int animDuration = 500; // 动画时长 + private int animState = ANIM_NULL; // 动画状态 + + private boolean isCheck = false; // 是否只选中状态 + + public CheckView(Context context) { + super(context, null); + + } + + public CheckView(Context context, AttributeSet attrs) { + super(context, attrs); + init(context); + } + + /** + * 初始化 + * @param context + */ + private void init(Context context) { + mContext = context; + + mPaint = new Paint(); + mPaint.setColor(0xffFF5317); + mPaint.setStyle(Paint.Style.FILL); + mPaint.setAntiAlias(true); + + okBitmap = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.checkres); + + mHandler = new Handler() { + @Override + public void handleMessage(Message msg) { + super.handleMessage(msg); + if (animCurrentPage < animMaxPage && animCurrentPage >= 0) { + invalidate(); + if (animState == ANIM_NULL) + return; + if (animState == ANIM_CHECK) { + + animCurrentPage++; + } else if (animState == ANIM_UNCHECK) { + animCurrentPage--; + } + + this.sendEmptyMessageDelayed(0, animDuration / animMaxPage); + Log.e("AAA", "Count=" + animCurrentPage); + } else { + if (isCheck) { + animCurrentPage = animMaxPage - 1; + } else { + animCurrentPage = -1; + } + invalidate(); + animState = ANIM_NULL; + } + } + }; + } + + + /** + * View大小确定 + * @param w + * @param h + * @param oldw + * @param oldh + */ + @Override + protected void onSizeChanged(int w, int h, int oldw, int oldh) { + super.onSizeChanged(w, h, oldw, oldh); + mWidth = w; + mHeight = h; + } + + /** + * 绘制内容 + * @param canvas + */ + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + + // 移动坐标系到画布中央 + canvas.translate(mWidth / 2, mHeight / 2); + + // 绘制背景圆形 + canvas.drawCircle(0, 0, 240, mPaint); + + // 得出图像边长 + int sideLength = okBitmap.getHeight(); + + // 得到图像选区 和 实际绘制位置 + Rect src = new Rect(sideLength * animCurrentPage, 0, sideLength * (animCurrentPage + 1), sideLength); + Rect dst = new Rect(-200, -200, 200, 200); + + // 绘制 + canvas.drawBitmap(okBitmap, src, dst, null); + } + + + /** + * 选择 + */ + public void check() { + if (animState != ANIM_NULL || isCheck) + return; + animState = ANIM_CHECK; + animCurrentPage = 0; + mHandler.sendEmptyMessageDelayed(0, animDuration / animMaxPage); + isCheck = true; + } + + /** + * 取消选择 + */ + public void unCheck() { + if (animState != ANIM_NULL || (!isCheck)) + return; + animState = ANIM_UNCHECK; + animCurrentPage = animMaxPage - 1; + mHandler.sendEmptyMessageDelayed(0, animDuration / animMaxPage); + isCheck = false; + } + + /** + * 设置动画时长 + * @param animDuration + */ + public void setAnimDuration(int animDuration) { + if (animDuration <= 0) + return; + this.animDuration = animDuration; + } + + /** + * 设置背景圆形颜色 + * @param color + */ + public void setBackgroundColor(int color){ + mPaint.setColor(color); + } +} + +``` \ No newline at end of file