版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】怎么在android中通过自定义View实现手势解锁功能
这篇文章将为大家详细讲解有关怎么在android中通过自定义View实现手势解锁功能,文章内容质量较高,因此在下分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。package
com.example.gesturelock;
import
java.util.ArrayList;
import
java.util.List;
import
java.util.Timer;
import
java.util.TimerTask;
import
android.content.Context;
import
android.graphics.Canvas;
import
android.graphics.Color;
import
android.graphics.Paint;
import
android.graphics.Path;
import
android.util.AttributeSet;
import
android.view.MotionEvent;
import
android.view.View;
import
com.example.gesturelock.GestureLockView.OnGestureFinishListener;
public
class
MyGestureLockView
extends
View
{
/**
*
不同状态的画笔
*/
private
Paint
paintNormal;
private
Paint
paintOnTouch;
private
Paint
paintInnerCycle;
private
Paint
paintLines;
private
Paint
paintKeyError;
private
MyCycle[]
cycles;
private
Path
linePath
=
new
Path();
private
List<Integer>
linedCycles
=
new
ArrayList<Integer>();
private
OnGestureFinishListener
onGestureFinishListener;
private
String
key;
private
int
eventX,
eventY;
private
boolean
canContinue
=
true;
private
boolean
result;
private
Timer
timer;
/**
*
不同状态下的色值
*/
private
int
OUT_CYCLE_NORMAL
=
Color.rgb(108,
119,
138);
//
������Բ��ɫ
private
int
OUT_CYCLE_ONTOUCH
=
Color.rgb(025,
066,
103);
//
ѡ����Բ��ɫ
private
int
INNER_CYCLE_ONTOUCH
=
Color.rgb(002,
210,
255);
//
ѡ����Բ��ɫ
private
int
LINE_COLOR
=
Color.argb(127,
002,
210,
255);
//
��������ɫ
private
int
ERROR_COLOR
=
Color.argb(127,
255,
000,
000);
public
void
setOnGestureFinishListener(
OnGestureFinishListener
onGestureFinishListener)
{
this.onGestureFinishListener
=
onGestureFinishListener;
}
public
void
setKey(String
key)
{
this.key
=
key;
}
public
MyGestureLockView(Context
context,
AttributeSet
attrs,
int
defStyle)
{
super(context,
attrs,
defStyle);
init();
}
public
MyGestureLockView(Context
context,
AttributeSet
attrs)
{
super(context,
attrs);
init();
}
public
MyGestureLockView(Context
context)
{
super(context);
init();
}
private
void
init()
{
paintNormal
=
new
Paint();
paintNormal.setAntiAlias(true);
paintNormal.setStrokeWidth(3);
paintNormal.setStyle(Paint.Style.STROKE);
paintOnTouch
=
new
Paint();
paintOnTouch.setAntiAlias(true);
paintOnTouch.setStrokeWidth(3);
paintOnTouch.setStyle(Paint.Style.STROKE);
paintInnerCycle
=
new
Paint();
paintInnerCycle.setAntiAlias(true);
paintInnerCycle.setStyle(Paint.Style.FILL);
paintLines
=
new
Paint();
paintLines.setAntiAlias(true);
paintLines.setStyle(Paint.Style.STROKE);
paintLines.setStrokeWidth(6);
paintKeyError
=
new
Paint();
paintKeyError.setAntiAlias(true);
paintKeyError.setStyle(Paint.Style.STROKE);
paintKeyError.setStrokeWidth(3);
}
@Override
protected
void
onMeasure(int
widthMeasureSpec,
int
heightMeasureSpec)
{
//
TODO
Auto-generated
method
stub
super.onMeasure(widthMeasureSpec,
heightMeasureSpec);
}
@Override
protected
void
onLayout(boolean
changed,
int
left,
int
top,
int
right,
int
bottom)
{
//
TODO
Auto-generated
method
stub
super.onLayout(changed,
left,
top,
right,
bottom);
int
perSize
=
0;
if
(cycles
==
null
&&
(perSize
=
getWidth()
/
6)
>
0)
{
cycles
=
new
MyCycle[9];
for
(int
i
=
0;
i
<
3;
i++)
{
for
(int
j
=
0;
j
<
3;
j++)
{
MyCycle
cycle
=
new
MyCycle();
cycle.setNum(i
*
3
+
j);
cycle.setOx(perSize
*
(j
*
2
+
1));
cycle.setOy(perSize
*
(i
*
2
+
1));
cycle.setR(perSize
*
0.5f);
cycles[i
*
3
+
j]
=
cycle;
}
}
}
}
/**
*
绘制所需要绘制的内容
*/
@Override
protected
void
onDraw(Canvas
canvas)
{
//
TODO
Auto-generated
method
stub
super.onDraw(canvas);
for
(int
i
=
0;
i
<
cycles.length;
i++)
{
if
(!canContinue
&&
!result)
{
paintOnTouch.setColor(ERROR_COLOR);
paintInnerCycle.setColor(ERROR_COLOR);
paintLines.setColor(ERROR_COLOR);
}
else
if
(cycles[i].isOnTouch())
{
paintOnTouch.setColor(OUT_CYCLE_ONTOUCH);
paintInnerCycle.setColor(INNER_CYCLE_ONTOUCH);
paintLines.setColor(LINE_COLOR);
}
else
{
paintNormal.setColor(OUT_CYCLE_NORMAL);
paintInnerCycle.setColor(INNER_CYCLE_ONTOUCH);
paintLines.setColor(LINE_COLOR);
}
if
(cycles[i].isOnTouch())
{
canvas.drawCircle(cycles[i].getOx(),
cycles[i].getOy(),
cycles[i].getR(),
paintOnTouch);
drawInnerBuleCycle(cycles[i],
canvas);
}
else
{
canvas.drawCircle(cycles[i].getOx(),
cycles[i].getOy(),
cycles[i].getR(),
paintNormal);
}
}
drawLine(canvas);
}
/**
*
绘制大圆里的小圆
*
*
@param
canvas
*/
private
void
drawInnerBuleCycle(MyCycle
cycle,
Canvas
canvas)
{
canvas.drawCircle(cycle.getOx(),
cycle.getOy(),
cycle.getR()
/
3,
paintInnerCycle);
}
private
void
drawLine(Canvas
canvas)
{
linePath.reset();
if
(linedCycles.size()
>
0)
{
for
(int
i
=
0;
i
<
linedCycles.size();
i++)
{
int
index
=
linedCycles.get(i);
if
(i
==
0)
{
//
设置为整条路径的起点
linePath.moveTo(cycles[index].getOx(),
cycles[i].getOy());
}
else
{
linePath.lineTo(cycles[i].getOx(),
cycles[i].getOy());
}
}
linePath.lineTo(eventX,
eventY);
canvas.drawPath(linePath,
paintLines);
}
}
/**
*
根据手择时触摸点的不同,修改对应的状态值
*/
@Override
public
boolean
onTouchEvent(MotionEvent
event)
{
if
(canContinue)
{
switch
(event.getAction())
{
case
MotionEvent.ACTION_DOWN:
case
MotionEvent.ACTION_MOVE:
eventX
=
(int)
event.getX();
eventY
=
(int)
event.getY();
for
(int
i
=
0;
i
<
cycles.length;
i++)
{
if
(cycles[i].isPointIn(eventX,
eventY))
{
cycles[i].setOnTouch(true);
if
(!linedCycles.contains(cycles[i].getNum()))
{
linedCycles.add(cycles[i].getNum());
}
}
}
break;
case
MotionEvent.ACTION_UP:
canContinue
=
false;
StringBuffer
sb
=
new
StringBuffer();
for
(int
i
=
0;
i
<
linedCycles.size();
i++)
{
sb.append(linedCycles.get(i));
}
result
=
key.equals(sb.toString());
if
(onGestureFinishListener
!=
null)
{
onGestureFinishListener.OnGestureFinish(result);
}
timer
=
new
Timer();
timer.schedule(new
TimerTask()
{
@Override
public
void
run()
{
//
回到初始状态
eventX
=
eventY
=
0;
for
(int
i
=
0;
i
<
cycles.length;
i++)
{
cycles[i].setOnTouch(false);
}
linedCycles.clear();
linePath.reset();
canContinue
=
true;
postInvalidate();
}
},
1000);
break;
}
}
invalidate();
return
true;
}
}自定义圆类:package
com.example.gesturelock;
public
class
MyCycle
{
private
int
ox;
//
Բ�ĺ�����
private
int
oy;
//
Բ��������
private
float
r;
//
�뾶����
private
Integer
num;
//
������ֵ
private
boolean
onTouch;
//
false=δѡ��
public
int
getOx()
{
return
ox
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 建筑物管道及通风设备安装服务项目商业计划书及实施方案|瑞克咨询|2024年编制|
- 外转子电机项目商业计划书及实施方案|瑞克咨询|2024年编制|
- 空气净化设备项目商业计划书及实施方案|瑞克咨询|2024年编|
- 化肥农药项目可行性研究报告及运营方案|瑞克咨询|2024年编制|
- 2024年广西住院医师-广西住院医师耳鼻咽喉科笔试参考题库含答案
- 2024年安徽住院医师-安徽住院医师放射肿瘤科笔试参考题库含答案
- 2024年大学试题(计算机科学)-嵌入式系统笔试参考题库含答案
- 二级建造师之二建建设工程施工管理提升训练试卷A卷附答案
- 制冷技术 课件 第2章 制冷剂、载冷剂和润滑油
- 第10课 《阿长与山海经》课件2023-2024学年统编版语文七年级下册
- GB/T 2624.1-2006用安装在圆形截面管道中的差压装置测量满管流体流量第1部分:一般原理和要求
- GB/T 17449-1998包装玻璃容器螺纹瓶口尺寸
- 电气工程隐患排查清单
- 危大工程管理台账
- 标识标牌施工组织设计
- SCI论文的写作与发表课件
- 《微观经济学》期中考试题库及答案
- 江苏省幼儿园教育技术装备标准
- hsk教程5上练习册
- 梅毒诊疗指南(2023年)
- 客运企业安全生产风险分级管控体系方案资料汇编(2022-2023年)
评论
0/150
提交评论