android简单的九宫格解锁view
来源:互联网 发布:响应式影视网站建设cms 编辑:程序博客网 时间:2024/05/11 08:56
纯代码绘制view有点粗糙
直接给代码吧,挺简单的
下面是主view代码
package jack.com.mypoint;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.view.MotionEvent;import android.view.View;import android.widget.ListView;import java.util.ArrayList;import java.util.List;/** * Created by Jack on 2014/8/19. */public class MyView extends View { private Point[] points = new Point[9]; private static int POINT_SPACE = 70; private static int PADDING_LEFT_RIGHT = 30; private static int outer_size = 15; private static int outer_stork_size = 3; private static int inner_size = 5; private static int line_size = 5; private boolean isInitPoints = false; private boolean isDrawAutoLine = false; private boolean isStorkInnerCircle = false; private StringBuilder pointIndex = null; public MyView(Context context){ super(context); POINT_SPACE = dip2px(context,POINT_SPACE); PADDING_LEFT_RIGHT = dip2px(context,PADDING_LEFT_RIGHT); outer_size = dip2px(context, outer_size); inner_size = dip2px(context, inner_size); line_size = dip2px(context, line_size); outer_stork_size = dip2px(context,outer_stork_size); } //每一个点都有些数据,有范围,还有一些状态,根据一些状态判断一些 @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); int width = canvas.getWidth(); int height = canvas.getHeight(); System.out.println("宽度=" + width + "高度=" + height); initPoints(width/2,height/2,canvas); } @Override public boolean onTouchEvent(MotionEvent event) { final int action = event.getAction(); switch (action){ case MotionEvent.ACTION_DOWN: pointIndex = new StringBuilder();// mIndex=null; isStorkInnerCircle = false;// mIndex = new String(); isInitPoints=false; int x = (int) event.getX(); int y = (int) event.getY(); for(int i = 0;i<points.length;i++){ points[i].isSelect = false; } for(int i = 0;i<points.length;i++){ //未选中 if(points[i].getPointRect().contains(x,y)){// mIndex+=i+""; points[i].isSelect = true; pointIndex.append(i+""); break; } } break; case MotionEvent.ACTION_MOVE: isDrawAutoLine = true; int moveX = (int) event.getX(); int moveY = (int) event.getY(); if(pointIndex.length()>0){ String index = pointIndex.toString(); int len = index.length(); String last = index.substring(len-1,len);// System.out.println("最后的位置"+last); points[Integer.valueOf(last)].moveX = moveX; points[Integer.valueOf(last)].moveY = moveY; } for(int i = 0;i<points.length;i++){ if(points[i].isSelect){ //当前点被选中 System.out.println("当前选中的点"+i); }else{ //未选中点 if(points[i].getPointRect().contains(moveX,moveY)){ System.out.println("当前添加的点"+i+"---"+points[i].isSelect); //滑动到某一个点的范围里面,记录位置 pointIndex.append(i);// mIndex+=i; points[i].isSelect = true; } } } break; case MotionEvent.ACTION_UP:// isInitPoints = false; isDrawAutoLine = false; isStorkInnerCircle = true; break; } postInvalidate();// invalidate(); return true; } private void initPoints(int width,int height,Canvas canvas){ if(!isInitPoints){ System.out.println("初始化"); POINT_SPACE = width-PADDING_LEFT_RIGHT; Point p0 = new Point(); p0.setPosition(PADDING_LEFT_RIGHT,height-POINT_SPACE); points[0] = p0; points[1] = new Point().setPosition(width,height-POINT_SPACE); points[2] = new Point().setPosition(width*2-PADDING_LEFT_RIGHT,height-POINT_SPACE); points[3] = new Point().setPosition(PADDING_LEFT_RIGHT,height); points[4] = new Point().setPosition(width,height); points[5] = new Point().setPosition(width*2-PADDING_LEFT_RIGHT,height); points[6] = new Point().setPosition(PADDING_LEFT_RIGHT,height+POINT_SPACE); points[7] = new Point().setPosition(width,height+POINT_SPACE); points[8] = new Point().setPosition(width*2-PADDING_LEFT_RIGHT,height+POINT_SPACE); isInitPoints = true; } Paint paint = new Paint(); paint.setAntiAlias(true); if(pointIndex!=null){ if(pointIndex.length()>0){ paint.setColor(Color.DKGRAY); paint.setStrokeWidth(line_size); String index = pointIndex.toString(); int len = index.length(); String last = index.substring(len-1,len); System.out.println("最后的位置"+len+"----"+last+"---"+index); //之前的使用线连接起来 if(len>1){ for(int i=2;i<=len;i++){ System.out.println("绘制线条"); Point con = points[Integer.valueOf(index.substring(i-1,i))]; Point preCon = points[Integer.valueOf(index.substring(i-2,i-1))]; canvas.drawLine(preCon.centerX,preCon.centerY,con.centerX,con.centerY,paint); } } Point p = points[Integer.valueOf(last)]; if(p.moveX!=0||p.moveY!=0){ if(isDrawAutoLine){ p.drawLine(canvas,paint,p); }else{ System.out.println("顺心--->"+index); } } paint.reset(); } } for(int i = 0;i<points.length;i++){ if(points[i].isSelect){ paint.setStyle(Paint.Style.STROKE); paint.setStrokeWidth(outer_stork_size); paint.setColor(Color.CYAN); canvas.drawCircle(points[i].centerX,points[i].centerY,outer_size,paint); paint.reset(); } if(isStorkInnerCircle&&points[i].isSelect){ paint.setColor(Color.GREEN); paint.setStyle(Paint.Style.STROKE); paint.setStrokeWidth(2); canvas.drawCircle(points[i].centerX,points[i].centerY,inner_size,paint); paint.reset(); }else{ paint.setColor(Color.GREEN); canvas.drawCircle(points[i].centerX,points[i].centerY,inner_size,paint); } } } /** * 根据手机的分辨率从 dp 的单位 转成为 px(像素) */ public static int dip2px(Context context, float dpValue) { final float scale = context.getResources().getDisplayMetrics().density; return (int) (dpValue * scale + 0.5f); } /** * 根据手机的分辨率从 px(像素) 的单位 转成为 dp */ public static int px2dip(Context context, float pxValue) { final float scale = context.getResources().getDisplayMetrics().density; return (int) (pxValue / scale + 0.5f); }}
</pre><pre name="code" class="java">
下面是每个点的信息和代码
<pre name="code" class="java">package jack.com.mypoint;import android.graphics.Canvas;import android.graphics.Paint;import android.graphics.RectF;/** * Created by Jack on 2014/8/20. */public class Point { public int preX; public int preY; public int centerX; public int centerY; private int innerRadio; private int storkRadio; public boolean isSelect = false;//默认未选中 public int moveX; public int moveY; public Point setPosition(int centerX,int centerY){ this.centerX = centerX; this.centerY = centerY; return this; } public void setRadioSize(int innerRadio,int storkRadio){ this.innerRadio = innerRadio; this.storkRadio = storkRadio; } public RectF getPointRect(){ return new RectF(centerX-40,centerY-40,centerX+40,centerY+40); } public void drawLine(Canvas canvas,Paint paint,Point point){ canvas.drawLine(point.centerX,point.centerY,moveX,moveY,paint); }}
好了,这样简单的九个点点就出来了,具体怎么运用看要求了
0 0
- android简单的九宫格解锁view
- android自定义view之九宫格解锁
- android自定义view之九宫格解锁
- 自定义view学习-创建自己的九宫格解锁view
- android九宫格解锁
- Android九宫格解锁
- 自定义View----Android九宫格手势密码解锁
- android 自定义view实现九宫格手势解锁
- 自定义View----Android九宫格手势密码解锁
- Android之九宫格解锁的实现
- Android之九宫格解锁的实现
- Android之九宫格解锁的实现
- Android九宫格解锁的实现
- Android手势解锁, 九宫格解锁
- Android 九宫格解锁框架
- Android 自定义九宫格解锁
- 九宫格解锁Android代码
- Android九宫格解锁应用
- 95后的社交网络图谱:年轻人都在哪里交朋友?
- poj 2774 Long Long Message,后缀数组,求最长公共子串 hdu1403
- CCClippingNode
- Qt总结: 信号与槽
- leetcode 之 Flatten Binary Tree to Linked List
- android简单的九宫格解锁view
- fragments
- 动态库开发
- VMware NAT 端口映射
- Java创建线程安全的方法
- 数据库总结之触发器存储过程
- 查看 SELinux状态及关闭SELinux
- XDOJ 1209 - 破译电话号码
- class的大小分析