Android实现音乐播放器锁屏页
本文实例为大家分享了android音乐播放器锁屏页的具体代码,供大家参考,具体内容如下
首页我们先看一下效果图
下边来说一下实现逻辑,其主要思路就是新建一个activity使其覆盖在锁屏页上边。
一、我们新建一个lockactivty,既然是四大组件之一,必不可少的在androidmanifest.xml中注册:
<activity android:name=".lockactivity" android:excludefromrecents="true" android:exported="false" android:launchmode="singleinstance" android:nohistory="true" android:screenorientation="portrait" android:taskaffinity="com.ztk.lock" android:theme="@style/lockscreentheme"/>
这里注意,lockactivty的启动模式,我们使用singleinstance,使其单独存在一个activity task中。
android:exported="false"标签,这个标签是用来表示不能被其他应用程序组件调用或跟它交互。
android:nohistory="true",表示该activity在task中不留历史痕迹。
style文件如下:
<style name="lockscreentheme" parent="apptheme"> <item name="android:windowistranslucent">true</item> <item name="android:windowbackground">@android:color/transparent</item> <item name="android:colorbackgroundcachehint">@null</item> <item name="android:backgrounddimenabled">false</item> <item name="android:windowanimationstyle">@null</item> <item name="android:windowcontentoverlay">@null</item> </style>
二、在lockactivty的oncreate方法中添加标志,使其能够在锁屏页上显示:
@override protected void oncreate(bundle savedinstancestate) { 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):
public static void fullscreen(activity activity) { if (build.version.sdk_int >= build.version_codes.kitkat) { if (build.version.sdk_int >= build.version_codes.lollipop) { //5.x开始需要把颜色设置透明,否则导航栏会呈现系统默认的浅灰色 window window = activity.getwindow(); view decorview = window.getdecorview(); //两个 flag 要结合使用,表示让应用的主体内容占用系统状态栏的空间 int option = 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 { window window = activity.getwindow(); windowmanager.layoutparams attributes = window.getattributes(); int flagtranslucentstatus = windowmanager.layoutparams.flag_translucent_status; attributes.flags |= flagtranslucentstatus; window.setattributes(attributes); } } }
三、重写物理返回键使其不能响应返回键。
@override public void onbackpressed() {}
四、向右滑动销毁页面,这里我们要用到触摸反馈的知识,自定义一个slidingfinishlayout的view 继承relativelayout在lockactivity的布局文件中引用,这里重写ontouchevent方法:
@override public boolean ontouchevent(motionevent event) { switch (event.getactionmasked()) { case motionevent.action_down: downx = tempx = (int) event.getrawx(); downy = (int) event.getrawy(); break; case motionevent.action_move: int movex = (int) event.getrawx(); int deltax = tempx - movex; tempx = movex; if (math.abs(movex - downx) > mtouchslop && math.abs((int) event.getrawy() - downy) < mtouchslop) { issliding = true; } if (movex - downx >= 0 && issliding) { mparentview.scrollby(deltax, 0); } break; case motionevent.action_up: i ssliding = false; if (mparentview.getscrollx() <= -viewwidth / 4) { isfinish = true; scrollright(); } else { scrollorigin(); isfinish = false; } break; default: break; } return true; }
这里只贴出了主要代码,详细代码请看demo,文章末尾会有demo地址。
五、关于下方滑动解锁text的实现,是利用了颜色渐变器和矩阵平移实现:
public class hinttextview extends appcompattextview { private paint paint; private int mwidth; private lineargradient gradient; private matrix matrix; /** * 渐变的速度 */ private int deltax; public hinttextview(context context) { super(context, null); } public hinttextview(context context, attributeset attrs) { super(context, attrs); } { paint = getpaint(); } @override protected void onsizechanged(int w, int h, int oldw, int oldh) { super.onsizechanged(w, h, oldw, oldh); if(mwidth == 0 ){ mwidth = getmeasuredwidth(); //颜色渐变器 gradient = new lineargradient(0, 0, mwidth, 0, new int[]{color.gray, color.white, color.gray}, new float[]{0.3f,0.5f,1.0f}, shader.tilemode.clamp); paint.setshader(gradient); matrix = new matrix(); } } @override protected void ondraw(canvas canvas) { 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:
<service android:name=".service.playservice" android:process=":main" />
2、在service中注册广播接收锁屏事件,并跳转锁屏页面:
screenbroadcastreceiver screenbroadcastreceiver; @nullable @override public ibinder onbind(intent intent) { return null; } @override public void oncreate() { super.oncreate(); screenbroadcastreceiver = new screenbroadcastreceiver(); final intentfilter filter = new intentfilter(); filter.addaction(intent.action_screen_off); registerreceiver(screenbroadcastreceiver, filter); } public class screenbroadcastreceiver extends broadcastreceiver { @override public void onreceive(context context, intent intent) { handlecommandintent(intent); } } private void handlecommandintent(intent intent) { final string action = intent.getaction(); if (intent.action_screen_off.equals(action) ){ intent lockscreen = new intent(this, lockactivity.class); lockscreen.addflags(intent.flag_activity_new_task); startactivity(lockscreen); } } @override public void ondestroy() { super.ondestroy(); unregisterreceiver(screenbroadcastreceiver); }
这样,锁屏页面的实现就大概完成了,有一点要注意的是像小米、vivo、魅族等一些手机会有锁屏显示的权限,默认是关闭的,需要手动打开。
demo地址:lockdemo
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: vue中监听路由参数的变化及方法
下一篇: Ajax同步和异步问题浅析及解决方法