前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android仿苹果关机界面实现代码

Android仿苹果关机界面实现代码

作者头像
砸漏
发布2020-10-22 10:26:26
6890
发布2020-10-22 10:26:26
举报
文章被收录于专栏:恩蓝脚本恩蓝脚本

本文实例为大家分享了Android仿苹果关机界面的具体代码,供大家参考,具体内容如下

主class 用来控制viewdialog的显示

代码语言:javascript
复制
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 用来做滑块和写入滑块中的文字显示

代码语言:javascript
复制
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(); 
} 
} 

以上就是本文的全部内容,希望对大家的学习有所帮助。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-09-11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档