千家信息网

Android怎么绘制九宫格解锁控件

发表于:2025-01-24 作者:千家信息网编辑
千家信息网最后更新 2025年01月24日,这篇"Android怎么绘制九宫格解锁控件"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这
千家信息网最后更新 2025年01月24日Android怎么绘制九宫格解锁控件

这篇"Android怎么绘制九宫格解锁控件"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇"Android怎么绘制九宫格解锁控件"文章吧。

自定义控件的代码如下:

public class LockedView extends View {     private boolean isFirst = true;//设置第一次加载时为true,后面重新画图不再执行    private int width, height;//获取控件的宽度和高度    private int offsetX, offsetY;//获取点坐标时的X轴和Y轴的偏移量    private Point[][] pointList;//每个点的坐标存放的数组    private int r;//每个圆的半径    private Bitmap map1, map2, map3;//3种状态的bitmap    private float eventX, eventY;//触摸控件时的X坐标和Y坐标    private boolean isPressed;//判断是否触摸着控件    private boolean moveOnPoint;//判断是否移动到一个点上了    private boolean isFinish;//判断手势是否结束    private List list = new ArrayList<>();//存放经过的点的集合    private Point checkedPoint;    private Paint paint;//画笔    public static final int LOCKED_FIRST=0;//第一次加载acitivity时设置密码时的返回值    public static final int LOCKED_TRUE=1;//解锁成功时的返回值    public static final int LOCKED_FALSE=2;//解锁失败的返回值    private OnLockedChangedListener onLocked;//接口回调     public LockedView(Context context, AttributeSet attrs) {        super(context, attrs);     }     @Override    protected void onDraw(Canvas canvas) {        super.onDraw(canvas);        //判断是否第一次加载        if (isFirst) {            //初始化点坐标            initPoints();            //初始化画笔            initPaint();            isFirst = false;        }        //根据每个点的状态来画对应的bitmap        drawPoints(canvas);        //画手势滑动过程中的线        drawLines(canvas);    }     //初始化画笔    private void initPaint() {        paint = new Paint(Paint.ANTI_ALIAS_FLAG);        //设置画笔颜色为蓝色        paint.setColor(getResources().getColor(R.color.LockedColor));        //设置画笔的宽度为8        paint.setStrokeWidth(8);    }     //画线    private void drawLines(Canvas canvas) {        //如果集合有值        if (list.size() > 0) {            //获得起始点的实例            Point startPoint = list.get(0);            for (int i = 1; i < list.size(); i++) {                //获得停止点的实例                Point stopPoint = list.get(i);                //根据起始点坐标跟停止点坐标来画线                canvas.drawLine(startPoint.getX(), startPoint.getY(), stopPoint.getX(), stopPoint.getY(), paint);                //把停止点赋值给起始点,这样每次遍历的时候起始点都是上一个点                startPoint = stopPoint;            }            //如果没有移动到一个点上            if (moveOnPoint == false) {                //则根据最后个点的坐标跟当前手势移动的坐标画线                canvas.drawLine(startPoint.getX(), startPoint.getY(), eventX, eventY, paint);            }         }    }     //设置触摸事件    @Override    public boolean onTouchEvent(MotionEvent event) {        //获得触摸的X坐标        eventX = event.getX();        //获得触摸的Y坐标        eventY = event.getY();        //每次触摸到离开屏幕之前都默认为没有完成        isFinish = false;        //默认移动到点上了        moveOnPoint = true;        //选中的点        checkedPoint = null;        switch (event.getAction()) {            case MotionEvent.ACTION_DOWN:                //如果按下,重置下点                reset();                //根据触摸的X,Y坐标以及圆的半径来判断是否触摸到了一个圆上,如果有则返回实例,没有则返回空                checkedPoint = checkPoint(eventX, eventY, r);                if (checkedPoint != null) {                    //如果实例不为空,则设置选中点的状态为选中                    checkedPoint.setState(Point.POINT_XUANZHONG);                    //第一次按下按到点上时设置为true                    isPressed = true;                }                break;            case MotionEvent.ACTION_MOVE:                //如果按下在一个点上,就会执行移动动作的逻辑                if (isPressed) {                    //同上                    checkedPoint = checkPoint(eventX, eventY, r);                    if (checkedPoint != null) {                        checkedPoint.setState(Point.POINT_XUANZHONG);                        //如果实例不为空,则设置移动到了点上                        moveOnPoint = true;                    } else {                        //否则设置没有移动到点上                        moveOnPoint = false;                    }                }                break;            case MotionEvent.ACTION_UP:                //抬起时,设置第一次按在点上的参数为false以及完成了触摸过程                isPressed = false;                isFinish = true;                break;            case MotionEvent.ACTION_CANCEL:                isPressed = false;                isFinish = true;                break;        }        //如果第一下按在了点上并且没有完成触摸并且选中的点的实例不为空        if (isPressed && !isFinish && checkedPoint != null) {            //判断这个实例是否在list集合中            if (isInList(checkedPoint)) {                //如果在,则设置没有移动在点上                moveOnPoint = false;            } else {                //否则就添加到集合里面                list.add(checkedPoint);            }            //如果完成了触摸        } else if (isFinish) {            if (list.size() > 0) {                //如果集合长度为1,则表示只是摸到了一个点,直接重置                if(list.size()==1){                    reset();                    //如果集合长度小于5,则表示密码太短了不符合要求,把选中的点设置为错误状态,并且通过接口回调返回数据                }else if(list.size()<5){                    errorPoint();                    if(onLocked!=null){                        onLocked.onResult("密码太短");                    }                    //如果集合长度满足要求,则通过接口的返回值,来判断不同的情况                }else if(list.size()>=5){                    StringBuffer buffer=new StringBuffer();                    for(int i=0;i

activity代码:

public class LockedActivity extends Activity {     private LockedView lockedView;    private TextView textView;    private SharedPreferences preferences;    private String pass;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_locked);        //初始化控件        lockedView= (LockedView) findViewById(R.id.lockedView);        textView= (TextView) findViewById(R.id.textView);        //获得shared        preferences=getSharedPreferences("Locked",MODE_PRIVATE);        //根据存储在shared里的键获得密码值        pass=preferences.getString("password","");        //如果没有代表第一次启动activity,则textview设置文本为情设置密码,如果不是第一次启动,则设置文本为请解锁        if(pass.equals("")){            textView.setText("请设置密码");        }else{            textView.setText("请解锁");        }        lockedView.setOnLockedChangedListener(new LockedView.OnLockedChangedListener() {            @Override            public int onPassword(String password) {                //从shared里取值                pass=preferences.getString("password","");                //如果值为空,则把接口返回的password存入shared里                if(pass.equals("")){                    SharedPreferences.Editor editor=preferences.edit();                    editor.putString("password",password);                    editor.commit();                    textView.setText("请解锁");                    return 0;                }else if(pass.equals(password)){                    //如果匹配了密码,则返回数字1代表解锁成功                    return 1;                }                //如果不匹配密码返回2                return 2;            }             @Override            public void onResult(String result) {                //根据密码匹配情况再从接口获得要toast的数据                Toast.makeText(LockedActivity.this,result,Toast.LENGTH_SHORT).show();                //数据是解锁成功,则跳转activity                if(result.equals("解锁成功")){                    Intent intent=new Intent(LockedActivity.this,MainActivity.class);                    startActivity(intent);                }            }        });    }}

布局代码如下:

         

以上就是关于"Android怎么绘制九宫格解锁控件"这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注行业资讯频道。

0