当前位置: 首页 > 工具软件 > SlideView > 使用案例 >

SlideView关机界面实现

酆阳煦
2023-12-01

主class 用来控制viewdialog的显示

    package com.android.server.policy;  

    import android.app.AlertDialog;  
    import android.app.StatusBarManager;  
    import android.os.Handler;  
    import android.os.Message;  
    import android.os.RemoteException;  
    import android.os.ServiceManager;  
    import android.os.SystemClock;  
    import android.util.Log;  
    import android.view.IWindowManager;  
    import android.view.KeyEvent;  
    import android.view.LayoutInflater;  
    import android.view.View;  
    import android.view.Window;  
    import android.view.WindowManager;  
    import android.view.animation.Animation;  
    import android.view.animation.TranslateAnimation;  
    import android.widget.Button;  
    import android.widget.LinearLayout;  
    import android.content.BroadcastReceiver;  
    import android.content.Context;  
    import android.content.Intent;  
    import android.content.IntentFilter;  
    //import android.widget.SlideBar;  
    import com.android.internal.R;  
    import android.widget.ImageView;  
    import android.view.MotionEvent;  
    import android.view.View.OnTouchListener;  
    import android.util.Log;  
    import android.widget.FrameLayout;  
    import android.graphics.Canvas;  
    import android.graphics.Color;  
    import android.graphics.Paint;  
    import android.graphics.Path;  
    import android.graphics.RectF;  
    import android.graphics.Bitmap;  
    import android.graphics.PixelFormat;  
    import android.graphics.drawable.Drawable;  
    import android.util.AttributeSet;  
    import android.graphics.drawable.BitmapDrawable;  
    import android.view.Display;  
    import android.view.WindowManager;  



    //import com.android.internal.widget.SlideView;  

    //import android.view.WindowManagerPolicy.WindowManagerFuncs;  
    import android.view.WindowManagerPolicy.WindowManagerFuncs;  
    import android.view.Gravity;  
    import android.app.WallpaperManager;  
    import android.graphics.Bitmap.Config;  
    import android.graphics.drawable.BitmapDrawable;  

    //added by wangchengju for shutdown  

    public class IphoneShutdownDialog {  

        private static String TAG = "IphoneShutdownDialog";  
        private int mStyleId;  
        private boolean mIsRestore = false;  
        private View view ;  
        private StatusBarManager mStatusBar;  
        private Context mContext;  
        private final WindowManagerFuncs mWindowManagerFuncs;//added by wangchengju for shutdown  
        private static final int MESSAGE_DISMISS = 0;  
        static final String SYSTEM_DIALOG_REASON_KEY = "reason";  
        static final String SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS = "globalactions";  
        int mdownx,mdowny;  
        boolean ispowerdown=false;  
        private WallpaperManager wpm;   
        private FrameLayout mgradientView;  
        private WindowManager mWindowManager;  
        private WindowManager.LayoutParams mFrameLayoutParams;  
        private FrameLayout mFrameLayout;  



        public IphoneShutdownDialog(Context context, WindowManagerFuncs windowManagerFuncs)  

          {  
            Log.d(TAG,"denghaigui construction");  
            mContext = context;  
            mWindowManagerFuncs = windowManagerFuncs;//added by wangchengju for shutdown  
            mStatusBar = (StatusBarManager)mContext.getSystemService(Context.STATUS_BAR_SERVICE);  
            IntentFilter filter = new IntentFilter();  
            filter.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);  
            filter.addAction(Intent.ACTION_SCREEN_OFF);  
            filter.addAction(Intent.ACTION_WALLPAPER_CHANGED);  
            context.registerReceiver(mBroadcastReceiver, filter);  
                wpm = (WallpaperManager) mContext.getSystemService(mContext.WALLPAPER_SERVICE);  

        }  
         public  Bitmap drawableToBitmap(Drawable drawable) {  
            Bitmap bitmap = Bitmap.createBitmap(  
            drawable.getIntrinsicWidth(),  
            drawable.getIntrinsicHeight(),  
            drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888  
            : Bitmap.Config.RGB_565);  
            Canvas canvas = new Canvas(bitmap);  
            // canvas.setBitmap(bitmap);  
            drawable.setBounds(0, 0, drawable.getIntrinsicWidth(),  
                    drawable.getIntrinsicHeight());  
            drawable.draw(canvas);  
            return bitmap;  
        }  
        /* public Drawable getBitmapDrawable(View views){ 
            WindowManager windowManager = (WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE); 
                  Display display = windowManager.getDefaultDisplay();  
                  int w = display.getWidth();  
                  int h = display.getHeight();  

                  Bitmap Bmp = Bitmap.createBitmap( w, h, Config.ARGB_8888 );      
                  View decorview = views.getWindow().getDecorView();   
                  decorview.setDrawingCacheEnabled(true);   
                  Bmp = decorview.getDrawingCache();   
            Drawable drawable =new BitmapDrawable(Bmp); 
            return drawable; 
        }*/  

               private void initWindowsView() {  
           if (mWindowManager == null)  
                mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);  

            mFrameLayoutParams = new WindowManager.LayoutParams(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);  
            mFrameLayoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ERROR;//  
            mFrameLayoutParams.format = PixelFormat.RGBA_8888;  
            resetWindowParamsFlags();  
            mFrameLayoutParams.gravity = Gravity.TOP | Gravity.START;  
            mFrameLayout = new FrameLayout(mContext);  

                 mFrameLayout.setSystemUiVisibility(  
                View.SYSTEM_UI_FLAG_LAYOUT_STABLE  
                     | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION  
                     | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN  
                     | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY  
                     | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);  
            mWindowManager.addView(mFrameLayout, mFrameLayoutParams);  
        }  

           private void resetWindowParamsFlags() {  
         mFrameLayoutParams.flags = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON  
                    | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD  
                    | WindowManager.LayoutParams.FLAG_FULLSCREEN  
                    | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE  
                    | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS  
                    | WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR;  



        }  
        private void removeView(){  

             mFrameLayout.removeAllViews();  
                  mWindowManager.removeViewImmediate(mFrameLayout);  
               view=null;  
               mFrameLayout = null;  
                  mWindowManager = null;  

             }  
        public void showDialog(boolean keyguardShowing)  

        {  
        Log.d("PhoneShutdownDialog","denghaigui showDialog");  
           initWindowsView();  
            //create Dialog  
            if(view == null){  
                 LayoutInflater inflater =  LayoutInflater.from(mContext) ;  
                 view = inflater.inflate(R.layout.iphone_shutdown_dialog, null, false) ;        
              mFrameLayout.addView(view);  
             Bitmap image = drawableToBitmap(wpm.getDrawable());  
                image = Blur.fastblur(mContext, image,25);  
                BitmapDrawable bt = new BitmapDrawable(image);  
                Blur.setDrawable(bt);  

            }else{  
               Log.d("PhoneShutdownDialog","denghaigui view is not null");  
          }          

             Drawable bt = Blur.getDrawable();  
            if(bt!=null){  
                view.setBackground(bt);  
            }  

          mgradientView = (FrameLayout)view.findViewById(R.id.gradientView_layout);  
          FrameLayout slide_shutdown = (FrameLayout)view.findViewById(R.id.slide_layout);  
          SlideView mslideview=new SlideView(mContext);  
          android.widget.FrameLayout.LayoutParams layoutparams = new android.widget.FrameLayout.LayoutParams(524, 150,Gravity.CENTER);  
          slide_shutdown.addView(mslideview,0,layoutparams);  
            final LinearLayout cancelShutdown = (LinearLayout)view.findViewById(R.id.cancelShutdown) ;  

            Button cancelShutdownBtn = (Button)view.findViewById(R.id.cancelShutdownBtn) ;  
            cancelShutdownBtn.setPressed(false);  
            cancelShutdownBtn.setOnClickListener(new View.OnClickListener() {  
                public void onClick(View v) {  
                    removeView();  

                  //  playCloseAnimation(shutdownTab, cancelShutdown) ;  
                }  
            }) ;  

            //play open animation  
    //        playOpenAnimation(shutdownTab, cancelShutdown) ;  

            mStatusBar.disable(StatusBarManager.DISABLE_EXPAND);  

        }  


        public void dismissDialog()  
        {  
            removeView();  
            mStatusBar.disable(StatusBarManager.DISABLE_NONE);  

        }  

        private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {  
            public void onReceive(Context context, Intent intent) {  
                String action = intent.getAction();  
                if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(action)  
                        || Intent.ACTION_SCREEN_OFF.equals(action)) {  
                    String reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY);  
                    if (!SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS.equals(reason)) {  
                        mHandler.sendEmptyMessage(MESSAGE_DISMISS);  
                    }  
                }   
                if(action.equals(Intent.ACTION_WALLPAPER_CHANGED)){  
                    Bitmap image = drawableToBitmap(wpm.getDrawable());  
                    image = Blur.fastblur(context, image,25);  
                    BitmapDrawable bt = new BitmapDrawable(image);  
                    Blur.setDrawable(bt);  
                }  
            }  
        };  


        private Handler mHandler = new Handler() {  
            public void handleMessage(Message msg) {  
                if (msg.what == MESSAGE_DISMISS) {  
                    if (view != null) {  
                        dismissDialog();  
                    }  
                }  
            }  
        };  



        public class SlideView extends View  
        {  
        public float mTouchX;   
        private Drawable mSlideDrawable;  
        public float mDownX,mdx;   


        private boolean isPower=false;  
        private Context mContext;  
        public SlideView(Context context, AttributeSet attrs) {  
            this(context);  
        }  


        public SlideView(Context context) {  
            super(context);  
            mContext=context;  
            mSlideDrawable = context.getResources().getDrawable(R.drawable.slide_touch_icon);  
        }  


        @Override  
        protected void onDraw(Canvas canvas) {  
            super.onDraw(canvas);  
            if(mdx>374)mdx=374;  
            if(mdx<0)mdx=0;  
            Paint mPaint=new Paint(Paint.ANTI_ALIAS_FLAG);  
            mPaint.setColor(Color.WHITE);  
            mPaint.setAlpha(200);  

            canvas.save();  
            Path path=new Path();  
            RectF rect=new RectF(mdx, 0, 434, 120);  
         canvas.drawRoundRect(rect, 72, 72, mPaint);  
            canvas.restore();  
            canvas.drawBitmap(((BitmapDrawable) mSlideDrawable).getBitmap(), mdx+5, 5,null);      
      }  

        @Override  
        public boolean onTouchEvent(MotionEvent ev) {       
             int action = ev.getAction();  
            switch (action) {  
                case MotionEvent.ACTION_DOWN:   
                    mDownX=ev.getX();    
                    isPower=true;  
                    //mgradientView.setVisibility(8);  
                  break;             

                case MotionEvent.ACTION_MOVE:      
                    mgradientView.setVisibility(8);  
                    mTouchX = ev.getX();  
                    if(mTouchX <= mDownX)  
                    {  
                        mdx=0;  
                        mgradientView.setVisibility(0);  
                    }  
                    else  
                        mdx=(mTouchX-mDownX);  
                    invalidate();    
                    if(mdx>374)  
                        isPower=false;  
                    else  
                        isPower=true;  

                break;  

                case MotionEvent.ACTION_UP:  
                case MotionEvent.ACTION_CANCEL:     
                    if(isPower==true){  
                        mgradientView.setVisibility(0);  
                        mdx=0;  
                        invalidate();    
                    }  
                    else  
                        mWindowManagerFuncs.shutdown(false);  

                    break;  
          }  
            return true;  
        }  

    }  
    }  

