/**
*
*/
package com.example.hfy.test;
http://blog.csdn.net/sjf0115/article/details/7363958
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.graphics.Rect;
import android.graphics.RectF;
import android.os.Handler;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
/**
* @author Istep
*
*/
public class CView extends View {
private int hight;
private int width;
private Paint paint;
private Rect mBound;
public int currentState;
public static final int STATE_LOCK = 1;
public static final int STATE_UNLOCK = 2;
public static final int STATE_MOVING = 3;
private static final String TAG = "istep";
private Bitmap slideUnlockBlock;
private int blockBackgoundWidth;
private int blockWidth;
private int blockHeight;
private float x;
private float y;
private boolean downOnBlock;
private Bitmap slideUnFocuse;
private Bitmap slideFocused;
private int bg_color;
private String text="";
private int focuseTextX;
private int focuseSlideX;
private int slide_lock_color;
private int textSize;
private int slide_text_color;
private String endText;
private RectF r1;
/**
* @param context
*/
public CView(Context context) {
super(context);
init(context);
// TODO Auto-generated constructor stub
}
/**
* @param context
* @param attrs
*/
public CView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
// TODO Auto-generated constructor stub
}
/**
* @param context
* @param attrs
* @param defStyleAttr
*/
public CView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
// TODO Auto-generated constructor stub
init(context);
}
public void init(Context ctx) {
hight = getHeight();
width = getWidth();
paint = new Paint();
paint.setAntiAlias(true); // 设置画笔为无锯齿
paint.setStrokeWidth((float) 3.0); // 线宽
paint.setStyle(Style.FILL);
slideUnlockBlock = createBitmapByRes(R.drawable.ic_slideblock);
slideUnFocuse = createBitmapByRes(R.drawable.ic_slide_unfocuse);
slideFocused = createBitmapByRes(R.drawable.ic_slide_focused);
bg_color = getColor(R.color.x9_slide_bg);
slide_lock_color = getColor(R.color.x9_slide_lock);
slide_text_color = getColor(R.color.x9_slide_text);
//text ="滑动";
textSize = dip2px(ctx,17);
focuseTextX = dip2px(ctx,90);
focuseSlideX = dip2px(ctx,65) ;
currentState = STATE_LOCK;
blockWidth = slideUnlockBlock.getWidth();;
blockHeight=slideUnlockBlock.getHeight();
postInvalidate();
}
public void setText(String text, String endText){
this.text = text;
this.endText = endText;
postInvalidate();
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
recyleBitmap(slideUnlockBlock);
recyleBitmap(slideUnFocuse);
recyleBitmap(slideFocused);
}
private void recyleBitmap(Bitmap bitmap){
if(null != bitmap && !bitmap.isRecycled()){
bitmap.recycle();
}
}
public static int dip2px(Context context, float dipValue){
final float scale = context.getResources().getDisplayMetrics().density;
return (int)(dipValue * scale + 0.5f);
}
public static int px2dip(Context context, float pxValue){
final float scale = context.getResources().getDisplayMetrics().density;
return (int)(pxValue / scale + 0.5f);
}
private Bitmap createBitmapByRes(int resID){
return BitmapFactory.decodeResource(getResources(),resID);
}
private int getColor(int resID){
return getResources().getColor(resID);
}
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
drawBg(canvas);
drawText(canvas);
drawSlide(canvas);
}
public void drawBg(Canvas canvas){
paint.setColor(bg_color);
RectF r2 = new RectF(); // RectF对象
r2.left = 0; // 左边
r2.top = 0; // 上边
r2.right = getWidth(); // 右边
r2.bottom = getHeight(); // 下边
blockBackgoundWidth = getWidth();
if(downOnBlock){
paint.setAlpha(127);
}else{
paint.setAlpha(204);
}
canvas.drawRoundRect(r2, 10, 10, paint); // 绘制圆角矩形
}
public void drawText(Canvas canvas){
mBound = new Rect();
paint.setAntiAlias(true);
paint.setStyle(Style.FILL);
paint.setTextSize(textSize);
paint.setColor(slide_text_color);
paint.getTextBounds(text, 0, text.length(), mBound);
/*
* 控件宽度/2 - 文字宽度/2
*/
//float startX = getWidth() / 2 - mBound.width() / 2;
/*
* 控件高度/2 + 文字高度/2,绘制文字从文字左下角开始,因此"+"
*/
float startY = getHeight() / 2 + mBound.height() / 2;
// 绘制文字
float focuseSlideY = getHeight() / 2 - slideUnFocuse.getHeight() / 2;
if(downOnBlock){
canvas.drawBitmap(slideFocused,focuseSlideX,focuseSlideY,paint);
paint.setAlpha(127);
if(r1.right==blockBackgoundWidth){
canvas.drawText(endText, focuseTextX, startY, paint);
}else{
canvas.drawText(text, focuseTextX, startY, paint);
}
}else{
canvas.drawBitmap(slideUnFocuse,focuseSlideX,focuseSlideY,paint);
paint.setAlpha(204);
canvas.drawText(text, focuseTextX, startY, paint);
}
}
public void drawSlide(Canvas canvas){
r1 = new RectF(); // RectF对象
//paint.setShadowLayer(5, 8, 7, Color.GREEN);
paint3.setColor(slide_lock_color);
setLayerType( LAYER_TYPE_SOFTWARE , null);
switch (currentState) {
case STATE_LOCK:
r1.left = 0; // 左边
r1.top = 0; // 上边
r1.right = slideUnlockBlock.getWidth(); // 右边
r1.bottom = slideUnlockBlock.getHeight(); // 下边
canvas.drawRoundRect(r1, 10, 10, paint3); // 绘制圆角矩形
canvas.drawBitmap(slideUnlockBlock, 0, 0, paint);
break;
case STATE_UNLOCK:
int unlockX = blockBackgoundWidth - blockWidth;
r1.left = unlockX; // 左边
r1.top = 0; // 上边
r1.right = unlockX+slideUnlockBlock.getWidth(); // 右边
r1.bottom = slideUnlockBlock.getHeight(); // 下边
canvas.drawRoundRect(r1, 10, 10, paint3); // 绘制圆角矩形
canvas.drawBitmap(slideUnlockBlock, unlockX, 0, paint);
break;
case STATE_MOVING:
if (x < 0) {
x = 0;
} else if (x > blockBackgoundWidth - blockWidth) {
x = blockBackgoundWidth - blockWidth;
}
r1.left = x; // 左边
r1.top = 0; // 上边
r1.right = x+slideUnlockBlock.getWidth(); // 右边
r1.bottom = slideUnlockBlock.getHeight(); // 下边
canvas.drawRoundRect(r1, 10, 10, paint3); // 绘制圆角矩形
canvas.drawBitmap(slideUnlockBlock, x, 0, paint);
Log.i(TAG, "move......................"+x+" "+r1.right);
break;
default:
break;
}
}
Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
if (msg.what == 0) {
if (x > 0) {
x = x - blockBackgoundWidth * 10.0f / 100;
postInvalidate();
handler.sendEmptyMessageDelayed(0, 10);
} else {
handler.removeCallbacksAndMessages(null);
currentState = STATE_LOCK;
Log.i(TAG, "state---lock.....");
}
}
};
};
/**
* Ω‚À¯µƒº‡Ã˝
*/
private OnUnLockListener onUnLockListener;
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
if (currentState != STATE_MOVING) {
x = event.getX();
y = event.getY();
// œ»º∆À„≥ˆª¨øȵƒ÷––ƒµ„µƒx£¨y◊¯±Í
float blockCenterX = blockWidth * 1.0f / 2;
float blockCenterY = blockHeight * 1.0f / 2;
downOnBlock = isDownOnBlock(blockCenterX, x, blockCenterY, y);
Log.i(TAG, "down......................");
postInvalidate();
}
break;
case MotionEvent.ACTION_MOVE:
if (downOnBlock) {
x = event.getX();
y = event.getY();
currentState = STATE_MOVING;
Log.i(TAG, "move......................");
postInvalidate();
}
break;
case MotionEvent.ACTION_UP:
if (currentState == STATE_MOVING) {
if (x < blockBackgoundWidth - blockWidth) {
handler.sendEmptyMessageDelayed(0, 10);
if(onUnLockListener!=null)
onUnLockListener.setUnLocked(false);
} else {
currentState = STATE_UNLOCK;
if(onUnLockListener!=null)
onUnLockListener.setUnLocked(true);
}
downOnBlock = false;
postInvalidate();
Log.i(TAG, "up......................");
}
if(r1.left==0){
reset();
}
break;
default:
break;
}
return true;
}
public boolean isDownOnBlock(float x1, float x2, float y1, float y2) {
float sqrt = (float)Math.sqrt(Math.abs(x1 - x2) * Math.abs(x1 - x2)
+ Math.abs(y1 - y2) * Math.abs(y1 - y2));
if (sqrt <= blockWidth / 2) {
return true;
}
return false;
}
/**
* …Ë÷√Ω‚À¯º‡Ã˝
*
* @param onUnLockListener
*/
public void setOnUnLockListener(OnUnLockListener onUnLockListener) {
this.onUnLockListener = onUnLockListener;
}
public interface OnUnLockListener {
public void setUnLocked(boolean lock);
}
public void reset() {
currentState = STATE_LOCK;
downOnBlock = false;
postInvalidate();
}
// public boolean isOnBackground(int x,int y){
// if(x<=slideUnlockBackground.getWidth()&&y<=slideUnlockBackground.getHeight()){
// return true;
// }
// return false;
// }
}
*
*/
package com.example.hfy.test;
http://blog.csdn.net/sjf0115/article/details/7363958
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.graphics.Rect;
import android.graphics.RectF;
import android.os.Handler;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
/**
* @author Istep
*
*/
public class CView extends View {
private int hight;
private int width;
private Paint paint;
private Rect mBound;
public int currentState;
public static final int STATE_LOCK = 1;
public static final int STATE_UNLOCK = 2;
public static final int STATE_MOVING = 3;
private static final String TAG = "istep";
private Bitmap slideUnlockBlock;
private int blockBackgoundWidth;
private int blockWidth;
private int blockHeight;
private float x;
private float y;
private boolean downOnBlock;
private Bitmap slideUnFocuse;
private Bitmap slideFocused;
private int bg_color;
private String text="";
private int focuseTextX;
private int focuseSlideX;
private int slide_lock_color;
private int textSize;
private int slide_text_color;
private String endText;
private RectF r1;
/**
* @param context
*/
public CView(Context context) {
super(context);
init(context);
// TODO Auto-generated constructor stub
}
/**
* @param context
* @param attrs
*/
public CView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
// TODO Auto-generated constructor stub
}
/**
* @param context
* @param attrs
* @param defStyleAttr
*/
public CView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
// TODO Auto-generated constructor stub
init(context);
}
public void init(Context ctx) {
hight = getHeight();
width = getWidth();
paint = new Paint();
paint.setAntiAlias(true); // 设置画笔为无锯齿
paint.setStrokeWidth((float) 3.0); // 线宽
paint.setStyle(Style.FILL);
slideUnlockBlock = createBitmapByRes(R.drawable.ic_slideblock);
slideUnFocuse = createBitmapByRes(R.drawable.ic_slide_unfocuse);
slideFocused = createBitmapByRes(R.drawable.ic_slide_focused);
bg_color = getColor(R.color.x9_slide_bg);
slide_lock_color = getColor(R.color.x9_slide_lock);
slide_text_color = getColor(R.color.x9_slide_text);
//text ="滑动";
textSize = dip2px(ctx,17);
focuseTextX = dip2px(ctx,90);
focuseSlideX = dip2px(ctx,65) ;
currentState = STATE_LOCK;
blockWidth = slideUnlockBlock.getWidth();;
blockHeight=slideUnlockBlock.getHeight();
postInvalidate();
}
public void setText(String text, String endText){
this.text = text;
this.endText = endText;
postInvalidate();
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
recyleBitmap(slideUnlockBlock);
recyleBitmap(slideUnFocuse);
recyleBitmap(slideFocused);
}
private void recyleBitmap(Bitmap bitmap){
if(null != bitmap && !bitmap.isRecycled()){
bitmap.recycle();
}
}
public static int dip2px(Context context, float dipValue){
final float scale = context.getResources().getDisplayMetrics().density;
return (int)(dipValue * scale + 0.5f);
}
public static int px2dip(Context context, float pxValue){
final float scale = context.getResources().getDisplayMetrics().density;
return (int)(pxValue / scale + 0.5f);
}
private Bitmap createBitmapByRes(int resID){
return BitmapFactory.decodeResource(getResources(),resID);
}
private int getColor(int resID){
return getResources().getColor(resID);
}
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
drawBg(canvas);
drawText(canvas);
drawSlide(canvas);
}
public void drawBg(Canvas canvas){
paint.setColor(bg_color);
RectF r2 = new RectF(); // RectF对象
r2.left = 0; // 左边
r2.top = 0; // 上边
r2.right = getWidth(); // 右边
r2.bottom = getHeight(); // 下边
blockBackgoundWidth = getWidth();
if(downOnBlock){
paint.setAlpha(127);
}else{
paint.setAlpha(204);
}
canvas.drawRoundRect(r2, 10, 10, paint); // 绘制圆角矩形
}
public void drawText(Canvas canvas){
mBound = new Rect();
paint.setAntiAlias(true);
paint.setStyle(Style.FILL);
paint.setTextSize(textSize);
paint.setColor(slide_text_color);
paint.getTextBounds(text, 0, text.length(), mBound);
/*
* 控件宽度/2 - 文字宽度/2
*/
//float startX = getWidth() / 2 - mBound.width() / 2;
/*
* 控件高度/2 + 文字高度/2,绘制文字从文字左下角开始,因此"+"
*/
float startY = getHeight() / 2 + mBound.height() / 2;
// 绘制文字
float focuseSlideY = getHeight() / 2 - slideUnFocuse.getHeight() / 2;
if(downOnBlock){
canvas.drawBitmap(slideFocused,focuseSlideX,focuseSlideY,paint);
paint.setAlpha(127);
if(r1.right==blockBackgoundWidth){
canvas.drawText(endText, focuseTextX, startY, paint);
}else{
canvas.drawText(text, focuseTextX, startY, paint);
}
}else{
canvas.drawBitmap(slideUnFocuse,focuseSlideX,focuseSlideY,paint);
paint.setAlpha(204);
canvas.drawText(text, focuseTextX, startY, paint);
}
}
public void drawSlide(Canvas canvas){
r1 = new RectF(); // RectF对象
//paint.setShadowLayer(5, 8, 7, Color.GREEN);
- Paint paint3 = new Paint();
- paint3.setColor(Color.RED);
- paint3.setShadowLayer(30, 0, 0, Color.GREEN);
paint3.setColor(slide_lock_color);
setLayerType( LAYER_TYPE_SOFTWARE , null);
switch (currentState) {
case STATE_LOCK:
r1.left = 0; // 左边
r1.top = 0; // 上边
r1.right = slideUnlockBlock.getWidth(); // 右边
r1.bottom = slideUnlockBlock.getHeight(); // 下边
canvas.drawRoundRect(r1, 10, 10, paint3); // 绘制圆角矩形
canvas.drawBitmap(slideUnlockBlock, 0, 0, paint);
break;
case STATE_UNLOCK:
int unlockX = blockBackgoundWidth - blockWidth;
r1.left = unlockX; // 左边
r1.top = 0; // 上边
r1.right = unlockX+slideUnlockBlock.getWidth(); // 右边
r1.bottom = slideUnlockBlock.getHeight(); // 下边
canvas.drawRoundRect(r1, 10, 10, paint3); // 绘制圆角矩形
canvas.drawBitmap(slideUnlockBlock, unlockX, 0, paint);
break;
case STATE_MOVING:
if (x < 0) {
x = 0;
} else if (x > blockBackgoundWidth - blockWidth) {
x = blockBackgoundWidth - blockWidth;
}
r1.left = x; // 左边
r1.top = 0; // 上边
r1.right = x+slideUnlockBlock.getWidth(); // 右边
r1.bottom = slideUnlockBlock.getHeight(); // 下边
canvas.drawRoundRect(r1, 10, 10, paint3); // 绘制圆角矩形
canvas.drawBitmap(slideUnlockBlock, x, 0, paint);
Log.i(TAG, "move......................"+x+" "+r1.right);
break;
default:
break;
}
}
Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
if (msg.what == 0) {
if (x > 0) {
x = x - blockBackgoundWidth * 10.0f / 100;
postInvalidate();
handler.sendEmptyMessageDelayed(0, 10);
} else {
handler.removeCallbacksAndMessages(null);
currentState = STATE_LOCK;
Log.i(TAG, "state---lock.....");
}
}
};
};
/**
* Ω‚À¯µƒº‡Ã˝
*/
private OnUnLockListener onUnLockListener;
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
if (currentState != STATE_MOVING) {
x = event.getX();
y = event.getY();
// œ»º∆À„≥ˆª¨øȵƒ÷––ƒµ„µƒx£¨y◊¯±Í
float blockCenterX = blockWidth * 1.0f / 2;
float blockCenterY = blockHeight * 1.0f / 2;
downOnBlock = isDownOnBlock(blockCenterX, x, blockCenterY, y);
Log.i(TAG, "down......................");
postInvalidate();
}
break;
case MotionEvent.ACTION_MOVE:
if (downOnBlock) {
x = event.getX();
y = event.getY();
currentState = STATE_MOVING;
Log.i(TAG, "move......................");
postInvalidate();
}
break;
case MotionEvent.ACTION_UP:
if (currentState == STATE_MOVING) {
if (x < blockBackgoundWidth - blockWidth) {
handler.sendEmptyMessageDelayed(0, 10);
if(onUnLockListener!=null)
onUnLockListener.setUnLocked(false);
} else {
currentState = STATE_UNLOCK;
if(onUnLockListener!=null)
onUnLockListener.setUnLocked(true);
}
downOnBlock = false;
postInvalidate();
Log.i(TAG, "up......................");
}
if(r1.left==0){
reset();
}
break;
default:
break;
}
return true;
}
public boolean isDownOnBlock(float x1, float x2, float y1, float y2) {
float sqrt = (float)Math.sqrt(Math.abs(x1 - x2) * Math.abs(x1 - x2)
+ Math.abs(y1 - y2) * Math.abs(y1 - y2));
if (sqrt <= blockWidth / 2) {
return true;
}
return false;
}
/**
* …Ë÷√Ω‚À¯º‡Ã˝
*
* @param onUnLockListener
*/
public void setOnUnLockListener(OnUnLockListener onUnLockListener) {
this.onUnLockListener = onUnLockListener;
}
public interface OnUnLockListener {
public void setUnLocked(boolean lock);
}
public void reset() {
currentState = STATE_LOCK;
downOnBlock = false;
postInvalidate();
}
// public boolean isOnBackground(int x,int y){
// if(x<=slideUnlockBackground.getWidth()&&y<=slideUnlockBackground.getHeight()){
// return true;
// }
// return false;
// }
}