Android滑动解锁控件_第1页
Android滑动解锁控件_第2页
Android滑动解锁控件_第3页
Android滑动解锁控件_第4页
Android滑动解锁控件_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Android滑动解锁控件

importandroid.content.Context;

importandroid.graphics.Bitmap;

importandroid.graphics.BitmapFactory;

importandroid.graphics.Canvas;

importandroid.graphics.Rect;

importandroid.os.Handler;

importandroid.os.Message;

importandroid.os.Vibrator;

importandroid.util.AttributeSet;

importandroid.util.Log;

importandroid.view.MotionEvent;

importandroid.view.View;

importandroid.widget.ImageView;

importandroid.widget.RelativeLayout;

importandroid.widget.TextView;

importcom.mosjoy.ad.R;

publicclassSliderRelativeLayoutextendsRelativeLayout{

privatestaticStringTAG="SliderRelativeLayout";

privateTextViewtv_slider_icon=null;//初始控件,用来判断是否为拖动?

privateBitmapdragBitmap=null;//拖拽图片

privateContextmContext=null;//初始化图片拖拽时的Bitmap对象

privateHandlermainHandler=null;//与主Activity通信的Handler对象

privateImageViewmPhoneImageView;

privateImageViewmUnlockImageView;

privateImageViewmMessageImageView;

privateImageViewmCameraImageView;

privatebooleanmStopBoolean=false;

privateCanvasmCanvas;

publicSliderRelativeLayout(Contextcontext){

super(context);

mContext=context;

initDragBitmap();

}

publicSliderRelativeLayout(Contextcontext,AttributeSetattrs)

{

@Override

super(context,attrs,0);

mContext=context;

initDragBitmap();

}

publicSliderRelativeLayout(Contextcontext,AttributeSetattrs,

intdefStyle){

super(context,attrs,defStyle);

mContext=context;

initDragBitmap();

}

//初始化图片拖拽时的Bitmap对象

privatevoidinitDragBitmap(){

if(dragBitmap==null)

dragBitmap=

BitmapFactory.decodeResource(mContext.getResources(),

R.drawable.getup_slider_ico_normal);

}

protectedvoidonFinishInflate(){

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);

}

privateintmLastMoveX=1000;//当前bitmap应该绘制的地方,初

始值为足够大,可以认为看不见

privateintmLastMoveY=1000;//当前bitmap应该绘制的地方,初

始值为足够大,可以认为看不见

publicbooleanonTouchEvent(MotionEventevent){

intx=(int)event.getX();

inty=(int)event.getY();

switch(event.getAction()){

caseMotionEvent.ACTION_DOWN:

mLastMoveX=(int)event.getX();

mLastMoveY=(int)event.getY();

//处理Action_Down事件:判断是否点击了滑动区域

returnhandleActionDownEvenet(event);

caseMotionEvent.ACTION_MOVE:

mLastMoveX=x;//保存了X轴方向

mLastMoveY=y;

invalidate();//重新绘制

returntrue;

caseMotionEvent.ACTION_UP:

//处理Action_Up事件:判断是否解锁成功,成功则结束我们的

Activity;否则,缓慢回退该图片。

handleActionUpEvent(event);

returntrue;

}

returnsuper.onTouchEvent(event);

}

//绘制拖动时的图片

@Override

protectedvoidonDraw(Canvascanvas){

super.onDraw(canvas);

//图片更随手势移动

if(!mStopBoolean){

invalidateDragImg(canvas);

}

mCanvas=canvas;

}

//图片更随手势移动

privatevoidinvalidateDragImg(Canvascanvas){

//Log.e(TAG,"handleActionUpEvenet:invalidateDragImg");

//以合适的坐标值绘制该图片

intdrawXCor=mLastMoveX-dragBitmap.getWidth()/

intdrawYCor=mLastMoveY-dragBitmap.getHeight()/

2;

2;

canvas.drawBitmap(dragBitmap,drawXCor<0?5:drawXCor,

drawYCor,null);

//isHitUnlock(canvas);

}

