滑動解鎖 陰影

/**
 *
 */
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);
  1.  Paint paint3 = new Paint();  
  2.             paint3.setColor(Color.RED);  
  3.             paint3.setShadowLayer(3000, 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;
//    }








}





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章