Android实现音乐播放器锁屏页
本文实例为大家分享了Android音乐播放器锁屏页的具体代码,供大家参考,具体内容如下
首页我们先看一下效果图
下边来说一下实现逻辑,其主要思路就是新建一个activity使其覆盖在锁屏页上边。
一、我们新建一个LockActivty,既然是四大组件之一,必不可少的在AndroidManifest.xml中注册:
这里注意,LockActivty的启动模式,我们使用singleInstance,使其单独存在一个activitytask中。
android:exported="false"标签,这个标签是用来表示不能被其他应用程序组件调用或跟它交互。
android:noHistory="true",表示该Activity在task中不留历史痕迹。
style文件如下:
true @android:color/transparent @null false @null @null
二、在LockActivty的onCreate方法中添加标志,使其能够在锁屏页上显示:
@Override protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD|WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); fullScreen(this); setContentView(R.layout.activity_lock); }
这里同时也加入全屏的代码 fullScreen(this):
publicstaticvoidfullScreen(Activityactivity){ if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.KITKAT){ if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.LOLLIPOP){ //5.x开始需要把颜色设置透明,否则导航栏会呈现系统默认的浅灰色 Windowwindow=activity.getWindow(); ViewdecorView=window.getDecorView(); //两个flag要结合使用,表示让应用的主体内容占用系统状态栏的空间 intoption=View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN |View.SYSTEM_UI_FLAG_LAYOUT_STABLE; decorView.setSystemUiVisibility(option); window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); window.setStatusBarColor(Color.TRANSPARENT); }else{ Windowwindow=activity.getWindow(); WindowManager.LayoutParamsattributes=window.getAttributes(); intflagTranslucentStatus=WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS; attributes.flags|=flagTranslucentStatus; window.setAttributes(attributes); } } }
三、重写物理返回键使其不能响应返回键。
@Override publicvoidonBackPressed(){}
四、向右滑动销毁页面,这里我们要用到触摸反馈的知识,自定义一个SlidingFinishLayout的view 继承RelativeLayout在LockActivity的布局文件中引用,这里重写onTouchEvent方法:
@Override publicbooleanonTouchEvent(MotionEventevent){ switch(event.getActionMasked()){ caseMotionEvent.ACTION_DOWN: downX=tempX=(int)event.getRawX(); downY=(int)event.getRawY(); break; caseMotionEvent.ACTION_MOVE: intmoveX=(int)event.getRawX(); intdeltaX=tempX-moveX; tempX=moveX; if(Math.abs(moveX-downX)>mTouchSlop &&Math.abs((int)event.getRawY()-downY)=0&&isSliding){ mParentView.scrollBy(deltaX,0); } break; caseMotionEvent.ACTION_UP:i sSliding=false; if(mParentView.getScrollX()<=-viewWidth/4){ isFinish=true; scrollRight(); }else{ scrollOrigin(); isFinish=false; } break; default: break; } returntrue; }
这里只贴出了主要代码,详细代码请看demo,文章末尾会有demo地址。
五、关于下方滑动解锁text的实现,是利用了颜色渐变器和矩阵平移实现:
publicclassHintTextViewextendsAppCompatTextView{ privatePaintpaint; privateintmWidth; privateLinearGradientgradient; privateMatrixmatrix; /** *渐变的速度 */ privateintdeltaX; publicHintTextView(Contextcontext){ super(context,null); } publicHintTextView(Contextcontext,AttributeSetattrs){ super(context,attrs); } { paint=getPaint(); } @Override protectedvoidonSizeChanged(intw,inth,intoldw,intoldh){ super.onSizeChanged(w,h,oldw,oldh); if(mWidth==0){ mWidth=getMeasuredWidth(); //颜色渐变器 gradient=newLinearGradient(0,0,mWidth,0,newint[]{Color.GRAY,Color.WHITE,Color.GRAY}, newfloat[]{0.3f,0.5f,1.0f}, Shader.TileMode.CLAMP); paint.setShader(gradient); matrix=newMatrix(); } } @Override protectedvoidonDraw(Canvascanvas){ super.onDraw(canvas); if(matrix!=null){ deltaX+=mWidth/8; if(deltaX>2*mWidth){ deltaX=-mWidth; } } //通过矩阵的平移实现 matrix.setTranslate(deltaX,0); gradient.setLocalMatrix(matrix); postInvalidateDelayed(100); } }
六、最后我们首先新建一个service做接收锁屏键事件的逻辑,使其启动后在任何页面都可以响应锁屏事件让LockActivity出现在锁屏页面上。
1、在AndroidManifest.xml中注册service:
2、在service中注册广播接收锁屏事件,并跳转锁屏页面:
ScreenBroadcastReceiverscreenBroadcastReceiver; @Nullable @Override publicIBinderonBind(Intentintent){ returnnull; } @Override publicvoidonCreate(){ super.onCreate(); screenBroadcastReceiver=newScreenBroadcastReceiver(); finalIntentFilterfilter=newIntentFilter(); filter.addAction(Intent.ACTION_SCREEN_OFF); registerReceiver(screenBroadcastReceiver,filter); } publicclassScreenBroadcastReceiverextendsBroadcastReceiver{ @Override publicvoidonReceive(Contextcontext,Intentintent){ handleCommandIntent(intent); } } privatevoidhandleCommandIntent(Intentintent){ finalStringaction=intent.getAction(); if(Intent.ACTION_SCREEN_OFF.equals(action)){ IntentlockScreen=newIntent(this,LockActivity.class); lockScreen.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(lockScreen); } } @Override publicvoidonDestroy(){ super.onDestroy(); unregisterReceiver(screenBroadcastReceiver); }
这样,锁屏页面的实现就大概完成了,有一点要注意的是像小米、vivo、魅族等一些手机会有锁屏显示的权限,默认是关闭的,需要手动打开。
demo地址:LockDemo
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。