Android 手势锁的实现 让自己的应用更加安全吧
http://blog.csdn.net/lmj623565791/article/details/3623611http://blog.csdn.net/lmj623565791/article/details/362361133http://blog.csdn.net/lmj623565791/article/details/36236113
http://blog.csdn.net/lmj623565791/article/details/36236113
Android 手势锁的实现 让自己的应用更加安全吧
分类:android进阶android 2014-07-01 23:48 1293人阅读 评论(5) 收藏 举报 android 手势锁 自定义View目录(?)[+]
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/36236113
今天偶遇以github上gesturelock关于手势锁的一个例子(有兴趣的去搜索下看看),于是下载下来研究,无奈基本没有注释,代码上存在一些问题(当设置gravity=center_vertical无法进行手势选择,无意中发现的),于是借鉴这位仁兄的代码,自己重写写了一个,修复了一些问题,加入一些基本的自定义属性,在此先感谢这位兄弟~。
先上图,默认效果图:
当然可以自定义数量啊,颜色神马的,自定义效果图:
如果你有艺术细胞,可以给我推荐几个颜色,无奈个人审美有问题~
1、整体思路
a、自定义了一个RelativeLayout(GestureLockViewGroup)在里面会根据传入的每行的个数,生成多个GestureLockView(就是上面一个个小圈圈),然后会自动进行布局,里面的宽度,间距,内圆的直径,箭头的大小神马的都是百分比实现的,所以大胆的设置你喜欢的个数,只要你没有密集恐惧症~
b、GestureLockView有三个状态,没有手指触碰、手指触碰、和手指抬起,会根据这三个状态绘制不同的效果,以及抬起时的小箭头需要旋转的角度,会根据用户选择的GestureLockView,进行计算,在GestureLockViewGroup为每个GestureLockView设置
c、GestureLockViewGroup主要就是判断用户ACTION_MOVE,ACTION_DOWN ,ACTION_UP时改变选中的GestureLockView的状态,并且记录下来,提供一定的回调。
下面开始看代码:
2、声明一些用户可以设置的属性:
[html] view plain copy- <?xmlversion="1.0"encoding="utf-8"?>
- <resources>
- <attrname="color_no_finger_inner_circle"format="color"/>
- <attrname="color_no_finger_outer_circle"format="color"/>
- <attrname="color_finger_on"format="color"/>
- <attrname="color_finger_up"format="color"/>
- <attrname="count"format="integer"/>
- <attrname="tryTimes"format="integer"/>
- <declare-styleablename="GestureLockViewGroup">
- <attrname="color_no_finger_inner_circle"/>
- <attrname="color_no_finger_outer_circle"/>
- <attrname="color_finger_on"/>
- <attrname="color_finger_up"/>
- <attrname="count"/>
- <attrname="tryTimes"/>
- </declare-styleable>
- </resources>
用户可以用过在xml文件中设置这些属性,改变外观,最多尝试次数以及数量等。
3、GestureLockView
[java] view plain copy- packagecom.zhy.zhy_gesturelockview.view;
- importandroid.content.Context;
- importandroid.graphics.Canvas;
- importandroid.graphics.Paint;
- importandroid.graphics.Paint.Style;
- importandroid.graphics.Path;
- importandroid.view.View;
- publicclassGestureLockViewextendsView
- {
- privatestaticfinalStringTAG="GestureLockView";
- /**
- *GestureLockView的三种状态
- */
- enumMode
- {
- STATUS_NO_FINGER,STATUS_FINGER_ON,STATUS_FINGER_UP;
- }
- /**
- *GestureLockView的当前状态
- */
- privateModemCurrentStatus=Mode.STATUS_NO_FINGER;
- /**
- *宽度
- */
- privateintmWidth;
- /**
- *高度
- */
- privateintmHeight;
- /**
- *外圆半径
- */
- privateintmRadius;
- /**
- *画笔的宽度
- */
- privateintmStrokeWidth=2;
- /**
- *圆心坐标
- */
- privateintmCenterX;
- privateintmCenterY;
- privatePaintmPaint;
- /**
- *箭头(小三角最长边的一半长度=mArrawRate*mWidth/2)
- */
- privatefloatmArrowRate=0.333f;
- privateintmArrowDegree=-1;
- privatePathmArrowPath;
- /**
- *内圆的半径=mInnerCircleRadiusRate*mRadus
- *
- */
- privatefloatmInnerCircleRadiusRate=0.3F;
- /**
- *四个颜色,可由用户自定义,初始化时由GestureLockViewGroup传入
- */
- privateintmColorNoFingerInner;
- privateintmColorNoFingerOutter;
- privateintmColorFingerOn;
- privateintmColorFingerUp;
- publicGestureLockView(Contextcontext,intcolorNoFingerInner,intcolorNoFingerOutter,intcolorFingerOn,intcolorFingerUp)
- {
- super(context);
- this.mColorNoFingerInner=colorNoFingerInner;
- this.mColorNoFingerOutter=colorNoFingerOutter;
- this.mColorFingerOn=colorFingerOn;
- this.mColorFingerUp=colorFingerUp;
- mPaint=newPaint(Paint.ANTI_ALIAS_FLAG);
- mArrowPath=newPath();
- }
- @Override
- protectedvoidonMeasure(intwidthMeasureSpec,intheightMeasureSpec)
- {
- super.onMeasure(widthMeasureSpec,heightMeasureSpec);
- mWidth=MeasureSpec.getSize(widthMeasureSpec);
- mHeight=MeasureSpec.getSize(heightMeasureSpec);
- //取长和宽中的小值
- mWidth=mWidth<mHeight?mWidth:mHeight;
- mRadius=mCenterX=mCenterY=mWidth/2;
- mRadius-=mStrokeWidth/2;
- //绘制三角形,初始时是个默认箭头朝上的一个等腰三角形,用户绘制结束后,根据由两个GestureLockView决定需要旋转多少度
- floatmArrowLength=mWidth/2*mArrowRate;
- mArrowPath.moveTo(mWidth/2,mStrokeWidth+2);
- mArrowPath.lineTo(mWidth/2-mArrowLength,mStrokeWidth+2
- +mArrowLength);
- mArrowPath.lineTo(mWidth/2+mArrowLength,mStrokeWidth+2
- +mArrowLength);
- mArrowPath.close();
- mArrowPath.setFillType(Path.FillType.WINDING);
- }
- @Override
- protectedvoidonDraw(Canvascanvas)
- {
- switch(mCurrentStatus)
- {
- caseSTATUS_FINGER_ON:
- //绘制外圆
- mPaint.setStyle(Style.STROKE);
- mPaint.setColor(mColorFingerOn);
- mPaint.setStrokeWidth(2);
- canvas.drawCircle(mCenterX,mCenterY,mRadius,mPaint);
- //绘制内圆
- mPaint.setStyle(Style.FILL);
- canvas.drawCircle(mCenterX,mCenterY,mRadius
- *mInnerCircleRadiusRate,mPaint);
- break;
- caseSTATUS_FINGER_UP:
- //绘制外圆
- mPaint.setColor(mColorFingerUp);
- mPaint.setStyle(Style.STROKE);
- mPaint.setStrokeWidth(2);
- canvas.drawCircle(mCenterX,mCenterY,mRadius,mPaint);
- //绘制内圆
- mPaint.setStyle(Style.FILL);
- canvas.drawCircle(mCenterX,mCenterY,mRadius
- *mInnerCircleRadiusRate,mPaint);
- drawArrow(canvas);
- break;
- caseSTATUS_NO_FINGER:
- //绘制外圆
- mPaint.setStyle(Style.FILL);
- mPaint.setColor(mColorNoFingerOutter);
- canvas.drawCircle(mCenterX,mCenterY,mRadius,mPaint);
- //绘制内圆
- mPaint.setColor(mColorNoFingerInner);
- canvas.drawCircle(mCenterX,mCenterY,mRadius
- *mInnerCircleRadiusRate,mPaint);
- break;
- }
- }
- /**
- *绘制箭头
- *@paramcanvas
- */
- privatevoiddrawArrow(Canvascanvas)
- {
- if(mArrowDegree!=-1)
- {
- mPaint.setStyle(Paint.Style.FILL);
- canvas.save();
- canvas.rotate(mArrowDegree,mCenterX,mCenterY);
- canvas.drawPath(mArrowPath,mPaint);
- canvas.restore();
- }
- }
- /**
- *设置当前模式并重绘界面
- *
- *@parammode
- */
- publicvoidsetMode(Modemode)
- {
- this.mCurrentStatus=mode;
- invalidate();
- }
- publicvoidsetArrowDegree(intdegree)
- {
- this.mArrowDegree=degree;
- }
- publicintgetArrowDegree()
- {
- returnthis.mArrowDegree;
- }
- }
注释很详细,主要就是onDraw时,判断当前状态,绘制不同的显示效果;状态的改变都是GestureLockViewGroup的onTouchEvent中设置的。
4、GestureLockViewGroup
[java] view plain copy- packagecom.zhy.zhy_gesturelockview.view;
- importjava.util.ArrayList;
- importjava.util.List;
- importandroid.content.Context;
- importandroid.content.res.TypedArray;
- importandroid.graphics.Canvas;
- importandroid.graphics.Color;
- importandroid.graphics.Paint;
- importandroid.graphics.Path;
- importandroid.graphics.Point;
- importandroid.util.AttributeSet;
- importandroid.util.Log;
- importandroid.view.MotionEvent;
- importandroid.view.View;
- importandroid.widget.RelativeLayout;
- importcom.zhy.zhy_gesturelockview.R;
- importcom.zhy.zhy_gesturelockview.view.GestureLockView.Mode;
- /**
- *整体包含n*n个GestureLockView,每个GestureLockView间间隔mMarginBetweenLockView,
- *最外层的GestureLockView与容器存在mMarginBetweenLockView的外边距
- *
- *关于GestureLockView的边长(n*n):n*mGestureLockViewWidth+(n+1)*
- *mMarginBetweenLockView=mWidth;得:mGestureLockViewWidth=4*mWidth/(5
- **mCount+1)注:mMarginBetweenLockView=mGestureLockViewWidth*0.25;
- *
- *@authorzhy
- *
- */
- publicclassGestureLockViewGroupextendsRelativeLayout
- {
- privatestaticfinalStringTAG="GestureLockViewGroup";
- /**
- *保存所有的GestureLockView
- */
- privateGestureLockView[]mGestureLockViews;
- /**
- *每个边上的GestureLockView的个数
- */
- privateintmCount=4;
- /**
- *存储答案
- */
- privateint[]mAnswer={0,1,2,5,8};
- /**
- *保存用户选中的GestureLockView的id
- */
- privateList<Integer>mChoose=newArrayList<Integer>();
- privatePaintmPaint;
- /**
- *每个GestureLockView中间的间距设置为:mGestureLockViewWidth*25%
- */
- privateintmMarginBetweenLockView=30;
- /**
- *GestureLockView的边长4*mWidth/(5*mCount+1)
- */
- privateintmGestureLockViewWidth;
- /**
- *GestureLockView无手指触摸的状态下内圆的颜色
- */
- privateintmNoFingerInnerCircleColor=0xFF939090;
- /**
- *GestureLockView无手指触摸的状态下外圆的颜色
- */
- privateintmNoFingerOuterCircleColor=0xFFE0DBDB;
- /**
- *GestureLockView手指触摸的状态下内圆和外圆的颜色
- */
- privateintmFingerOnColor=0xFF378FC9;
- /**
- *GestureLockView手指抬起的状态下内圆和外圆的颜色
- */
- privateintmFingerUpColor=0xFFFF0000;
- /**
- *宽度
- */
- privateintmWidth;
- /**
- *高度
- */
- privateintmHeight;
- privatePathmPath;
- /**
- *指引线的开始位置x
- */
- privateintmLastPathX;
- /**
- *指引线的开始位置y
- */
- privateintmLastPathY;
- /**
- *指引下的结束位置
- */
- privatePointmTmpTarget=newPoint();
- /**
- *最大尝试次数
- */
- privateintmTryTimes=4;
- /**
- *回调接口
- */
- privateOnGestureLockViewListenermOnGestureLockViewListener;
- publicGestureLockViewGroup(Contextcontext,AttributeSetattrs)
- {
- this(context,attrs,0);
- }
- publicGestureLockViewGroup(Contextcontext,AttributeSetattrs,
- intdefStyle)
- {
- super(context,attrs,defStyle);
- /**
- *获得所有自定义的参数的值
- */
- TypedArraya=context.getTheme().obtainStyledAttributes(attrs,
- R.styleable.GestureLockViewGroup,defStyle,0);
- intn=a.getIndexCount();
- for(inti=0;i<n;i++)
- {
- intattr=a.getIndex(i);
- switch(attr)
- {
- caseR.styleable.GestureLockViewGroup_color_no_finger_inner_circle:
- mNoFingerInnerCircleColor=a.getColor(attr,
- mNoFingerInnerCircleColor);
- break;
- caseR.styleable.GestureLockViewGroup_color_no_finger_outer_circle:
- mNoFingerOuterCircleColor=a.getColor(attr,
- mNoFingerOuterCircleColor);
- break;
- caseR.styleable.GestureLockViewGroup_color_finger_on:
- mFingerOnColor=a.getColor(attr,mFingerOnColor);
- break;
- caseR.styleable.GestureLockViewGroup_color_finger_up:
- mFingerUpColor=a.getColor(attr,mFingerUpColor);
- break;
- caseR.styleable.GestureLockViewGroup_count:
- mCount=a.getInt(attr,3);
- break;
- caseR.styleable.GestureLockViewGroup_tryTimes:
- mTryTimes=a.getInt(attr,5);
- default:
- break;
- }
- }
- a.recycle();
- //初始化画笔
- mPaint=newPaint(Paint.ANTI_ALIAS_FLAG);
- mPaint.setStyle(Paint.Style.STROKE);
- //mPaint.setStrokeWidth(20);
- mPaint.setStrokeCap(Paint.Cap.ROUND);
- mPaint.setStrokeJoin(Paint.Join.ROUND);
- //mPaint.setColor(Color.parseColor("#aaffffff"));
- mPath=newPath();
- }
- @Override
- protectedvoidonMeasure(intwidthMeasureSpec,intheightMeasureSpec)
- {
- super.onMeasure(widthMeasureSpec,heightMeasureSpec);
- mWidth=MeasureSpec.getSize(widthMeasureSpec);
- mHeight=MeasureSpec.getSize(heightMeasureSpec);
- //Log.e(TAG,mWidth+"");
- //Log.e(TAG,mHeight+"");
- mHeight=mWidth=mWidth<mHeight?mWidth:mHeight;
- //setMeasuredDimension(mWidth,mHeight);
- //初始化mGestureLockViews
- if(mGestureLockViews==null)
- {
- mGestureLockViews=newGestureLockView[mCount*mCount];
- //计算每个GestureLockView的宽度
- mGestureLockViewWidth=(int)(4*mWidth*1.0f/(5*mCount+1));
- //计算每个GestureLockView的间距
- mMarginBetweenLockView=(int)(mGestureLockViewWidth*0.25);
- //设置画笔的宽度为GestureLockView的内圆直径稍微小点(不喜欢的话,随便设)
- mPaint.setStrokeWidth(mGestureLockViewWidth*0.29f);
- for(inti=0;i<mGestureLockViews.length;i++)
- {
- //初始化每个GestureLockView
- mGestureLockViews[i]=newGestureLockView(getContext(),
- mNoFingerInnerCircleColor,mNoFingerOuterCircleColor,
- mFingerOnColor,mFingerUpColor);
- mGestureLockViews[i].setId(i+1);
- //设置参数,主要是定位GestureLockView间的位置
- RelativeLayout.LayoutParamslockerParams=newRelativeLayout.LayoutParams(
- mGestureLockViewWidth,mGestureLockViewWidth);
- //不是每行的第一个,则设置位置为前一个的右边
- if(i%mCount!=0)
- {
- lockerParams.addRule(RelativeLayout.RIGHT_OF,
- mGestureLockViews[i-1].getId());
- }
- //从第二行开始,设置为上一行同一位置View的下面
- if(i>mCount-1)
- {
- lockerParams.addRule(RelativeLayout.BELOW,
- mGestureLockViews[i-mCount].getId());
- }
- //设置右下左上的边距
- intrightMargin=mMarginBetweenLockView;
- intbottomMargin=mMarginBetweenLockView;
- intleftMagin=0;
- inttopMargin=0;
- /**
- *每个View都有右外边距和底外边距第一行的有上外边距第一列的有左外边距
- */
- if(i>=0&&i<mCount)//第一行
- {
- topMargin=mMarginBetweenLockView;
- }
- if(i%mCount==0)//第一列
- {
- leftMagin=mMarginBetweenLockView;
- }
- lockerParams.setMargins(leftMagin,topMargin,rightMargin,
- bottomMargin);
- mGestureLockViews[i].setMode(Mode.STATUS_NO_FINGER);
- addView(mGestureLockViews[i],lockerParams);
- }
- Log.e(TAG,"mWidth="+mWidth+",mGestureViewWidth="
- +mGestureLockViewWidth+",mMarginBetweenLockView="
- +mMarginBetweenLockView);
- }
- }
- @Override
- publicbooleanonTouchEvent(MotionEventevent)
- {
- intaction=event.getAction();
- intx=(int)event.getX();
- inty=(int)event.getY();
- switch(action)
- {
- caseMotionEvent.ACTION_DOWN:
- //重置
- reset();
- break;
- caseMotionEvent.ACTION_MOVE:
- mPaint.setColor(mFingerOnColor);
- mPaint.setAlpha(50);
- GestureLockViewchild=getChildIdByPos(x,y);
- if(child!=null)
- {
- intcId=child.getId();
- if(!mChoose.contains(cId))
- {
- mChoose.add(cId);
- child.setMode(Mode.STATUS_FINGER_ON);
- if(mOnGestureLockViewListener!=null)
- mOnGestureLockViewListener.onBlockSelected(cId);
- //设置指引线的起点
- mLastPathX=child.getLeft()/2+child.getRight()/2;
- mLastPathY=child.getTop()/2+child.getBottom()/2;
- if(mChoose.size()==1)//当前添加为第一个
- {
- mPath.moveTo(mLastPathX,mLastPathY);
- }else
- //非第一个,将两者使用线连上
- {
- mPath.lineTo(mLastPathX,mLastPathY);
- }
- }
- }
- //指引线的终点
- mTmpTarget.x=x;
- mTmpTarget.y=y;
- break;
- caseMotionEvent.ACTION_UP:
- mPaint.setColor(mFingerUpColor);
- mPaint.setAlpha(50);
- this.mTryTimes--;
- //回调是否成功
- if(mOnGestureLockViewListener!=null&&mChoose.size()>0)
- {
- mOnGestureLockViewListener.onGestureEvent(checkAnswer());
- if(this.mTryTimes==0)
- {
- mOnGestureLockViewListener.onUnmatchedExceedBoundary();
- }
- }
- Log.e(TAG,"mUnMatchExceedBoundary="+mTryTimes);
- Log.e(TAG,"mChoose="+mChoose);
- //将终点设置位置为起点,即取消指引线
- mTmpTarget.x=mLastPathX;
- mTmpTarget.y=mLastPathY;
- //改变子元素的状态为UP
- changeItemMode();
- //计算每个元素中箭头需要旋转的角度
- for(inti=0;i+1<mChoose.size();i++)
- {
- intchildId=mChoose.get(i);
- intnextChildId=mChoose.get(i+1);
- GestureLockViewstartChild=(GestureLockView)findViewById(childId);
- GestureLockViewnextChild=(GestureLockView)findViewById(nextChildId);
- intdx=nextChild.getLeft()-startChild.getLeft();
- intdy=nextChild.getTop()-startChild.getTop();
- //计算角度
- intangle=(int)Math.toDegrees(Math.atan2(dy,dx))+90;
- startChild.setArrowDegree(angle);
- }
- break;
- }
- invalidate();
- returntrue;
- }
- privatevoidchangeItemMode()
- {
- for(GestureLockViewgestureLockView:mGestureLockViews)
- {
- if(mChoose.contains(gestureLockView.getId()))
- {
- gestureLockView.setMode(Mode.STATUS_FINGER_UP);
- }
- }
- }
- /**
- *
- *做一些必要的重置
- */
- privatevoidreset()
- {
- mChoose.clear();
- mPath.reset();
- for(GestureLockViewgestureLockView:mGestureLockViews)
- {
- gestureLockView.setMode(Mode.STATUS_NO_FINGER);
- gestureLockView.setArrowDegree(-1);
- }
- }
- /**
- *检查用户绘制的手势是否正确
- *@return
- */
- privatebooleancheckAnswer()
- {
- if(mAnswer.length!=mChoose.size())
- returnfalse;
- for(inti=0;i<mAnswer.length;i++)
- {
- if(mAnswer[i]!=mChoose.get(i))
- returnfalse;
- }
- returntrue;
- }
- /**
- *检查当前左边是否在child中
- *@paramchild
- *@paramx
- *@paramy
- *@return
- */
- privatebooleancheckPositionInChild(Viewchild,intx,inty)
- {
- //设置了内边距,即x,y必须落入下GestureLockView的内部中间的小区域中,可以通过调整padding使得x,y落入范围不变大,或者不设置padding
- intpadding=(int)(mGestureLockViewWidth*0.15);
- if(x>=child.getLeft()+padding&&x<=child.getRight()-padding
- &&y>=child.getTop()+padding
- &&y<=child.getBottom()-padding)
- {
- returntrue;
- }
- returnfalse;
- }
- /**
- *通过x,y获得落入的GestureLockView
- *@paramx
- *@paramy
- *@return
- */
- privateGestureLockViewgetChildIdByPos(intx,inty)
- {
- for(GestureLockViewgestureLockView:mGestureLockViews)
- {
- if(checkPositionInChild(gestureLockView,x,y))
- {
- returngestureLockView;
- }
- }
- returnnull;
- }
- /**
- *设置回调接口
- *
- *@paramlistener
- */
- publicvoidsetOnGestureLockViewListener(OnGestureLockViewListenerlistener)
- {
- this.mOnGestureLockViewListener=listener;
- }
- /**
- *对外公布设置答案的方法
- *
- *@paramanswer
- */
- publicvoidsetAnswer(int[]answer)
- {
- this.mAnswer=answer;
- }
- /**
- *设置最大实验次数
- *
- *@paramboundary
- */
- publicvoidsetUnMatchExceedBoundary(intboundary)
- {
- this.mTryTimes=boundary;
- }
- @Override
- publicvoiddispatchDraw(Canvascanvas)
- {
- super.dispatchDraw(canvas);
- //绘制GestureLockView间的连线
- if(mPath!=null)
- {
- canvas.drawPath(mPath,mPaint);
- }
- //绘制指引线
- if(mChoose.size()>0)
- {
- if(mLastPathX!=0&&mLastPathY!=0)
- canvas.drawLine(mLastPathX,mLastPathY,mTmpTarget.x,
- mTmpTarget.y,mPaint);
- }
- }
- publicinterfaceOnGestureLockViewListener
- {
- /**
- *单独选中元素的Id
- *
- *@paramposition
- */
- publicvoidonBlockSelected(intcId);
- /**
- *是否匹配
- *
- *@parammatched
- */
- publicvoidonGestureEvent(booleanmatched);
- /**
- *超过尝试次数
- */
- publicvoidonUnmatchedExceedBoundary();
- }
- }
注释极其详细,用极其不过分~主要就是onTouchEvent中对用户选择的GestureLockView进行判断,以及改变GestureLockView状态等。
5、布局文件
[html] view plain copy- <RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- xmlns:zhy="http://schemas.android.com/apk/res/com.zhy.zhy_gesturelockview"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
- <com.zhy.zhy_gesturelockview.view.GestureLockViewGroup
- android:id="@+id/id_gestureLockViewGroup"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:background="#F2F2F7"
- android:gravity="center_vertical"
- zhy:count="3"
- zhy:tryTimes="5"/>
- <!--zhy:color_no_finger_inner_circle="#ff085D58"
- zhy:color_no_finger_outer_circle="#ff08F0E0"
- zhy:color_finger_on="#FF1734BF"-->
- </RelativeLayout>
有兴趣的可以自定义属性,把注释的代码添进去就行,当然你也可以什么都不设置,单纯设置宽度和高度,我觉得默认效果也是不错的 ~
6、调用
[java] view plain copy- packagecom.zhy.zhy_gesturelockview;
- importandroid.app.Activity;
- importandroid.os.Bundle;
- importandroid.widget.Toast;
- importcom.zhy.zhy_gesturelockview.view.GestureLockViewGroup;
- importcom.zhy.zhy_gesturelockview.view.GestureLockViewGroup.OnGestureLockViewListener;
- publicclassMainActivityextendsActivity
- {
- privateGestureLockViewGroupmGestureLockViewGroup;
- @Override
- protectedvoidonCreate(BundlesavedInstanceState)
- {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- mGestureLockViewGroup=(GestureLockViewGroup)findViewById(R.id.id_gestureLockViewGroup);
- mGestureLockViewGroup.setAnswer(newint[]{1,2,3,4,5});
- mGestureLockViewGroup
- .setOnGestureLockViewListener(newOnGestureLockViewListener()
- {
- @Override
- publicvoidonUnmatchedExceedBoundary()
- {
- Toast.makeText(MainActivity.this,"错误5次...",
- Toast.LENGTH_SHORT).show();
- mGestureLockViewGroup.setUnMatchExceedBoundary(5);
- }
- @Override
- publicvoidonGestureEvent(booleanmatched)
- {
- Toast.makeText(MainActivity.this,matched+"",
- Toast.LENGTH_SHORT).show();
- }
- @Override
- publicvoidonBlockSelected(intcId)
- {
- }
- });
- }
- }
调用是不是so easy,懒得看代码又需要用的,可以直接拿来使用,等哪天闲着蛋疼可以研究研究代码~
ok,有任何问题的留言~
源码明天到公司贴出来吧,尼玛,这是拿手机共享的热点写的,我的流量啊~~~~还好是1号~
源码点击下载
更多相关文章
- 记录状态栏与布局重合,状态栏颜色问题
- Android沉浸式状态栏实现
- android 3g状态及信号监测
- Android为Layout设置最大宽度
- Android获取状态栏、标题栏、ActionBar以及屏幕的高度
- Android状态栏上添加按钮
- Android获取屏幕的高度和宽度
- android去掉layout顶部的阴影(状态栏下边的阴影)
- Android 状态栏和应用标题栏颜色保持一致