纯代码绘制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);}//每一个点都有些数据,有范围,还有一些状态,根据一些状态判断一些@Overrideprotected 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);}@Overridepublic 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);}
}

好了,这样简单的九个点点就出来了,具体怎么运用看要求了

android简单的九宫格解锁view相关推荐

  1. 自定义view学习-创建自己的九宫格解锁view

    先上效果图 效果如上,接下来是如何实现,并没有那么快上代码,不看代码不舒服的请迅速下翻. 九宫格解锁还是比较经典的,作为学习自定义view的入门. 对于九宫格解锁,我的实现思路是这样的: 1.先在屏幕 ...

  2. 猿创征文|Android kotlin实现九宫格解锁

    目录 2.kotlin实现九宫格解锁的实现步骤如下 2.1 自定义解锁绘制View 2.2 绘制用到的Point类

  3. Android自定义控件实现九宫格解锁

    最终效果如下 1.进行定义实体point点 public class Point {private float x; private float y; //正常模式 public static fin ...

  4. Android之九宫格解锁的实现

    九宫格解锁在Android中应用的很广泛,也是Android特有的一种解锁方式,其实实现起来也并不是很复杂,下面我就根据系统源码LockPatternView,移植出来的一个更加简单小巧九宫格解锁的例 ...

  5. 自定义View学习——九宫格解锁(LockPatternView)

    虽然现在的应用很少在使用九宫格解锁,不过系统的应用锁还是可以见到的.实现的效果如下: 分析 首先需要绘制出九宫格,每一个单元格有两个半径不同的同心圆. 当我们的手指在九宫格上触摸时,如果我们触摸在某个 ...

  6. android自定义view之九宫格解锁

    android自定义view之九宫格解锁 更多细节请看源码 https://github.com/que123567/lockview 1. 定义一个类作为九宫格的格子 包含坐标和索引(用来记录密码) ...

  7. android自定义滑块解锁,使用Android自定义控件实现滑动解锁九宫格

    本文概述: 滑动解锁九宫格的分析: 1.需要自定义控件: 2.需要重写事件onTouchEvent(); 3.需要给九个点设置序号和坐标,这里用Map类就行: 4.需要判断是否到滑到过九点之一,并存储 ...

  8. android 九宫格解锁源码,Android 自己动手实现滑动九宫格解锁

    Android 自己动手实现滑动九宫格解锁 文章主要以实现思路为主.来带领大家逐步实现该效果功能.如有问题,请多多提出 效果预览 整体思路分析 九宫格滑动解锁,为当下比较热门的手机,Pad等触屏设备很 ...

  9. android九宫格布局解锁,Android onDraw()--九宫格解锁

    onDraw这个方法在自定义中尤其重要,我们可以measure之后通过Canvas进行绘制,九宫格解锁这个View现在已经被人脸跟指纹给替代了,但是做起来还是有点东西的. 下面就是做这个View的思路 ...

最新文章

  1. 蚂蚁森林合种计划(2020.11.14,7天有效,每周6更新)
  2. 第三章 用户界面设计
  3. hibernate的一对一主键双向映射关系和外键双向映射关系(一)
  4. naarray查询 swift_Swift 4最全的新特性详细解析(推荐)
  5. 用计算机弹生僻字乐谱,生僻字 E调 (拇指琴卡林巴琴弹奏谱)_谱友园地_中国曲谱网...
  6. 查看redis aof内存_Redis持久化问题定位与优化技巧
  7. Servlet第一篇【介绍Servlet、HTTP协议、WEB目录结构、编写入门Servlet程序、Servlet生命周期】
  8. python圆面积函数_Python基础函数必学
  9. layuimini 图标颜色便捷指定
  10. LeetCode 386. Lexicographical Numbers
  11. Uber的微服务架构实践
  12. 软考中级软件设计师教程(第5版)知识点笔记第一章计算机系统知识持续更新中...
  13. 【自考】-计算机网络原理
  14. 第六章 图论 AcWing 1635. 最大集团
  15. 华为自研系统鸿蒙为什么也要基于linux来开发?
  16. NASA WIND卫星观测数据作图——origin
  17. WebDAV之葫芦儿·派盘+书藏家
  18. Spring的第二次模拟考试
  19. 2020年厦门市技能大赛-网络搭建与应用竞赛-正式赛卷(一)技能要求(附脚本配置)
  20. 图像处理算法(二)---图像常用颜色空间

热门文章

  1. webrtc系列之-像老鼠一样打洞
  2. linux 临时文件类型,Linux命令:文件管理--tmpwatch--删除临时文件
  3. 下楼问题(来源:学堂在线 程序设计基础)
  4. CSS消除ul和li的间隔
  5. oracle 的rpad函数,关于oracle 10g在utf8字符集下的rpad函数的疑惑
  6. Linux input按键设备驱动
  7. 美学生用ChatGPT写论文被识破,导师:好到不符合我对学生的预期
  8. 质数表因式分解 c语言,素数表+因式分解+完美数
  9. 杨辉三角 python
  10. 机器学习理论与实战(十六)概率图模型04