中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

Android滑動(dòng)解鎖控件

2018-07-20    來(lái)源:open-open

容器云強(qiáng)勢(shì)上線(xiàn)!快速搭建集群,上萬(wàn)Linux鏡像隨意使用
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; // 初始控件,用來(lái)判斷是否為拖動(dòng)?
    private Bitmap dragBitmap = null; //拖拽圖片
    private Context mContext = null; // 初始化圖片拖拽時(shí)的Bitmap對(duì)象
    private Handler mainHandler = null; //與主Activity通信的Handler對(duì)象
    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();
    }
     
    // 初始化圖片拖拽時(shí)的Bitmap對(duì)象
    private void initDragBitmap() {
        if (dragBitmap == null)
            dragBitmap = BitmapFactory.decodeResource(mContext.getResources(),
                    R.drawable.getup_slider_ico_normal);
    }
     
    @Override
    protected void onFinishInflate() {
        super.onFinishInflate();
        // 該控件主要判斷是否處于滑動(dòng)點(diǎn)擊區(qū)域;瑒(dòng)時(shí) 處于INVISIBLE(不可見(jiàn))狀態(tài),滑動(dòng)時(shí)處于VISIBLE(可見(jiàn))狀態(tài)
        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;  //當(dāng)前bitmap應(yīng)該繪制的地方 , 初始值為足夠大,可以認(rèn)為看不見(jiàn)
    private int mLastMoveY = 1000;  //當(dāng)前bitmap應(yīng)該繪制的地方 , 初始值為足夠大,可以認(rèn)為看不見(jiàn)
    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事件:  判斷是否點(diǎn)擊了滑動(dòng)區(qū)域
            return handleActionDownEvenet(event);
        case MotionEvent.ACTION_MOVE:
            mLastMoveX = x; //保存了X軸方向
            mLastMoveY = y;
            invalidate(); //重新繪制   
            return true;
        case MotionEvent.ACTION_UP:
            //處理Action_Up事件:  判斷是否解鎖成功,成功則結(jié)束我們的Activity ;否則 ,緩慢回退該圖片。
            handleActionUpEvent(event);
            return true;
        }
        return super.onTouchEvent(event);
    }
 
    // 繪制拖動(dòng)時(shí)的圖片
    @Override
    protected void onDraw (Canvas canvas) {
        super.onDraw(canvas);      
        // 圖片更隨手勢(shì)移動(dòng)
        if (!mStopBoolean) {
            invalidateDragImg(canvas);
        }
        mCanvas = canvas;
    }
 
    // 圖片更隨手勢(shì)移動(dòng)
    private void invalidateDragImg(Canvas canvas) {
        //Log.e(TAG, "handleActionUpEvenet : invalidateDragImg" );
        //以合適的坐標(biāo)值繪制該圖片
        int drawXCor = mLastMoveX - dragBitmap.getWidth()/2;
        int drawYCor = mLastMoveY - dragBitmap.getHeight()/2;
        canvas.drawBitmap(dragBitmap,  drawXCor < 0 ? 5 : drawXCor , drawYCor , null);
//      isHitUnlock(canvas);
    }
 
    // 手勢(shì)落下是,是否點(diǎn)中了圖片,即是否需要開(kāi)始移動(dòng)
    private boolean handleActionDownEvenet(MotionEvent event) {
        Rect rect = new Rect();
        tv_slider_icon.getHitRect(rect);
        boolean isHit = rect.contains((int) event.getX(), (int) event.getY());
        //開(kāi)始拖拽 ,隱藏該圖片
        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;
    }
 
    //判斷是否到達(dá)解鎖點(diǎn)
    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);
        //解鎖到電話(huà)界面
        if(phoneRect.contains(mLastMoveX,mLastMoveY)){
            mStopBoolean = true;
            adStopTwoSecond();
           //結(jié)束我們的主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();
            //結(jié)束我們的主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();
            //結(jié)束我們的主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();
            //結(jié)束我們的主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;
    }
     
    //回退動(dòng)畫(huà)時(shí)間間隔值
    private static int BACK_DURATION = 20 ;   // 20ms
    //水平方向前進(jìn)速率
    private static float VE_HORIZONTAL = 0.7f ;  //0.1dip/ms
    //判斷松開(kāi)手指時(shí),是否達(dá)到末尾即可以開(kāi)鎖了 , 是,則開(kāi)鎖,否則,通過(guò)一定的算法使其回退。
    private void handleActionUpEvent(MotionEvent event){       
        int x = (int) event.getX() ;   
        int y = (int)event.getY();
        //解鎖到電話(huà)界面
        if(isHitUnlock()){
        }else {
            mStopBoolean = false;
            //沒(méi)有成功解鎖,以一定的算法使其回退
            //每隔20ms , 速率為0.6dip/ms ,  使當(dāng)前的圖片往后回退一段距離,直到到達(dá)最左端  
            mLastMoveX = x ;  //記錄手勢(shì)松開(kāi)時(shí),當(dāng)前的坐標(biāo)位置。
            int distance = x - tv_slider_icon.getRight() ;
            //只有移動(dòng)了足夠距離才回退
            Log.e(TAG, "handleActionUpEvent : mLastMoveX -->" + mLastMoveX + " distance -->" + distance );
            if(distance >= 0)
                mHandler.postDelayed(BackDragImgTask, BACK_DURATION);
            else{  //復(fù)原初始場(chǎng)景
                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();
//      }
    }
     
    //重置初始的狀態(tài),顯示tv_slider_icon圖像,使bitmap不可見(jiàn)
    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();        //重繪最后一次
    }
     
    //通過(guò)延時(shí)控制當(dāng)前繪制bitmap的位置坐標(biāo)
    private Runnable BackDragImgTask = new Runnable(){
        public void run(){
            //一下次Bitmap應(yīng)該到達(dá)的坐標(biāo)值
            mLastMoveX = mLastMoveX - (int)(BACK_DURATION * VE_HORIZONTAL);
            invalidate();//重繪      
            //是否需要下一次動(dòng)畫(huà) ? 到達(dá)了初始位置,不在需要繪制
            boolean shouldEnd = Math.abs(mLastMoveX - tv_slider_icon.getRight()) <= 8 ;         
            if(!shouldEnd)
                mHandler.postDelayed(BackDragImgTask, BACK_DURATION);
            else { //復(fù)原初始場(chǎng)景
                resetViewState();  
            }              
        }
    };
     
    private Handler mHandler =new Handler (){
        public void handleMessage(Message msg){
        }
    };
    //震動(dòng)一下下咯
    private void virbate(){
        Vibrator vibrator = (Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE);
        vibrator.vibrate(200);
    }
    public void setMainHandler(Handler handler){
        mainHandler = handler;//activity所在的Handler對(duì)象
    }
}

標(biāo)簽: 通信

版權(quán)申明:本站文章部分自網(wǎng)絡(luò),如有侵權(quán),請(qǐng)聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點(diǎn)!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請(qǐng)與原作者聯(lián)系。

上一篇:查看Tomcat內(nèi)存使用情況的JSP代碼

下一篇:將log4j的日志配置輸出到mysql中