版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024婚姻中介服务合同
- 2024年考研时事政治题库含答案(满分必刷)
- 2024年苏教版六年级下册数学期末测试卷及完整答案
- 2024年苏教版六年级下册数学期末测试卷含答案(培优a卷)
- 2024年苏教版六年级下册数学期末测试卷附答案(预热题)
- 2024年西师大版六年级下册数学期末测试卷含答案【研优卷】
- 2024年部编版六年级下册道德与法治期中测试卷含答案(轻巧夺冠)
- 2024年部编版六年级下册道德与法治期中测试卷附参考答案(满分必刷)
- 2024年部编版六年级下册道德与法治期末测试卷及参考答案
- 2024年部编版六年级下册道德与法治期末测试卷含答案(轻巧夺冠)
- 重庆中考:《生物》科目2023-2021年考试真题与参考答案
- 新生儿个案护理汇报-课件
- 怎样上好一堂思政课课件
- 机场能源管理系统介绍
- 2022-2023学年上海市长宁区八年级(下)期末数学试卷(含解析)
- 2022-2023学年江西省南昌市南昌县七年级(下)期末数学试卷
- 国开电大-工程数学(本)-工程数学第4次作业-形考答案
- 健身气功之1568+(双语版)学习通课后章节答案期末考试题库2023年
- 抖音短视频播放数据分析表
- 统编人教版七年级语文下册第25课《活板》优质课件
- 江苏省南京市鼓楼区2021-2022二年级下学期期末语文试卷+答案
评论
0/150
提交评论