用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - android代码库

滑动解锁控件

2013-07-06 作者: 云代码会员举报

[android]代码库

package com.mosjoy.ad.zdlock;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.os.Handler;
import android.os.Message;
import android.os.Vibrator;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;

import com.mosjoy.ad.R;

public class SliderRelativeLayout extends RelativeLayout {

	private static String TAG = "SliderRelativeLayout";
	private TextView tv_slider_icon = null; // 初始控件,用来判断是否为拖动?
	private Bitmap dragBitmap = null; //拖拽图片
	private Context mContext = null; // 初始化图片拖拽时的Bitmap对象
	private Handler mainHandler = null; //与主Activity通信的Handler对象
	private ImageView mPhoneImageView;
	private ImageView mUnlockImageView;
	private ImageView mMessageImageView;
	private ImageView mCameraImageView;
	private boolean mStopBoolean = false;
	private Canvas mCanvas;
	public SliderRelativeLayout(Context context) {
		super(context);
		mContext = context;
		initDragBitmap();
	}

	public SliderRelativeLayout(Context context, AttributeSet attrs) {
		super(context, attrs, 0);
		mContext = context;
		initDragBitmap();
	}

	public SliderRelativeLayout(Context context, AttributeSet attrs,
			int defStyle) {
		super(context, attrs, defStyle);
		mContext = context;
		initDragBitmap();
	}
	
	// 初始化图片拖拽时的Bitmap对象
	private void initDragBitmap() {
		if (dragBitmap == null)
			dragBitmap = BitmapFactory.decodeResource(mContext.getResources(),
					R.drawable.getup_slider_ico_normal);
	}
	
	@Override
	protected void onFinishInflate() {
		super.onFinishInflate();
		// 该控件主要判断是否处于滑动点击区域。滑动时 处于INVISIBLE(不可见)状态,滑动时处于VISIBLE(可见)状态
		tv_slider_icon = (TextView) findViewById(R.id.slider_icon);
		mPhoneImageView = (ImageView) findViewById(R.id.iv_phone);
		mUnlockImageView = (ImageView) findViewById(R.id.iv_unlock);
		mCameraImageView = (ImageView) findViewById(R.id.iv_camera);
		mMessageImageView = (ImageView) findViewById(R.id.iv_message);
	}
	private int mLastMoveX = 1000;  //当前bitmap应该绘制的地方 , 初始值为足够大,可以认为看不见	
	private int mLastMoveY = 1000;  //当前bitmap应该绘制的地方 , 初始值为足够大,可以认为看不见
	public boolean onTouchEvent(MotionEvent event) {
		int x = (int) event.getX();
		int y = (int) event.getY();
		switch (event.getAction()) {
		case MotionEvent.ACTION_DOWN:
			mLastMoveX = (int) event.getX();
			mLastMoveY = (int) event.getY();
			//处理Action_Down事件:  判断是否点击了滑动区域
			return handleActionDownEvenet(event);
		case MotionEvent.ACTION_MOVE:
			mLastMoveX = x; //保存了X轴方向
			mLastMoveY = y;
            invalidate(); //重新绘制	
			return true;
		case MotionEvent.ACTION_UP:
			//处理Action_Up事件:  判断是否解锁成功,成功则结束我们的Activity ;否则 ,缓慢回退该图片。
			handleActionUpEvent(event);
			return true;
		}
		return super.onTouchEvent(event);
	}

	// 绘制拖动时的图片
	@Override
    protected void onDraw (Canvas canvas) {
		super.onDraw(canvas);		
		// 图片更随手势移动
		if (!mStopBoolean) {
			invalidateDragImg(canvas);
		}
		mCanvas = canvas;
	}

	// 图片更随手势移动
	private void invalidateDragImg(Canvas canvas) {
		//Log.e(TAG, "handleActionUpEvenet : invalidateDragImg" );
		//以合适的坐标值绘制该图片
		int drawXCor = mLastMoveX - dragBitmap.getWidth()/2;
		int drawYCor = mLastMoveY - dragBitmap.getHeight()/2;
	    canvas.drawBitmap(dragBitmap,  drawXCor < 0 ? 5 : drawXCor , drawYCor , null);
//	    isHitUnlock(canvas);
	}

	// 手势落下是,是否点中了图片,即是否需要开始移动
	private boolean handleActionDownEvenet(MotionEvent event) {
		Rect rect = new Rect();
		tv_slider_icon.getHitRect(rect);
		boolean isHit = rect.contains((int) event.getX(), (int) event.getY());
		//开始拖拽 ,隐藏该图片
		if(isHit && !mStopBoolean){  
			tv_slider_icon.setVisibility(View.INVISIBLE);
			mPhoneImageView.setVisibility(View.VISIBLE);
			mUnlockImageView.setVisibility(View.VISIBLE);
			mMessageImageView.setVisibility(View.VISIBLE);
			mCameraImageView.setVisibility(View.VISIBLE);
		}
		return isHit;
	}

