| 注册
请输入搜索内容

热门搜索

Java Linux MySQL PHP JavaScript Hibernate jQuery Nginx
fpy7
9年前发布

Android滑动解锁控件

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对象      }  }