80,351
社区成员
发帖
与我相关
我的任务
分享
@SuppressLint({ "NewApi", "HandlerLeak" })
public class MySlideLockView extends RelativeLayout {
private AnimationDrawable animatedw;
private ImageView leftIv=null;
private ImageView animateIv=null;
private ImageView rightIv=null;
private Bitmap dragBitmap=null;
private Context mContext=null;
private View conView=null;
private Handler mainHandler=null;
private int startBoundar=0;
private int endBoundar=0;
private int viewLength=0;
private int leftBoundar=0;
private int rightBoundar=0;
private int startPoint=0;
private int centerPoint=0;
private int endPoint=0;
public MySlideLockView(Context context) {
super(context);
mContext = context;
setWillNotDraw(false);
init();
}
public MySlideLockView(Context context, AttributeSet attrs) {
super(context, attrs);
mContext = context;
setWillNotDraw(false);
init();
}
public MySlideLockView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
mContext = context;
setWillNotDraw(false);
init();
}
private void init(){
dragBitmap = BitmapFactory.decodeResource(mContext.getResources(),
R.drawable.getup_slider_ico_pressed);
conView=LayoutInflater.from(mContext).inflate(R.layout.myslideview, this, true);
leftIv=(ImageView)conView.findViewById(R.id.leftImage);
animateIv=(ImageView)conView.findViewById(R.id.animateImage);
rightIv=(ImageView)conView.findViewById(R.id.rightImage);
animatedw=(AnimationDrawable)animateIv.getBackground();
animatedw.start();
}
int currentX=1000;
@SuppressLint("ClickableViewAccessibility")
@Override
public boolean onTouchEvent(MotionEvent event){
int x=(int)event.getX();
switch(event.getAction()){
case MotionEvent.ACTION_DOWN:
currentX = (int) event.getX();
return handleDownEvent(event);
case MotionEvent.ACTION_MOVE:
currentX = x;
invalidate();
return true;
case MotionEvent.ACTION_UP:
handleUpEvent(event);
return true;
}
return super.onTouchEvent(event);
}
private boolean handleDownEvent(MotionEvent event) {
Rect rect=new Rect();
leftIv.getHitRect(rect);
boolean isHit = rect.contains((int) event.getX(), (int) event.getY());
if(isHit){
leftIv.setVisibility(View.INVISIBLE);
}
return isHit;
}
private static int BACK_DURATION = 1000 ;
private static float VE_HORIZONTAL = 0.007f ; //0.1dip/ms
private void handleUpEvent(MotionEvent event) {
startBoundar=leftIv.getLeft();
endBoundar=rightIv.getRight();
viewLength=endBoundar-startBoundar;
leftBoundar=viewLength/4+startBoundar;
rightBoundar=viewLength/4*3+startBoundar;
startPoint=startBoundar+leftIv.getWidth()/2;
centerPoint=viewLength/2+startBoundar;
endPoint=endBoundar-leftIv.getWidth()/2;
int x=(int)event.getX();
if(x<leftBoundar){
currentX=x;
int distance=x-startPoint;
if(distance>=2){
mHandler.postDelayed(BackDragImgTask, BACK_DURATION);
}else{
resetViewState();
}
}else if(x>=leftBoundar&&x<rightBoundar){
if(x<=centerPoint){
currentX=x;
int dis=centerPoint-currentX;
if(dis>=2){
mHandler.postDelayed(BackDragImgTask3, BACK_DURATION);
}else{
resetViewState();
virbate();
mainHandler.obtainMessage(0).sendToTarget();
}
}else{
currentX=x;
int dis=currentX-centerPoint;
if(dis>=2){
mHandler.postDelayed(BackDragImgTask4, BACK_DURATION);
}else{
resetViewState();
virbate();
mainHandler.obtainMessage(0).sendToTarget();
}
}
}else if(x>=rightBoundar){
if(x<=endPoint){
currentX=x;
int dis=endPoint-currentX;
if(dis>=2){
mHandler.postDelayed(BackDragImgTask2, BACK_DURATION);
}else{
resetViewState();
virbate();
mainHandler.obtainMessage(1).sendToTarget();
}
}else if(x>endPoint){
currentX=x;
int dis=currentX-endPoint;
if(dis>=2){
mHandler.postDelayed(BackDragImgTask5, BACK_DURATION);
}else{
resetViewState();
virbate();
mainHandler.obtainMessage(1).sendToTarget();
}
}
}
}
private void resetViewState() {
leftIv.setVisibility(View.VISIBLE);
currentX=1000;
invalidate();
}
private void virbate() {
Vibrator vibrator = (Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE);
vibrator.vibrate(200);
}
private Runnable BackDragImgTask5 = new Runnable(){
public void run(){
Log.e("backDragImgTask","555555555555");
currentX =currentX - (int)(BACK_DURATION * VE_HORIZONTAL);
invalidate();
boolean shouldEnd = currentX-endPoint <= 2 ;
if(!shouldEnd)
mHandler.postDelayed(BackDragImgTask5, BACK_DURATION);
else {
resetViewState();
virbate();
mainHandler.obtainMessage(2).sendToTarget();
mHandler.removeCallbacks(BackDragImgTask5);
}
}
};
private Runnable BackDragImgTask2 = new Runnable(){
public void run(){
Log.e("backDragImgTask","22222222222222");
currentX =currentX + (int)(BACK_DURATION * VE_HORIZONTAL);
invalidate();
boolean shouldEnd = Math.abs(endPoint-currentX) <= 2 ;
if(!shouldEnd)
mHandler.postDelayed(BackDragImgTask2, BACK_DURATION);
else {
resetViewState();
virbate();
mainHandler.obtainMessage(2).sendToTarget();
mHandler.removeCallbacks(BackDragImgTask2);
}
}
};
private Runnable BackDragImgTask = new Runnable(){
public void run(){
Log.e("backDragImgTask","11111111111");
currentX = currentX - (int)(BACK_DURATION * VE_HORIZONTAL);
invalidate();
boolean shouldEnd = Math.abs(currentX - startPoint) <= 2 ;
if(!shouldEnd)
mHandler.postDelayed(BackDragImgTask, BACK_DURATION);
else {
resetViewState();
virbate();
mainHandler.obtainMessage(0).sendToTarget();
mHandler.removeCallbacks(BackDragImgTask);
}
}
};
private Runnable BackDragImgTask3 = new Runnable(){
public void run(){
Log.e("backDragImgTask","333333333333");
currentX =currentX + (int)(BACK_DURATION * VE_HORIZONTAL);
invalidate();
boolean shouldEnd =centerPoint-currentX<= 2 ;
if(!shouldEnd)
mHandler.postDelayed(BackDragImgTask3, BACK_DURATION);
else {
resetViewState();
virbate();
mainHandler.obtainMessage(1).sendToTarget();
mHandler.removeCallbacks(BackDragImgTask3);
}
}
};
private Runnable BackDragImgTask4 = new Runnable(){
public void run(){
Log.e("backDragImgTask","44444444444");
currentX =currentX - (int)(BACK_DURATION * VE_HORIZONTAL);
invalidate();
boolean shouldEnd =currentX-centerPoint<= 2 ;
if(!shouldEnd)
mHandler.postDelayed(BackDragImgTask4, BACK_DURATION);
else {
resetViewState();
virbate();
mainHandler.obtainMessage(1).sendToTarget();
mHandler.removeCallbacks(BackDragImgTask4);
}
}
};
private Handler mHandler =new Handler (){
public void handleMessage(Message msg){
}
};
@Override
public void onDraw(Canvas canvas){
super.onDraw(canvas);
int drawXCor = currentX-leftIv.getWidth()/2;
int drawYCor = leftIv.getTop();
canvas.drawBitmap(dragBitmap, drawXCor < 0 ? 5 : drawXCor , drawYCor , null);
}
public void setMainHandler(Handler handler){
mainHandler = handler;
}
}