GradientPowerView.java 用来做滑块和写入滑块中的文字显示

    package com.android.server.policy;  



    import android.animation.ValueAnimator;  
    import android.animation.ValueAnimator.AnimatorUpdateListener;  
    import android.content.Context;  
    import android.content.res.TypedArray;  
    import android.graphics.Canvas;  
    import android.graphics.Color;  
    import android.graphics.LinearGradient;  
    import android.graphics.Paint;  
    import android.graphics.Shader;  
    import android.graphics.drawable.BitmapDrawable;  
    import android.graphics.drawable.Drawable;  
    import android.util.AttributeSet;  
    import android.util.Log;  
    import android.view.View;  
    import android.view.animation.Animation;  
    import com.android.internal.R;  
    import android.graphics.Typeface;  

    public class GradientPowerView extends View {  


        private static final  String  TAG = "GradientPowerView";  
        private static final boolean DEBUG = false;  
        private float   mIndex = 0;  
        private Shader  mShader;  
        private int     mTextSize;    
        private static final int mUpdateStep = 15;  
        private static final int mMaxWidth = 40 * mUpdateStep; // 26*25   
        private static final int mMinWidth = 6 * mUpdateStep;  // 5*25  
        int             mDefaultColor;  
        int             mSlideColor;  
        private ValueAnimator animator;  
        private int mWidth,mHeight;  
        private String mStringToShow;  
        private Paint mTextPaint;  
        private float mTextHeight;  
        private Drawable mSlideIcon;  
        private int mSlideIconHeight;  
        private static final int mSlideIconOffSetTop = 20;  
        private static final String ANDROID_CLOCK_FONT_FILE = "/system/fonts/ASans.ttf";  

        private AnimatorUpdateListener mAnimatorUpdateListener = new AnimatorUpdateListener() {  

            @Override  
            public void onAnimationUpdate(ValueAnimator animation) {  
                mIndex =Float.parseFloat(animation.getAnimatedValue().toString());  
                // RadialGradient SweepGradient  
                mShader = new LinearGradient(mIndex - 20 * mUpdateStep, 100,  
                        mIndex, 100, new int[] { mDefaultColor, mDefaultColor, mDefaultColor,mSlideColor,  
                        mSlideColor, mDefaultColor, mDefaultColor, mDefaultColor }, null,  
                        Shader.TileMode.CLAMP);  

                postInvalidate();  

            }  
        };  

        public GradientPowerView(Context context) {  
            super(context);  
        }  


        public GradientPowerView(Context context, AttributeSet attrs) {  
            super(context, attrs);  
            TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.GradientView);  
            mStringToShow = a.getString(R.styleable.GradientView_text) ;  
            mTextSize = (int)a.getDimension(R.styleable.GradientView_textSize, 40);  
            mDefaultColor = a.getColor(R.styleable.GradientView_textColor, Color.GRAY);  
            mSlideColor = a.getColor(R.styleable.GradientView_SlideColor, Color.WHITE);  
            mSlideIcon = context.getResources().getDrawable(R.drawable.slide_icon);  
            mSlideIconHeight = mSlideIcon.getMinimumHeight();  
            a.recycle();  

            animator = ValueAnimator.ofFloat(mMinWidth,mMaxWidth);  
            animator.setDuration(1800);  
            animator.addUpdateListener(mAnimatorUpdateListener);  
            animator.setRepeatCount(Animation.INFINITE);//repeat animation  
            animator.start();  


            mTextPaint = new Paint();  
            mTextPaint.setAntiAlias(true);  
            mTextPaint.setColor(mSlideColor);  
            mTextPaint.setTextSize(mTextSize);   
            mTextPaint.setTextAlign(Paint.Align.CENTER);  
    //      mTextPaint.setTypeface(Typeface.createFromFile(ANDROID_CLOCK_FONT_FILE));   

            mTextHeight = mTextPaint.ascent();  

            setFocusable(true);  
        }  

        @Override  
        protected void onDraw(Canvas canvas) {  
            if(DEBUG)  
            Log.w(TAG, "b onDraw()");  
            mTextPaint.setShader(mShader);  
                    Log.i("denghaigui","mWidth is: "+mWidth +"Height is: "+mHeight+ "mTextHeight: "+mTextHeight);  
            canvas.drawText(mStringToShow, (mWidth+30)/2, mHeight / 2 - mTextHeight  
                    / 2 - mSlideIconOffSetTop, mTextPaint); // slide_unlock  
        }   



        public void stopAnimatorAndChangeColor() {  
            //if(DEBUG)  
            Log.w(TAG, "stopGradient");  
            animator.cancel();  
            //reset  
            mShader = new LinearGradient(0, 100, mIndex, 100,  
                    new int[] {mSlideColor, mSlideColor},  
                    null, Shader.TileMode.CLAMP);  
            invalidate();  
        }  

        public void startAnimator() {  
            if(DEBUG)  
            Log.w(TAG, "startGradient");  
            animator.start();  
        }  

        @Override  
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);  
            mWidth = MeasureSpec.getSize(widthMeasureSpec);  
            mHeight = MeasureSpec.getSize(heightMeasureSpec);  
        }  

        public void resetControl(){  
            animator.start();  
            this.setX(0);  
            invalidate();  
        }  
    }  
 类似资料: