1、Android滑动解锁控件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;im
2、port 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 = SliderRelativ
3、eLayout;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 ImageVie
4、w 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,
5、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.decodeResou
6、rce(mContext.getResources(), R.drawable.getup_slider_ico_normal);Overrideprotected void onFinishInflate() super.onFinishInflate(); / 该控件主要判断是否处于滑动点击区域。滑动时 处于INVISIBLE(不可见)状态,滑动时处于VISIBLE(可见)状态 tv_slider_icon = (TextView) findViewById(R.id.slider_icon); mPhoneImageView = (ImageView) findViewById(R.id
7、.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; /当前bitma
8、p应该绘制的地方 , 初始值为足够大,可以认为看不见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 handleAction
9、DownEvenet(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);/ 绘制拖动时的图片Overridep
10、rotected 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.ge
11、tWidth()/2; int drawYCor = mLastMoveY - dragBitmap.getHeight()/2; canvas.drawBitmap(dragBitmap, drawXCor + mLastMoveX + distance - + distance ); if(distance = 0) mHandler.postDelayed(BackDragImgTask, BACK_DURATION); else /复原初始场景 resetViewState(); /暂停两秒private void adStopTwoSecond() mPhoneImageView.s
12、etVisibility(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
13、) / 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.setVisibilit
14、y(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();/重绘 /是否需要下一次动画 ? 到达了初始位置,
15、不在需要绘制 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对象
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1