SlideView关机界面实现

来源:互联网 发布:淘宝人生有声小说收听 编辑:程序博客网 时间:2024/06/03 22:53

主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();          }      }  
原创粉丝点击