android 仿iphoneX上滑退出应用动画(三)

上篇android 仿iphoneX上滑退出应用动画(二)已经说明将滑动条添加上去了,该篇给该滑动条添加滑动监听。

在添加的时候可以看到这句:

mSlideView.setOnTouchListener(setOnTouchSlideListener);


用isGoing和isAnimationBackOver来防止过快点击滑动条造成的程序紊乱,用VelocityTracker获取速度值来判断手指滑动停顿(速度为0),


AnimatorSet mScreenshotAnimation;
    ValueAnimator oneAnimation;
    ValueAnimator twoAnimation ;
    float mScaleX,mScaleY;
    ImageView mBackgroundIv,mIv;
    boolean isOpenRecents = false;
    long firstTime=0;
    boolean isAnimationBackOver = true;
    private boolean isGoing = false;
    private  VelocityTracker  vt=null;
    private boolean isUpOrDownSlide;
    private int widthPixels,heightPixels;
    private View.OnTouchListener setOnTouchSlideListener = new View.OnTouchListener(){

        @Override
        public boolean onTouch(View view, MotionEvent ev) {
            final int action = ev.getAction();
            switch (action){
                case MotionEvent.ACTION_DOWN:
                    long timeNow = System.currentTimeMillis();
                    if(timeNow-firstTime>500){
                        isGoing = true;
                    }else{
                        isGoing = false;
                    }
                    firstTime = timeNow;
                    if(isGoing&&isAnimationBackOver) {
                        WindowManager mWindowManager1 = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
                        Display mDisplay = mWindowManager1.getDefaultDisplay();
                        DisplayMetrics mDisplayMetrics = new DisplayMetrics();
                        mDisplay.getRealMetrics(mDisplayMetrics);
                        Matrix mDisplayMatrix = new Matrix();
                        float[] dims = {mDisplayMetrics.widthPixels, mDisplayMetrics.heightPixels};
                        widthPixels = (int) dims[0];
                        heightPixels = (int) dims[1];
                        if (!topAppClassName.equals("com.android.systemui.recents.RecentsActivity") && !getTopActivityPackageName().equals("com.mediatek.oobe")/*&&!isInLockScreen()*/ && !topAppPackageName.equals("com.hskj.hometest")) {

                        if (vt == null) {
                            //初始化velocityTracker的对象 vt 用来监测motionevent的动作
                            vt = VelocityTracker.obtain();
                        } else {
                            vt.clear();
                        }
                        vt.addMovement(ev);

                        Bitmap mmmBitmap = takeScreenshot();
                        Bitmap mmBitmap = Bitmap.createBitmap(mmmBitmap, 0, statusBarHeight, widthPixels, heightPixels
                                - statusBarHeight);
                        Bitmap mBitmap = getRoundedCornerBitmap(mmBitmap,50f);

                        mBackgroundIv = new ImageView(mContext);

                        BitmapDrawable bitmapDrawable = new BitmapDrawable(mContext.getResources(),
                                "/data/blur_wallpaper.png");
                        mBackgroundIv.setBackground(bitmapDrawable/*BitmapUtils.scaleBitmap(*//*BitmapUtils.getBlurWallpaper(mContext)*//*mmmbitmap,0.5f)*/);
                        mBackgroundIv.setAlpha(0f);
						mBackgroundIv.setScaleX(1.01f);
                        mIv = new ImageView(mContext);
                        mIv.setImageBitmap(BitmapUtils.scaleBitmap(mBitmap,0.5f));
                        final int flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                                | WindowManager.LayoutParams.FLAG_TOUCHABLE_WHEN_WAKING
                                | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
                                | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
                                | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS;
                        final WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
                                ViewGroup.LayoutParams.MATCH_PARENT,
                                ViewGroup.LayoutParams.MATCH_PARENT,
                                WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL,
                                flags,
                                PixelFormat.TRANSLUCENT);
                        lp.flags |= WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED;
                        lp.gravity = Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL;

                        if (getTopActivityPackageName() != "com.hskj.hometest") {
                            if(mBackgroundIv.getParent()==null) {
                                mWindowManager.addView(mBackgroundIv, lp);
                            }
                            if(mIv.getParent()==null) {
                                mWindowManager.addView(mIv, lp);
                            }
                        }
                        mScreenshotAnimation = new AnimatorSet();
                        oneAnimation = createOneAnimation();
                        twoAnimation = createTwoAnimation();
                        mScreenshotAnimation.playSequentially(oneAnimation,twoAnimation);
                        mScreenshotAnimation.setDuration(120);
                         new Handler().postDelayed(new Runnable() {
                                                         @Override
                                                         public void run() {
                                                             mBackgroundIv.setAlpha(1f);
                                                         }
                                                     },100);

                        }
                    }

                    break;
                case MotionEvent.ACTION_MOVE:
                    /*begin add by csc for slide*/
                    if(isGoing&&isAnimationBackOver&&mIv!=null&&!topAppClassName.equals("com.android.systemui.recents.RecentsActivity")&&!getTopActivityPackageName().equals("com.mediatek.oobe")/*&&!isInLockScreen()*/) {
                        if (vt != null) {
                            vt.addMovement(ev);
                            vt.computeCurrentVelocity(1000);
                        }
                        int dy = (int) (ev.getRawY() - mLastY);


                        if (dy < 0) {//down
                            isUpOrDownSlide = false;
                        } else if (dy > 0) {//up
                            isUpOrDownSlide = true;
                        }
                        long instanceY = (int) (ev.getRawY());
                        if(DEBUG)Log.d("chenshichun"," "+this.getClass().getCanonicalName()+" ::::::1instanceY:::"+instanceY);
                        DecimalFormat df = new DecimalFormat("0.00");
                        if (instanceY != 0) {
                         /*instanceY<0*/
                            if (-instanceY < 500&&mIv.getScaleX()>=0.5) {
                                mIv.setScaleX(1 - (float) 0.001 * (heightPixels-instanceY));
                                mIv.setScaleY(1 - (float) 0.001 * (heightPixels-instanceY));
                            }
                        }
                        mLastY = ev.getRawY();
//                if(DEBUG)Log.d("chenshichun"," "+this.getClass().getCanonicalName()+" :::::::vt.getYVelocity::"+ vt.getYVelocity()+":::::::dy::"+dy +"  ::::instanceY:: "+instanceY);
                        if (vt != null) {
                            if (!isOpenRecents && dy == 0 && vt.getYVelocity() < 0.1 && instanceY < heightPixels-200) { // open recents
                                Intent showRecentsIntent = new Intent("OPEN_RECENTS_ACTIVITY");
                                mContext.sendBroadcast(showRecentsIntent);

                                if(!topAppPackageName.equals("com.hskj.hometest")) {
                                    new Handler().postDelayed(new Runnable() {
                                        @Override
                                        public void run() {
                                            mBackgroundIv.setScaleX(0f);
                                            mBackgroundIv.setScaleY(0f);
                                            mBackgroundIv.setAlpha(1f);
                                            mIv.setAlpha(1f);
                                            mWindowManager.removeView(mBackgroundIv);
                                            mWindowManager.removeView(mIv);
                                        }
                                    }, 200);
                                }
                                isOpenRecents = true;                               

                            }
                        }
                    }
                /*end add by csc for slide*/
                    break;
                case MotionEvent.ACTION_UP:
				case MotionEvent.ACTION_CANCEL://added by lzp 
                    /*if(!isInLockScreen()){*/
                    if(isGoing&&isAnimationBackOver) {
                        if (topAppPackageName.equals("com.hskj.hometest")) {
                            if (!isOpenRecents) {
                                Intent showLuncherIntent = new Intent("CLOSE_APP_TO_LUNCHER");
                                mContext.sendBroadcast(showLuncherIntent);
                                isOpenRecents = false;
                            }
                        } else if (getTopActivityPackageName().equals("com.mediatek.oobe")) {
                            Intent showLuncherIntent = new Intent("CLOSE_APP_TO_LUNCHER");
                            mContext.sendBroadcast(showLuncherIntent);
                        } else {
                            if (topAppClassName.equals("com.android.systemui.recents.RecentsActivity")) {
                                if (!isOpenRecents) {
                                    Intent showLuncherIntent = new Intent("CLOSE_APP_TO_LUNCHER");
                                    mContext.sendBroadcast(showLuncherIntent);
                                    isOpenRecents = false;
                                } else {
                                    isOpenRecents = false;
                                }
                            } else {
                                if (mIv != null) {
                                    if (!isOpenRecents) {
                                        if (!isUpOrDownSlide) {// up
                                            mScaleX = mIv.getScaleX();
                                            mScaleY = mIv.getScaleY();
                                            mScreenshotAnimation.start();
                                            Intent showLuncherIntent = new Intent("CLOSE_APP_TO_LUNCHER");
                                            mContext.sendBroadcast(showLuncherIntent);
                                        } else {// down
                                            startAnimatorBack(mIv);
                                        }
                                    } else {
                                        if (mIv != null && mIv.getParent() != null) {
                                            mWindowManager.removeView(mIv);
                                        }

                                        if (mBackgroundIv != null && mBackgroundIv.getParent() != null) {
                                            mWindowManager.removeView(mBackgroundIv);
                                        }
                                    }
                                } else {

                            }
                        }
                        }
                    /*}else{
                        // do noting
                    }*/

                    }
                    break;
            }
            return false;
        }
    };


其中,该方法是将图片处理为圆角

public static Bitmap getRoundedCornerBitmap(Bitmap bitmap,float roundPx){

        Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap
                .getHeight(), Config.ARGB_8888);
        Canvas canvas = new Canvas(output);

        final int color = 0xff424242;
        final Paint paint = new Paint();
        final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
        final RectF rectF = new RectF(rect);

        paint.setAntiAlias(true);
        canvas.drawARGB(0, 0, 0, 0);
        paint.setColor(color);
        canvas.drawRoundRect(rectF, roundPx, roundPx, paint);

        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
        canvas.drawBitmap(bitmap, rect, rect, paint);

        return output;
    }


动画:

    private ValueAnimator createOneAnimation() {
        ValueAnimator anim = ValueAnimator.ofFloat(0f, 1f);
//        anim.setDuration(200);
        anim.setInterpolator(new AccelerateInterpolator());
        anim.addListener(new AnimatorListenerAdapter() {

            @Override
            public void onAnimationStart(Animator arg0) {
                isAnimationBackOver = false;
            }

            @Override
            public void onAnimationRepeat(Animator arg0) {

            }

            @Override
            public void onAnimationEnd(Animator arg0) {
                Intent showLuncherIntent = new Intent("CLOSE_APP_TO_LUNCHER");
                mContext.sendBroadcast(showLuncherIntent);
            }

            @Override
            public void onAnimationCancel(Animator arg0) {

            }
        });
        anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {

            @Override
            public void onAnimationUpdate(ValueAnimator arg0) {
                float t = (Float) arg0.getAnimatedValue();
                    mIv.setScaleX(mScaleX- (mScaleX-0.5f)*t);
                    mIv.setScaleY(mScaleY- (mScaleY-0.5f)*t);
            }
        });
        return anim;
    }

    float mPointX,mPointY;
    private ValueAnimator createTwoAnimation() {
        ValueAnimator anim = ValueAnimator.ofFloat(0f, 0.5f);
//        anim.setDuration(200);
        anim.setInterpolator(new AccelerateInterpolator());
        anim.addListener(new AnimatorListenerAdapter() {

            @Override
            public void onAnimationStart(Animator arg0) {
                mPointX = Settings.Global.getFloat(mContext.getContentResolver(), "launcher_x", 0f);
                mPointY = Settings.Global.getFloat(mContext.getContentResolver(), "launcher_y", 0f);
            }

            @Override
            public void onAnimationRepeat(Animator arg0) {

            }

            @Override
            public void onAnimationEnd(Animator arg0) {
                mBackgroundIv.setAlpha(1f);
                mIv.setAlpha(1f);
                mBackgroundIv.setScaleX(0f);
                mBackgroundIv.setScaleY(0f);
                isOpenRecents = false;
                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        mWindowManager.removeView(mBackgroundIv);
                        mWindowManager.removeView(mIv);
                        isAnimationBackOver = true;
                    }
                },500);
            }

            @Override
            public void onAnimationCancel(Animator arg0) {

            }
        });

        anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {

            @Override
            public void onAnimationUpdate(ValueAnimator arg0) {
                float t = (Float) arg0.getAnimatedValue();
                    mIv.setScaleX(0.5f - t);
                    mIv.setScaleY(0.5f - t);
                    mIv.setPivotX(t*(mPointX-widthPixels/2)/0.5f+widthPixels/2);
                    mIv.setPivotY(t*(mPointY-heightPixels/2)/0.5f+heightPixels/2);
            }
        });
        return anim;
    }

    private void startAnimatorBack(ImageView mImageView) {
        //透明动画
        AnimatorSet set = new AnimatorSet();
        ObjectAnimator animatorX = ObjectAnimator.ofFloat(mImageView, "scaleX", mIv.getScaleX(), 1f);
        ObjectAnimator animatorY = ObjectAnimator.ofFloat(mImageView, "scaleY", mIv.getScaleX(), 1f);
        set.playTogether(animatorX, animatorY);
        set.setInterpolator(new AccelerateInterpolator());
        set.setDuration(100);
        //为动画设置监听
        set.addListener(new Animator.AnimatorListener() {
            @Override
            public void onAnimationStart(Animator animator) {
                isAnimationBackOver = false;
            }

            @Override
            public void onAnimationEnd(Animator animator) {
                mWindowManager.removeView(mBackgroundIv);
                mWindowManager.removeView(mIv);
                isAnimationBackOver = true;
            }

            @Override
            public void onAnimationCancel(Animator animator) {

            }

            @Override
            public void onAnimationRepeat(Animator animator) {

            }
        });
        set.start();

    }



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
仿iPhone热门应用栏是一个非常流行的产品趋势,许多手机品牌已经开始推出类似的产品。仿iPhone热门应用栏是指手机系统底部的一排常用应用图标,用户可以轻松访问和切换这些应用程序。 优点: 1. 提高用户体验:仿iPhone热门应用栏将常用的应用程序放置在屏幕底部,用户可以轻松地操作和访问这些应用。这种设计提高了用户的便利性和操作效率。 2. 提升工作效率:对于经常使用特定应用程序的用户来说,将它们放在热门应用栏中可以节省寻找和打开应用的时间,提高工作效率。 3. 可定制性:用户可以根据自己的需求和喜好,在热门应用栏中添加或删除特定的应用程序。这种可定制性使得用户可以根据自己的使用习惯进行个性化设置。 缺点: 1. 屏幕空间受限:仿iPhone热门应用栏通常会占据屏幕底部的一部分空间,可能会减少用户在其他应用程序中可见的屏幕空间。这对于一些需要较大屏幕空间才能展示内容的应用程序来说可能是一个问题。 2. 可能存在兼容性问题:由于不同手机品牌和操作系统之间存在差异,仿iPhone热门应用栏可能在某些设备上无法正常运行或显示。这需要开发人员在设计和开发过程中考虑到兼容性问题。 总结: 仿iPhone热门应用栏是一种流行的设计趋势,它提供了一种方便和高效的方式来访问和切换常用应用程序。虽然它具有许多优点,但也存在一些限制和挑战,特别是在屏幕空间和设备兼容性方面。因此,在设计和实施仿iPhone热门应用栏时,需要综合考虑这些因素,并根据特定的用户需求进行定制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值