	//判断是否到达解锁点
	private boolean isHitUnlock() {
		Rect phoneRect = new Rect();
		mPhoneImageView.getHitRect(phoneRect);
		Rect unlockRect = new Rect();
		mUnlockImageView.getHitRect(unlockRect);
		Rect messageRect = new Rect();
		mMessageImageView.getHitRect(messageRect);
		Rect cameraRect = new Rect();
		mCameraImageView.getHitRect(cameraRect);
		//解锁到电话界面
		if(phoneRect.contains(mLastMoveX,mLastMoveY)){
			mStopBoolean = true;
			adStopTwoSecond();
		   //结束我们的主Activity界面
			Message msg = new Message();
			msg.what = MainLockActivity.MSG_PHONE_LOCK_SUCESS;
			mainHandler.sendMessageDelayed(msg, 2*1000);
//		   mainHandler.obtainMessage(MainLockActivity.MSG_PHONE_LOCK_SUCESS).sendToTarget();
		   return true;
		}else if(unlockRect.contains(mLastMoveX,mLastMoveY)){
			mStopBoolean = true;
			adStopTwoSecond();
			//结束我们的主Activity界面
			Message msg = new Message();
			msg.what = MainLockActivity.MSG_LOCK_SUCESS;
			mainHandler.sendMessageDelayed(msg, 2*1000);
			return true;
		}else if(messageRect.contains(mLastMoveX,mLastMoveY)){
			mStopBoolean = true;
			adStopTwoSecond();
			//结束我们的主Activity界面
			Message msg = new Message();
			msg.what = MainLockActivity.MSG_MESSAGE_LOCK_SUCESS;
			mainHandler.sendMessageDelayed(msg, 2*1000);
//			mainHandler.obtainMessage(MainLockActivity.MSG_MESSAGE_LOCK_SUCESS).sendToTarget();
			return true;
		}else if(cameraRect.contains(mLastMoveX,mLastMoveY)){
			mStopBoolean = true;
			adStopTwoSecond();
			//结束我们的主Activity界面
			Message msg = new Message();
			msg.what = MainLockActivity.MSG_CAMERA_LOOK_SUCESS;
			mainHandler.sendMessageDelayed(msg, 2*1000);
//			mainHandler.obtainMessage(MainLockActivity.MSG_CAMERA_LOOK_SUCESS).sendToTarget();
			return true;
		}
		return false;
	}
	
	//回退动画时间间隔值 
	private static int BACK_DURATION = 20 ;   // 20ms
    //水平方向前进速率
	private static float VE_HORIZONTAL = 0.7f ;  //0.1dip/ms
    //判断松开手指时,是否达到末尾即可以开锁了 , 是,则开锁,否则,通过一定的算法使其回退。
	private void handleActionUpEvent(MotionEvent event){		
		int x = (int) event.getX() ;	
		int y = (int)event.getY();
		//解锁到电话界面
		if(isHitUnlock()){
		}else {
			mStopBoolean = false;
			//没有成功解锁,以一定的算法使其回退
		    //每隔20ms , 速率为0.6dip/ms ,  使当前的图片往后回退一段距离,直到到达最左端	
			mLastMoveX = x ;  //记录手势松开时,当前的坐标位置。
			int distance = x - tv_slider_icon.getRight() ;
			//只有移动了足够距离才回退
			Log.e(TAG, "handleActionUpEvent : mLastMoveX -->" + mLastMoveX + " distance -->" + distance );
			if(distance >= 0)
			    mHandler.postDelayed(BackDragImgTask, BACK_DURATION);
			else{  //复原初始场景
				resetViewState();
			}
		}
	}
	
	//暂停两秒
	private void adStopTwoSecond() {
		mPhoneImageView.setVisibility(View.INVISIBLE);
		mUnlockImageView.setVisibility(View.INVISIBLE);
		mCameraImageView.setVisibility(View.INVISIBLE);
		mMessageImageView.setVisibility(View.INVISIBLE);
//		mCanvas.drawBitmap(dragBitmap, 2000, 2000, null);
		invalidate(); 
//		try {
//			Thread.sleep(2*1000);
//		} catch (InterruptedException e) {
//			e.printStackTrace();
//		}
	}
	
	//重置初始的状态,显示tv_slider_icon图像,使bitmap不可见
	private void resetViewState(){
		mLastMoveX = 1000;
		mLastMoveY = 1000;
		tv_slider_icon.setVisibility(View.VISIBLE);
		mPhoneImageView.setVisibility(View.INVISIBLE);
		mUnlockImageView.setVisibility(View.INVISIBLE);
		mCameraImageView.setVisibility(View.INVISIBLE);
		mMessageImageView.setVisibility(View.INVISIBLE);
		invalidate();        //重绘最后一次
	}
	
	//通过延时控制当前绘制bitmap的位置坐标
	private Runnable BackDragImgTask = new Runnable(){
		public void run(){
			//一下次Bitmap应该到达的坐标值
			mLastMoveX = mLastMoveX - (int)(BACK_DURATION * VE_HORIZONTAL);
			invalidate();//重绘		
			//是否需要下一次动画 ? 到达了初始位置,不在需要绘制
			boolean shouldEnd = Math.abs(mLastMoveX - tv_slider_icon.getRight()) <= 8 ;			
			if(!shouldEnd)
			    mHandler.postDelayed(BackDragImgTask, BACK_DURATION);
			else { //复原初始场景
				resetViewState();	
			}				
		}
	};
	
	private Handler mHandler =new Handler (){
		public void handleMessage(Message msg){
		}
	};
	//震动一下下咯
	private void virbate(){
		Vibrator vibrator = (Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE);
		vibrator.vibrate(200);
	}
	public void setMainHandler(Handler handler){
		mainHandler = handler;//activity所在的Handler对象
	}
}


网友评论    (发表评论)


发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...