android的锁屏页面有两种方法实现;

可参考:http://blog.csdn.net/yangxi_pekin/article/details/50456763

http://blog.csdn.net/yangxi_pekin/article/details/50456763

http://blog.csdn.net/u010696525/article/details/51445515


我参考了他们,写的是一个activity页面当做锁屏页面


1.程序运行后开启一个管理锁屏页面的服务

//开启服务,开启锁屏界面startService(new Intent(MainActivity.this, LockScreenService.class));

2.在这个服务中去开启锁屏页面

public class LockScreenService extends Service {//屏幕熄灭的广播private BroadcastReceiver receiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {if (intent.getAction() == Intent.ACTION_SCREEN_OFF) {Intent lockScreenIntent = new Intent(LockScreenService.this,LockScreenActivity.class);lockScreenIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);if (!BaseApplication.getInstance().getParam(Params.IS_FORBID, false)) {startActivity(lockScreenIntent);}}}};@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {logger.debug("开启锁屏服务");return START_STICKY;};@Overridepublic void onCreate() {IntentFilter filter = new IntentFilter();filter.addAction(Intent.ACTION_SCREEN_OFF);registerReceiver(receiver, filter);}@Overridepublic IBinder onBind(Intent intent) {// TODO Auto-generated method stubreturn null;}@Overridepublic void onDestroy() {unregisterReceiver(receiver);super.onDestroy();Intent localIntent = new Intent();  localIntent.setClass(this, LockScreenService.class); //销毁时重新启动Service  this.startService(localIntent);}}

3.锁屏页面

public class LockScreenActivity extends BaseActivity {/**左右滑动的监听*/private final class OnSildingFinishListenerImplementation implementsOnSildingFinishListener {@Overridepublic void onSildingForward() {LockScreenActivity.this.finish();}@Overridepublic void onSildingBack() {LockScreenActivity.this.finish();}}ImageView iv_right_slip_anim;public static Handler myHandler = new Handler();private boolean isSpeaking = false;@Overridepublic int getLayoutResId() {getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD| WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);//这句话必须写在前面return R.layout.activity_lockscreen;}@Overridepublic void initView() {Bitmap bitmap = BitmapUtil.decodeSampledBitmapFromResource(getResources(), R.drawable.lockscreen_bg, 200, 400);Drawable drawable = BitmapUtil.bitmapToDrawable(bitmap);slf.setBackground(drawable);//设置了锁屏页面的背景色,根据自己的需要进行设置slf.setEnableLeftSildeEvent(true);slf.setEnableRightSildeEvent(false);setRightSlipAnim();}@Overridepublic void initListener() {slf.setOnSildingFinishListener(new OnSildingFinishListenerImplementation());}@Overridepublic void initData() {// TODO Auto-generated method stub}@Overridepublic void doOtherDestroy() {}private void setRightSlipAnim() {iv_right_slip_anim.setImageResource(R.anim.lockscreen_right_slip);AnimationDrawable  animationDrawable = (AnimationDrawable) iv_right_slip_anim.getDrawable();animationDrawable.start();}@Overridepublic void onBackPressed() {// 不做任何事,为了屏蔽back键}
在这个页面注册滑动监听,需要页面跟着手指一起移动,这里用到了一个自定义的布局,作为activity的头布局


4.我的activity的布局文件,头布局要用自定义的布局

<?xml version="1.0" encoding="utf-8"?><***.view.SildingFinishLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:id="@+id/sfl"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:background="@drawable/black">        。。。。。。。。。        

5.自定义的可以滑动的布局

/** * 自定义可以滑动的RelativeLayout, 类似于IOS的滑动删除页面效果,当我们要使用 * 此功能的时候,需要将该Activity的顶层布局设置为SildingFinishLayout, */public class SildingFinishLayout extends RelativeLayout{private final String TAG = SildingFinishLayout.class.getName();/** * SildingFinishLayout布局的父布局 */private ViewGroup mParentView;/** * 滑动的最小距离 */private int mTouchSlop;/** * 按下点的X坐标 */private int downX;/** * 按下点的Y坐标 */private int downY;/** * 临时存储X坐标 */private int tempX;/** * 滑动类 */private Scroller mScroller;/** * SildingFinishLayout的宽度 */private int viewWidth;/** * 记录是否正在滑动 */private boolean isSilding;private OnSildingFinishListener onSildingFinishListener;private boolean enableLeftSildeEvent = true; //是否开启左侧切换事件private boolean enableRightSildeEvent = true; // 是否开启右侧切换事件private int size ; //按下时范围(处于这个范围内就启用切换事件,目的是使当用户从左右边界点击时才响应)private boolean isIntercept = false; //是否拦截触摸事件private boolean canSwitch;//是否可切换private boolean isSwitchFromLeft = false; //左侧切换private boolean isSwitchFromRight = false; //右侧侧切换public SildingFinishLayout(Context context) {super(context);init(context);}public SildingFinishLayout(Context context, AttributeSet attrs) {super(context, attrs, 0);init(context);}public SildingFinishLayout(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);init(context);}private void init(Context context) {mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();Log.i(TAG, "设备的最小滑动距离:" + mTouchSlop);mScroller = new Scroller(context);}@Overrideprotected void onLayout(boolean changed, int l, int t, int r, int b) {super.onLayout(changed, l, t, r, b);if (changed) {// 获取SildingFinishLayout所在布局的父布局mParentView = (ViewGroup) this.getParent();viewWidth = this.getWidth();size = viewWidth;}Log.i(TAG, "viewWidth=" + viewWidth);}public void setEnableLeftSildeEvent(boolean enableLeftSildeEvent) {this.enableLeftSildeEvent = enableLeftSildeEvent;}public void setEnableRightSildeEvent(boolean enableRightSildeEvent) {this.enableRightSildeEvent = enableRightSildeEvent;}/** * 设置OnSildingFinishListener, 在onSildingFinish()方法中finish Activity *  * @param onSildingFinishListener */public void setOnSildingFinishListener(OnSildingFinishListener onSildingFinishListener) {this.onSildingFinishListener = onSildingFinishListener;}//是否拦截事件,如果不拦截事件,对于有滚动的控件的界面将出现问题(相冲突)@Overridepublic boolean onInterceptTouchEvent(MotionEvent ev) {float downX = ev.getRawX();Log.i(TAG, "downX =" + downX + ",viewWidth=" + viewWidth);if(enableLeftSildeEvent && downX < size){Log.e(TAG, "downX 在左侧范围内 ,拦截事件");isIntercept = true;isSwitchFromLeft = true;isSwitchFromRight = false;return false;}else if(enableRightSildeEvent && downX > (viewWidth - size)){//Log.i(TAG, "downX 在右侧范围内 ,拦截事件");isIntercept = true;isSwitchFromRight = true;isSwitchFromLeft = false;return true;}else{//Log.i(TAG, "downX 不在范围内 ,不拦截事件");isIntercept = false;isSwitchFromLeft = false;isSwitchFromRight = false;}return super.onInterceptTouchEvent(ev);}@Overridepublic boolean onTouchEvent(MotionEvent event) {if(!isIntercept){//不拦截事件时 不处理return false;}switch (event.getAction()){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) {isSilding = true;}Log.e(TAG, "scroll deltaX=" + deltaX);if(enableLeftSildeEvent){//左侧滑动if (moveX - downX >= 0 && isSilding) {mParentView.scrollBy(deltaX, 0);}}if(enableRightSildeEvent){//右侧滑动if (moveX - downX <= 0 && isSilding) {mParentView.scrollBy(deltaX, 0);}}Log.i(TAG + "/onTouchEvent", "mParentView.getScrollX()=" + mParentView.getScrollX());break;case MotionEvent.ACTION_UP:isSilding = false;//mParentView.getScrollX() <= -viewWidth / 2  ==>指左侧滑动//mParentView.getScrollX() >= viewWidth / 2   ==>指右侧滑动if (mParentView.getScrollX() <= -viewWidth / 2 || mParentView.getScrollX() >= viewWidth / 2) {canSwitch = true;if(isSwitchFromLeft){scrollToRight();}if(isSwitchFromRight){scrollToLeft();}} else {scrollOrigin();canSwitch = false;}break;}return true;}/** * 滚动出界面至右侧 */private void scrollToRight() {final int delta = (viewWidth + mParentView.getScrollX());// 调用startScroll方法来设置一些滚动的参数,我们在computeScroll()方法中调用scrollTo来滚动itemmScroller.startScroll(mParentView.getScrollX(), 0, -delta + 1, 0, Math.abs(delta));postInvalidate();}/** * 滚动出界面至左侧 */private void scrollToLeft() {final int delta = (viewWidth - mParentView.getScrollX());// 调用startScroll方法来设置一些滚动的参数,我们在computeScroll()方法中调用scrollTo来滚动itemmScroller.startScroll(mParentView.getScrollX(), 0, delta - 1, 0, Math.abs(delta));//此处就不可用+1,也不卡直接用deltapostInvalidate();}/** * 滚动到起始位置 */private void scrollOrigin() {int delta = mParentView.getScrollX();mScroller.startScroll(mParentView.getScrollX(), 0, -delta, 0,Math.abs(delta));postInvalidate();}@Overridepublic void computeScroll(){// 调用startScroll的时候scroller.computeScrollOffset()返回true,if (mScroller.computeScrollOffset()) {mParentView.scrollTo(mScroller.getCurrX(), mScroller.getCurrY());postInvalidate();if (mScroller.isFinished()) {if (onSildingFinishListener != null && canSwitch) {Log.i(TAG, "mScroller finish");if(isSwitchFromLeft){//回调,左侧切换事件onSildingFinishListener.onSildingBack();}if(isSwitchFromRight){//右侧切换事件onSildingFinishListener.onSildingForward();}}}}}public interface OnSildingFinishListener {public void onSildingBack();public void onSildingForward();}}
这个布局可以用来分别监听向左、向右滑动,根据自己的需要来写。


6.在清单文件中对锁屏的activity的注册


style的样式:

    

这个样式可以根据自己的需求来设置。


思路:服务中注册屏幕熄灭广播,发现屏幕熄灭就开启锁屏页面,再次点亮屏幕,滑动锁屏页面,锁屏页面被销毁,进入程序主界面。

更多相关文章

  1. Android(安卓)- 信息列表页面【仿】淘宝App
  2. android:动态创建多个按钮 并给每个按键添加监听事件
  3. android开发日常遇坑解决笔记
  4. Android实现局部图片滑动指引效果
  5. 2011.06.23——— android 事件处理机制
  6. Android(安卓)中多点触摸协议
  7. Android可滑动的Tab页
  8. 2011.06.23——— android 事件处理机制
  9. Android(安卓)Touch事件

随机推荐

  1. Android(安卓)控件大全
  2. Android调用系统自带的下载程序进行下载
  3. Android(安卓)Dialog 对话框例子
  4. Android(安卓)开发中找不到 “gen”目录
  5. 如何编译Android内核源码
  6. Android菜鸟的成长笔记(11)——Android中的
  7. Android(安卓)Studio:Fetching android s
  8. Android学习笔记进阶1之MediaPlayer
  9. 《Android开发从零开始》——10. LinearL
  10. Android属性 bulid.prop等