效果图:
Ink_LockActivity.java
package com.aiai.www;
import android.app.Activity;
import android.app.KeyguardManager;
import android.app.KeyguardManager.KeyguardLock;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
public class Ink_LockActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
startService(new Intent(this, Ink_LockScreenService.class));
EnableSystemKeyguard(false);
}
void EnableSystemKeyguard(boolean bEnable) {
KeyguardManager mKeyguardManager = null;
KeyguardLock mKeyguardLock = null;
mKeyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
mKeyguardLock = mKeyguardManager.newKeyguardLock("");
if (bEnable)
mKeyguardLock.reenableKeyguard();
else
mKeyguardLock.disableKeyguard();
}
}
Ink_LockScreenActivity.java
package com.aiai.www;
import com.aiai.www.Ink_LockScreenView.OnCompleteListener;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.view.KeyEvent;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.view.View.OnClickListener;
import android.widget.Toast;
public class Ink_LockScreenActivity extends Activity {
private Ink_LockScreenView mInkView;
private final String ACT_TIME_TICK = "android.intent.action.TIME_TICK";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
// this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
// WindowManager.LayoutParams.FLAG_FULLSCREEN);
System.out.println("Ink_LockScreenActivity onCreate");
// Ink_LockScreenView.istime24_flag = istime24();
mInkView = new Ink_LockScreenView(this);
//mInkView.setParentActivity(this);
setContentView(mInkView);
mInkView.setOnCompleteListener(new OnCompleteListener()
{
@Override
public void onComplete()
{
Ink_LockScreenActivity.this.finish();
/* Intent mIntent = new Intent( );
ComponentName comp = new ComponentName("com.android.mms", "ç±»å");
mIntent.setComponent(comp);
mIntent.setAction("android.intent.action.VIEW");
startActivity(mIntent);*/
}
@Override
public void onEnterContact() {
// TODO Auto-generated method stub
Ink_LockScreenActivity.this.finish();
Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
startActivity(intent);
}
@Override
public void onEnterMms() {
// TODO Auto-generated method stub
Ink_LockScreenActivity.this.finish();
Intent intent = new Intent();
intent = getPackageManager().getLaunchIntentForPackage("com.android.mms");
startActivity(intent);
}
});
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
System.out.println("*************lockscreenviewactivity*********onKeyDown keyCode:"+keyCode);
return true;
//super.onKeyDown(keyCode, event);
}
@Override
public void onAttachedToWindow() {
// TODO Auto-generated method stub
//ç¦ç¨homeæé®
this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);
super.onAttachedToWindow();
}
@Override
protected void onStart() {
// TODO Auto-generated method stub
super.onStart();
IntentFilter intentFilter = new IntentFilter(ACT_TIME_TICK);
registerReceiver(mTimeUpdateBCR, intentFilter);
}
@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
unregisterReceiver(mTimeUpdateBCR);
}
private BroadcastReceiver mTimeUpdateBCR = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
System.out.println("time update in activity act:"+intent.getAction());
if(intent.getAction().equals(ACT_TIME_TICK))
{
mInkView.invalidate();
//mUpdateTimeListener.updateTime();
}
}
};
/* private boolean istime24() {
ContentResolver cv = this.getContentResolver();
String strTimeFormat = android.provider.Settings.System.getString(cv,
android.provider.Settings.System.TIME_12_24);
if (strTimeFormat.equals("24"))
return true;
else
return false;
}*/
}
Ink_LockScreenService.java
package com.aiai.www;
import java.util.List;
import android.app.ActivityManager;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.IBinder;
import android.util.Log;
public class Ink_LockScreenService extends Service {
private final String ACT_SCREEN_OFF = "android.intent.action.SCREEN_OFF";
//private final String ACT_SCREEN_ON = "android.intent.action.SCREEN_ON";
//private final String ACT_TIME_TICK = "android.intent.action.TIME_TICK";
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
// register Broadcast
IntentFilter intentFilter = new IntentFilter(ACT_SCREEN_OFF);
registerReceiver(mScreenBCR, intentFilter);
/* IntentFilter intentFilter2 = new IntentFilter(ACT_TIME_TICK);
registerReceiver(mScreenBCR, intentFilter2);*/
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
unregisterReceiver(mScreenBCR);
}
private BroadcastReceiver mScreenBCR = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
System.out.println("onReceive receive intent:"+intent);
System.out.println("act:"+intent.getAction());
if(intent.getAction().equals(ACT_SCREEN_OFF))
{
System.out.println("aa");
try {
Intent i = new Intent();
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.setClass(context, Ink_LockScreenActivity.class);
context.startActivity(i);
} catch (Exception e) {
// TODO: handle exception
}
}
//else if(intent.getAction().equals(ACT_TIME_TICK))
{
System.out.println("bb");
//mUpdateTimeListener.updateTime();
}
}
};
/* private UpdateTimeListener mUpdateTimeListener;
public interface UpdateTimeListener
{
public void updateTime();
}*/
}
Ink_LockScreenView.java
package com.aiai.www;
import java.util.Calendar;
import java.util.Date;
import android.app.Activity;
import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.text.format.DateFormat;
import android.util.Log;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
public class Ink_LockScreenView extends View {
private Bitmap Ink_bg, Ink_bar;
private Bitmap Ink_time0, Ink_time1, Ink_time2, Ink_time3, Ink_time4,
Ink_time5, Ink_time6, Ink_time7, Ink_time8, Ink_time9, Ink_timedot;
private int hour=0;
private int minute=0;
// public static boolean istime24_flag=false;
public Canvas mCanvas;
private Paint mPaint;
private int INK_BG_X = 0;
private int INK_BG_Y = -20;
private int INK_BAR_X = 0;
private int INK_BAR_Y = 290;
private int INK_BAR_TOUCH_AREA_Y1 = 340;
private int INK_BAR_TOUCH_AREA_Y2 = 420;
private int INK_BAR_UNLOCK_Y = 448;
private int INK_TIME_X = 80;
private int INK_TIME_Y = 360;
private int INK_UNLOCK_AREA_X1 = 80;
private int INK_UNLOCK_AREA_X2 = 254;
private boolean isInited = false;
enum BarState {
STATE_NORMAL,
STATE_PRESS,
STATE_MOVE,
STATE_UNLOCK,
}
private BarState mBarState = BarState.STATE_NORMAL;
private float moveX = 0,moveY=0;
private float premoveX = 0,premoveY=0;
private float tmpX = 0,tmpY=0;
private float movedX = 0,movedY=0;
Activity mParentActivity;
public Ink_LockScreenView(Context context) {
super(context);
// TODO Auto-generated constructor stub
Ink_bg = BitmapFactory.decodeResource(this.getResources(), R.drawable.ink_bg);
Ink_bar = BitmapFactory.decodeResource(this.getResources(), R.drawable.ink_bar);
Ink_time0 = BitmapFactory.decodeResource(this.getResources(), R.drawable.ink_time_0);
Ink_time1 = BitmapFactory.decodeResource(this.getResources(), R.drawable.ink_time_1);
Ink_time2 = BitmapFactory.decodeResource(this.getResources(), R.drawable.ink_time_2);
Ink_time3 = BitmapFactory.decodeResource(this.getResources(), R.drawable.ink_time_3);
Ink_time4 = BitmapFactory.decodeResource(this.getResources(), R.drawable.ink_time_4);
Ink_time5 = BitmapFactory.decodeResource(this.getResources(), R.drawable.ink_time_5);
Ink_time6 = BitmapFactory.decodeResource(this.getResources(), R.drawable.ink_time_6);
Ink_time7 = BitmapFactory.decodeResource(this.getResources(), R.drawable.ink_time_7);
Ink_time8 = BitmapFactory.decodeResource(this.getResources(), R.drawable.ink_time_8);
Ink_time9 = BitmapFactory.decodeResource(this.getResources(), R.drawable.ink_time_9);
Ink_timedot = BitmapFactory.decodeResource(this.getResources(), R.drawable.ink_time_dot);
mPaint = new Paint();
/*mCanvas = new Canvas(Ink_bg);*/
}
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
System.out.println("onDraw isInited:"+isInited);
if(!isInited)
{
initDraw(canvas);
}
else
{
// draw background
//canvas.drawColor(Color.BLUE);
//canvas.drawBitmap(Ink_bg, INK_BG_X, INK_BG_Y, mPaint);
if(mBarState == BarState.STATE_MOVE)
{
canvas.drawBitmap(Ink_bg, INK_BG_X, INK_BG_Y, mPaint);
canvas.drawBitmap(Ink_bar, INK_BAR_X, INK_BAR_Y+movedY, mPaint);
timeDraw(canvas);
}
else //if(mBarState == BarState.STATE_NORMAL)
{
canvas.drawBitmap(Ink_bg, INK_BG_X, INK_BG_Y, mPaint);
canvas.drawBitmap(Ink_bar, INK_BAR_X, INK_BAR_Y, mPaint);
timeinitDraw(canvas);
}
}
}
private void initDraw(Canvas canvas) {
// TODO Auto-generated method stub
canvas.drawBitmap(Ink_bg, INK_BG_X, INK_BG_Y, mPaint);
canvas.drawBitmap(Ink_bar, INK_BAR_X, INK_BAR_Y, mPaint);
timeinitDraw(canvas);
isInited = true;
}
private void timeGet() {
Calendar c = Calendar.getInstance();
hour = c.get(Calendar.HOUR_OF_DAY);
minute = c.get(Calendar.MINUTE);
System.out.println("hour:"+hour+",minute:"+minute);
}
private void timeDraw(Canvas canvas) {
timeGet();
int tmpWidth=0;
Bitmap[] timearr={Ink_time0,Ink_time1,Ink_time2,Ink_time3,Ink_time4,Ink_time5,Ink_time6,Ink_time7,Ink_time8,Ink_time9};
System.out.println("timeDraw");
int tmphour1 = hour/10;
int tmphour2 = hour%10;
int tmpmin1 = minute/10;
int tmpmin2 = minute%10;
//draw hour
canvas.drawBitmap(timearr[tmphour1], INK_TIME_X, INK_TIME_Y+movedY, mPaint);
tmpWidth = timearr[tmphour1].getWidth();
canvas.drawBitmap(timearr[tmphour2], INK_TIME_X+tmpWidth, INK_TIME_Y+movedY, mPaint);
tmpWidth += timearr[tmphour2].getWidth();
//draw dot
canvas.drawBitmap(Ink_timedot, INK_TIME_X+tmpWidth, INK_TIME_Y+movedY, mPaint);
tmpWidth += timearr[tmphour2].getWidth();
//draw minute
canvas.drawBitmap(timearr[tmpmin1], INK_TIME_X+tmpWidth, INK_TIME_Y+movedY, mPaint);
tmpWidth += timearr[tmpmin1].getWidth();
canvas.drawBitmap(timearr[tmpmin2], INK_TIME_X+tmpWidth, INK_TIME_Y+movedY, mPaint);
//tmpWidth = timearr[tmphour2].getWidth();
}
private void timeinitDraw(Canvas canvas) {
timeGet();
int tmpWidth=0;
Bitmap[] timearr={Ink_time0,Ink_time1,Ink_time2,Ink_time3,Ink_time4,Ink_time5,Ink_time6,Ink_time7,Ink_time8,Ink_time9};
System.out.println("timeDraw");
int tmphour1 = hour/10;
int tmphour2 = hour%10;
int tmpmin1 = minute/10;
int tmpmin2 = minute%10;
//draw hour
canvas.drawBitmap(timearr[tmphour1], INK_TIME_X, INK_TIME_Y, mPaint);
tmpWidth = timearr[tmphour1].getWidth();
canvas.drawBitmap(timearr[tmphour2], INK_TIME_X+tmpWidth, INK_TIME_Y, mPaint);
tmpWidth += timearr[tmphour2].getWidth();
//draw dot
canvas.drawBitmap(Ink_timedot, INK_TIME_X+tmpWidth, INK_TIME_Y, mPaint);
tmpWidth += timearr[tmphour2].getWidth();
//draw minute
canvas.drawBitmap(timearr[tmpmin1], INK_TIME_X+tmpWidth, INK_TIME_Y, mPaint);
tmpWidth += timearr[tmpmin1].getWidth();
canvas.drawBitmap(timearr[tmpmin2], INK_TIME_X+tmpWidth, INK_TIME_Y, mPaint);
//tmpWidth = timearr[tmphour2].getWidth();
/* if(istime24_flag)
{
}
else
{
}*/
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
System.out.println("*************lockscreenview*********onKeyDown keyCode:"+keyCode);
return super.onKeyDown(keyCode, event);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
System.out.println("onTouchEvent");
float ex = event.getX();
float ey = event.getY();
System.out.println("onTouchEvent ex="+ex+",ey="+ey);
moveX = ex;
moveY = ey;
switch (event.getAction())
{
case MotionEvent.ACTION_DOWN:
System.out.println("onTouchEvent ACTION_DOWN");
if(ey>=INK_BAR_TOUCH_AREA_Y1 && ey<=INK_BAR_TOUCH_AREA_Y2)
mBarState = BarState.STATE_PRESS;
break;
case MotionEvent.ACTION_MOVE:
System.out.println("onTouchEvent ACTION_MOVE");
if (ey >= INK_BAR_TOUCH_AREA_Y1
&& movedY >= 0)
{
tmpX = moveX - premoveX;
tmpY = moveY - premoveY;
movedX = movedX + tmpX;
movedY = movedY + tmpY;
}
if(ey>=INK_BAR_TOUCH_AREA_Y1
&& movedY > 0)
{
mBarState = BarState.STATE_MOVE;
}
else
{
mBarState = BarState.STATE_NORMAL;
}
break;
case MotionEvent.ACTION_UP:
movedX = 0;
movedY = 0;
premoveX = 0;
premoveY = 0;
if(ey>= INK_BAR_UNLOCK_Y)
{
mBarState = BarState.STATE_UNLOCK;
if (ex<INK_UNLOCK_AREA_X1
&& ex>0)
{
mCompleteListener.onEnterContact();
}
else if(ex<INK_UNLOCK_AREA_X2
&& ex>INK_UNLOCK_AREA_X1)
{
mCompleteListener.onComplete();
}
else
{
mCompleteListener.onEnterMms();
}
//mParentActivity.finish();
/* Intent mIntent = new Intent( );
ComponentName comp = new ComponentName("å
å", "ç±»å");
mIntent.setComponent(comp);
mIntent.setAction("android.intent.action.VIEW");
startActivity(mIntent);*/
return true;
}
else
{
mBarState = BarState.STATE_NORMAL;
}
System.out.println("onTouchEvent ACTION_UP");
break;
}
premoveX = ex;
premoveY = ey;
this.postInvalidate();
super.onTouchEvent(event);
return true;
}
/* public void setParentActivity(Activity parentAct) {
// TODO Auto-generated method stub
mParentActivity = parentAct;
}*/
private OnCompleteListener mCompleteListener;
public void setOnCompleteListener(OnCompleteListener mCompleteListener)
{
this.mCompleteListener = mCompleteListener;
}
public interface OnCompleteListener
{
public void onComplete();
public void onEnterContact();
public void onEnterMms();
}
}
androidmanifest.xml:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.aiai.www"
android:versionCode="1"
android:versionName="1.0" >
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" >
</uses-permission>
<uses-permission android:name="android.permission.WAKE_LOCK" >
</uses-permission>
<uses-permission android:name="android.permission.GET_TASKS" >
</uses-permission>
<uses-sdk android:minSdkVersion="10" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:name=".Ink_LockActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name=".Ink_LockScreenService" >
<intent-filter>
<action android:name="android.intent.action.SCREEN_OFF" />
<!-- <action android:name="android.intent.action.TIME_TICK" /> -->
</intent-filter>
</service>
<activity android:name=".Ink_LockScreenActivity" >
<intent-filter>
<action android:name="android.intent.action.TIME_TICK" />
</intent-filter>
</activity>
</application>
</manifest>