//手势落下是,是否点中了图片,即是否需要开始移动

privatebooleanhandleActionDownEvenet(MotionEventevent){

Rectrect=newRect();

tv_slider_icon.getHitRect(rect);

booleanisHit=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);

}

returnisHit;

}

//判断是否到达解锁点

privatebooleanisHitUnlock(){

RectphoneRect=newRect();

mPhoneImageView.getHitRect(phoneRect);

RectunlockRect=newRect();

mUnlockImageView.getHitRect(unlockRect);

RectmessageRect=newRect();

mMessageImageView.getHitRect(messageRect);

RectcameraRect=newRect();

mCameraImageView.getHitRect(cameraRect);

//解锁到电话界面

if(phoneRect.contains(mLastMoveX,mLastMoveY)){

mStopBoolean=true;

adStopTwoSecond();

//结束我们的主Activity界面

Messagemsg=newMessage();

msg.what=MainLockActivity.MSG_PHONE_LOCK_SUCESS;

mainHandler.sendMessageDelayed(msg,2*1000);

//

mainHandler.obtainMessage(MainLockActivity.MSG_PHONE_LOCK_SUCESS).sendT

oTarget();

returntrue;

}elseif(unlockRect.contains(mLastMoveX,mLastMoveY)){

mStopBoolean=true;

adStopTwoSecond();

//结束我们的主Activity界面

Messagemsg=newMessage();

msg.what=MainLockActivity.MSG_LOCK_SUCESS;

mainHandler.sendMessageDelayed(msg,21000);

returntrue;

}elseif(messageRect.contains(mLastMoveX,mLastMoveY)){

mStopBoolean=true;

adStopTwoSecond();

//结束我们的主Activity界面

Messagemsg=newMessage();

msg.what=MainLockActivity.MSG_MESSAGE_LOCK_SUCESS;

mainHandler.sendMessageDelayed(msg,21000);

//

mainHandler.obtainMessage(MainLockActivity.MSG_MESSAGE_LOCK_SUCESS).sen

dToTarget();

returntrue;

}elseif(cameraRect.contains(mLastMoveX,mLastMoveY)){

mStopBoolean=true;

adStopTwoSecond();

//结束我们的主Activity界面

Messagemsg=newMessage();

msg.what=MainLockActivity.MSG_CAMERA_LOOK_SUCESS;

mainHandler.sendMessageDelayed(msg,2*1000);

//

mainHandler.obtainMessage(MainLockActivity.MSG_CAMERA_LOOK_SUCESS).send

ToTarget();

returntrue;

}

returnfalse;

}

//回退动画时间间隔值

privatestaticintBACK_DURATION=20;//20ms

//水平方向前进速率

privatestaticfloatVE_HORIZONTAL=0.7f;//0.1dip/ms

//判断松开手指时,是否达到末尾即可以开锁了,是,则开锁,否则,通过一定的算法使其回退。

privatevoidhandleActionUpEvent(MotionEventevent){

intx=(int)event.getX();

inty=(int)event.getY();

//解锁到电话界面

if(isHitUnlock()){

}else{

mStopBoolean=false;

//没有成功解锁,以一定的算法使其回退

//每隔20ms,速率为0.6dip/ms,使当前的图片往后回退一段距

离,直到到达最左端

mLastMoveX=x;//记录手势松开时,当前的坐标位置。intdistance=x-tv_slider_icon.getRight();

//只有移动了足够距离才回退

Log.e(TAG,"handleActionUpEvent:mLastMoveX-->"+

mLastMoveX+"distance-->"+distance);

if(distance>=0)

mHandler.postDelayed(BackDragImgTask,

BACK_DURATION);

else{//复原初始场景

resetViewState();

}

}

}

//暂停两秒

privatevoidadStopTwoSecond(){

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(InterruptedExceptione){

e.printStackTrace();

}

//重置初始的状态,显示tv_slider_icon图像,使bitmap不可见

privatevoidresetViewState(){

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();

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论