Android 实现图形解锁

Rust Slint实现Android的图案密码(图形解锁)源码分享 本文分享了使用Rust Slint框架实现Android图案密码解锁功能的源码。通过Slint的声明式UI语法,实现了9点图案密码的交互界面,包含按钮点击效果和连线绘制功能。源码结构清晰,包含main.rs主程序和main.slint界面定义文件,后者详细实现了按钮组件、连线绘制逻辑和触摸交互状态管理。工程采用MVVM架构,通过DataAdapter处理业务逻辑,展示了Slint在移动端UI开发中的强大能力。项目可作为Rust GUI开发的参考案例,适合学习Slint框架和移动端安全验证功能实现。 阅读详情
前一久写了一个图形锁的view,实现的难度不是很大,不过对初学者学习自定义view,觉得还是一个很好的例子吧,当然每个人实现的图形锁界面有不同的逻辑,对界面之间的连接也有不一样的控制能力。如果本文有功能没有达到读者的需求或者是与读者需求不一样的,可以自己改一下代码,都很简单

先上图片

![没有划线的时候]

这里写图片描述
![匹配错误的时候]

这里写图片描述

代码


##点的类,在里面实现draw方法。##

/**
 * Created by sunshine
 */
public class Point  {

    //私有属性
    private int id;
    private float x;
    private float y;
    private boolean isTouched;
    private boolean isError;
    private Paint paint;
    /**
     * 共有属性
     */
    //圆环的画笔大小
    private static int STROKE_WIDTH=10;

    //普通颜色
    private static int COLOR_DEFAULT= Color.YELLOW;

    //点击之后的颜色
    private static  int COLOR_CHOOSED=Color.GREEN;

    //错误之后的颜色
    private static int COLOR_ERROR=Color.RED;

    //圆环的半径
    private float radious;

    public Point(){}

    public Point(float x,float y,int id){
        this.x=x;
        this.y=y;
        this.isError=false;
        this.isTouched=false;
        radious=60;
        paint=new Paint();
        this.id=id;
    }
    public void setTouched(boolean isTouched){
        this.isTouched=isTouched;
    }
    public void setIsError(boolean isError){
        this.isError=isError;
    }
    public void draw(Canvas canvas){
        paint.setColor(isTouched ? (isError ? COLOR_ERROR : COLOR_CHOOSED) : COLOR_DEFAULT);
        paint.setStrokeWidth(STROKE_WIDTH);
        paint.setAntiAlias(true);
        canvas.drawPoint(x, y, paint);
        paint.setStyle(Paint.Style.STROKE);
        canvas.drawCircle(x,y,radious,paint);
    }

    public static void setColorChoosed(int colorChoosed) {
        COLOR_CHOOSED = colorChoosed;
    }

    public static void setColorDefault(int colorDefault) {
        COLOR_DEFAULT = colorDefault;
    }

    public static void setColorError(int colorError) {
        COLOR_ERROR = colorError;
    }

    public static void setStrokeWidth(int strokeWidth) {
        STROKE_WIDTH = strokeWidth;
    }

    public void setRadious(float radious) {
        this.radious = radious;
    }

    public void setX(float x) {
        this.x = x;
    }

    public void setY(float y) {
        this.y = y;
    }

    public void setIsTouched(boolean isTouched) {
        this.isTouched = isTouched;
    }

    public float getX() {
        return x;
    }

    public float getY() {
        return y;
    }

    public int getId() {
        return id;
    }
    public boolean getTouchState(){
        return isTouched;
    }

    public void setLocation(float x, float y) {
        this.x=x;
        this.y=y;
    }
}

接下来就是主要的ImageLock的view了

首先我们的ImageLock 要继承自View 然后重写onlayout 方法,在onlayout方法中进行布局。将9个点的分布处理好

  @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
        super.onLayout(changed, left, top, right, bottom);
        height=getHeight();
        width=getWidth();
        pointList.clear();

        //进行点的布局
        for(int i=0;i<3;i++){
            for (int j=0;j<3;j++){
                Point point=new Point((2*j+1)*width/6,(2*i+1)*width/6,i*3+j);
                pointList.add(point);
            }
        }
    }

然后就是画点划线了,在这里我们定义一个划线的方法,然后监视手指触摸的那个点跟九个点的距离,这个距离在小于预先设定的一个值的时候就判定那个点被选中

 @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        //画一般的点
        for(int i=0;i<pointList.size();i++){
            Point point=pointList.get(i);
            point.draw(canvas);
        }

        //划线
        if(pointQueue.size()>0){
            drawTouchedLine(canvas);
        }
    }

    public void drawTouchedLine(Canvas canvas){
        //设置画笔的粗细
        linePaint.setStrokeWidth(painWidth);
        //设置画笔的颜色
        if(isMatch){
            linePaint.setColor(matchColor);
        }else{
            linePaint.setColor(errorColor);
        }

        //设置画笔的透明度
        linePaint.setAlpha(100);
        for(int j=0;j<pointQueue.size()-1;j++){
            Point point1=pointQueue.get(j);
            Point point2=pointQueue.get(j+1);
            canvas.drawLine(point1.getX(),point1.getY(),point2.getX(),point2.getY(),linePaint);
        }
        //最后一条能动的线
        if(isMatch&&isTouched){
            Point latePoint=pointQueue.get(pointQueue.size()-1);
            canvas.drawLine(latePoint.getX(),latePoint.getY(),eventPoint.getX(),eventPoint.getY(),linePaint);
        }else{
            return ;
        }
    }

最后将视图的手势抬起设置一个接口

 private OnTouchUpListener listener;

    public interface OnTouchUpListener{
        public void onTouchUp();
    }
    public void setTouchUpListener(OnTouchUpListener listener){
        this.listener=listener;
    }

这里将所有的代码贴出来吧,不难,也没有什么写的

public class ImageLock extends View {

    //视图的整体宽高
    private int height;
    private int width;

    /**
     *     存放所有点的集合
     */
    private List<Point> pointList=new ArrayList<Point>();

    /**
     *被选择点的顺序队列
     */
    private List<Point> pointQueue=new ArrayList<Point>();

    /**
     * 是否是对的
     */
    private boolean isMatch;

    /**
     * 事件的点
     */
    private Point eventPoint;

    /**
     * 圆的半径
     */
    private int radious;
    /**
     * 画线的画笔
     */
    private Paint linePaint;

    /**
     * 划线的颜色
     */
    private int matchColor;
    private int errorColor;
    /**
     * 划线的粗细
     */
    private int painWidth;

    /**
     * 是否抬起来
     */
    private boolean isTouched;
    private OnTouchUpListener listener;

    public interface OnTouchUpListener{
        public void onTouchUp();
    }



    public ImageLock(Context context) {
        super(context);
        init();
    }

    public ImageLock(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public ImageLock(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }
    public void init(){
        isMatch=true;
        radious=50;
        linePaint=new Paint();
        eventPoint=new Point();
        matchColor=Color.CYAN;
        errorColor=Color.RED;
        painWidth=20;
    }
    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
        super.onLayout(changed, left, top, right, bottom);
        height=getHeight();
        width=getWidth();
        pointList.clear();

        //进行点的布局
        for(int i=0;i<3;i++){
            for (int j=0;j<3;j++){
                Point point=new Point((2*j+1)*width/6,(2*i+1)*width/6,i*3+j);
                pointList.add(point);
            }
        }
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        //画一般的点
        for(int i=0;i<pointList.size();i++){
            Point point=pointList.get(i);
            point.draw(canvas);
        }

        //划线
        if(pointQueue.size()>0){
            drawTouchedLine(canvas);
        }
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction())
        {
            case MotionEvent.ACTION_DOWN:
            case MotionEvent.ACTION_MOVE:
                eventPoint.setLocation(event.getX(), event.getY());

                isTouched=true;

                //判断是不是触碰到点
                pointTouchEvent(eventPoint);

                break;
            case MotionEvent.ACTION_UP:
                isTouched=false;
                if(listener!=null){
                    listener.onTouchUp();
                }

                invalidate();
                break;
        }
        return true;
    }

    public void drawTouchedLine(Canvas canvas){
        //设置画笔的粗细
        linePaint.setStrokeWidth(painWidth);
        //设置画笔的颜色
        if(isMatch){
            linePaint.setColor(matchColor);
        }else{
            linePaint.setColor(errorColor);
        }

        //设置画笔的透明度
        linePaint.setAlpha(100);
        for(int j=0;j<pointQueue.size()-1;j++){
            Point point1=pointQueue.get(j);
            Point point2=pointQueue.get(j+1);
            canvas.drawLine(point1.getX(),point1.getY(),point2.getX(),point2.getY(),linePaint);
        }
        //最后一条能动的线
        if(isMatch&&isTouched){
            Point latePoint=pointQueue.get(pointQueue.size()-1);
            canvas.drawLine(latePoint.getX(),latePoint.getY(),eventPoint.getX(),eventPoint.getY(),linePaint);
        }else{
            return ;
        }
    }

    public void pointTouchEvent(Point point){
        for(int i=0;i<pointList.size();i++){
            Point currenPoint=pointList.get(i);
            //判断是否触碰到点
            if(Math.sqrt(Math.pow(point.getX()-currenPoint.getX(),2)+Math.pow(point.getY()-currenPoint.getY(),2))<=radious){
                //给触碰到的点进行压栈
                for(int j=0;j<pointQueue.size();j++){
                    if(pointQueue.get(j).getId()==currenPoint.getId()){
                        return;//如果这个点已经在这个队列中就不让他可以压栈,从而进行事件的消费
                    }
                }
                pointList.get(i).setTouched(true);
                currenPoint.setTouched(true);
                pointQueue.add(currenPoint);
            }
        }
        invalidate();
    }
    public void setMatch(boolean isMatch){
        this.isMatch=isMatch;
        for(int i=0;i<pointQueue.size();i++){
            pointQueue.get(i).setIsError(!isMatch);
        }
        invalidate();
    }

    public void resetChooseList(){
        pointQueue.clear();
        for(int i=0;i<pointList.size();i++){
            pointList.get(i).setTouched(false);
            pointList.get(i).setIsError(false);
        }
        isMatch=true;
        invalidate();
    }
   public String getSecret(){
       String secret=new String();
       for(int i=0;i<pointQueue.size();i++){
           secret+=pointQueue.get(i).getId();
       }
       return secret;
   }
    public void setTouchUpListener(OnTouchUpListener listener){
        this.listener=listener;
    }

    public void setErrorColor(int errorColor) {
        this.errorColor = errorColor;
    }

    public void setLinePaint(Paint linePaint) {
        this.linePaint = linePaint;
    }

    public void setMatchColor(int matchColor) {
        this.matchColor = matchColor;
    }

    public void setPainWidth(int painWidth) {
        this.painWidth = painWidth;
    }

    public void setRadious(int radious) {
        this.radious = radious;
    }

    public void setWidth(int width) {
        this.width = width;
    }

    public void setHeight(int height) {
        this.height = height;
    }
}

最后在主函数中调用

具体怎么设置视图都有接口,还可以对数据进行一些加密保存在本地,具体也就不在阐述了,一下是我测试的时候的代码以及布局文件


public class MainActivity extends AppCompatActivity {
    private ImageLock imageLock;
    private Button btn;
    String str;
    private String key="123";


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        imageLock= (ImageLock) findViewById(R.id.iamgeLock_main);
        btn= (Button) findViewById(R.id.btn_main_clear);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                imageLock.resetChooseList();
            }
        });
        imageLock.setTouchUpListener(new ImageLock.OnTouchUpListener() {
            @Override
            public void onTouchUp() {
                imageLock.setMatch(false);
                str = imageLock.getSecret();
                if(str.equals(key)){
                    Toast.makeText(MainActivity.this,"right",Toast.LENGTH_SHORT).show();
                    imageLock.setMatch(true);
                }else{
                    imageLock.setMatch(false);
                }
            }
        });


    }
}

布局文件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".activity.MainActivity">

  <com.happysmile.imagelock.custom.ImageLock
      android:layout_marginBottom="150dp"
      android:id="@+id/iamgeLock_main"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content" />
    <RelativeLayout
        android:layout_alignParentBottom="true"
        android:layout_width="wrap_content"
        android:layout_height="150dp">

        <Button
            android:background="@color/colorPrimary"
            android:textSize="50dp"
            android:gravity="center"
            android:layout_alignParentBottom="true"
            android:text="clear"
            android:id="@+id/btn_main_clear"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

    </RelativeLayout>

最后:本人写博客经验不足,水平有限,还望大家多指正,共同学习

Android 图形解锁源码.zip 现在手机上面的图形解锁已经很平凡了,看到那个,是不是就像要看代码的冲动啊,有代码了,是不是想试一试啊,从网上下载了其中的一个,代码量太大了,真的是很受不了啊,刺激人呢这不是!然后我就从别的地方扣了一个小段代码,只有一个类,可以直接调用,不用做任何修改,当初拿到手的是,注释是一堆的乱码,我转化也没用成功,所以我就给删了,我给eclipse安装插件也不管用没有解决这个问题,所以你们要是能看懂的话就消化掉,看不懂,你们就直接拿去用吧!    立即下载

相关推荐

Android图案解锁源代码

Android图案解锁的源代码,有注释,可方便扩展。

【亲测免费】 Android图案解锁库PatternLocker使用指南

PatternLocker 是一个针对Android应用的开源库,专注于提供图案解锁功能,即手势密码或九宫格密码的实现。它包括主要控件`PatternLockerView`负责图案的设定和验证,以及辅助控件`PatternIndicatorView`,用于视觉上的指示辅助,可以根据不同的界面设计需求选用。用户可以通过高度自定义配置颜色、线条宽度、状态样式等,甚至控制操作反馈如触碰时的震动效果。

gitblog_00171的博客 871

基于Android的图案解锁实现

实现思路: 1、自定义LockPatterView控件,定义九宫格点的类型,实现绘制九宫格布局。 2、重写onTouchEvent()事件,完成选中点的绘制。 3、绘制两点之间的连接线。 4、图案密码的设置与验证。

android图形锁,Android图形解锁的绘制

先上图:其实很简单,不用过多解释,一点点注释就够了。Java代码:package com.example.graphicunlock;import android.os.Bundle;import android.os.Handler;import android.app.Activity;import android.content.Context;import android.content....

weixin_26841957的博客 548

消费级显卡跑大模型:RTX 3060 12G 部署 70 亿参数 AI 编程助手的优化实战

本文详细介绍了如何在消费级显卡RTX 3060 12G上,通过量化、投机解码和分页KV-Cache等核心优化技术,成功部署并流畅运行70亿参数的CodeLlama-7B编程助手。文章提供了从环境配置、模型准备到参数调优的完整实战笔记,实测显存占用降至7.3GB,生成速度达21.7 token/秒,为开发者和技术爱好者提供了可行的本地AI部署方案。

weixin_29053067的博客 1257

从原理图到代码:深入解析SX1278 LoRa模块与STM32的SPI通信驱动(附完整工程)

本文深入解析了SX1278 LoRa模块与STM32的SPI通信驱动实现,从硬件原理图到完整工程代码,详细介绍了LoRa技术的通信原理、寄存器配置、SPI接口设计及低功耗优化策略。适合物联网开发者和嵌入式工程师提升远距离无线通信能力,附完整工程代码助力快速开发。

weixin_42715608的博客 423

Android 图案解锁

首先还是看效果图。 图案解锁的功能在许多应用中都有用过,它比起数字解锁,带给用户的体验要好,今天就来一步一步实现这个功能。一、初始化初始化放在onDraw方法中,因为onDraw方法在绘制过程中会执行多次,我们设置一个标量isInit,使初始化只执行一次。@Override protected void onDraw(Canvas canvas) { if (!isI

charming的专栏 2213

SIwave仿真手册——电源完整性仿真之PDN阻抗的提取(四)

(想不到我这个弱鸡的博主有一天也有被催更的时候,看到后台被催的消息,我慌了,赶紧写一篇把。) 文章目录3.1 PDN阻抗的提取3.1.1手动完成PDN阻抗的提取1、创建pin group2、创建端口3、数据文件的清理和检查(参考1.3.4&1.3.5)4、添加电容模型(参考2.2.1)(==这一步很重要==)5、开始仿真6、查看仿真结果3.1.2利用向导工具完成PDN阻抗的提取1、点击图标![在这里插入图片描述](https://img-blog.csdnimg.cn/36d974339ea5449

luohuo9844的博客 1万+

python图案绘制解锁_Python&Appium实现安卓手机图形解锁

首先,在解锁状态下,建立一个Session,打开APP。然后,调用press_keycode()方法传入整型数值"26",锁定屏幕。通过implicitly_wait()方法等待两秒后,再次调用press_keycode()方法按下电源键,点亮屏幕。这时候看到的手机界面如下所示:此时,我们需要调用login_unlock()方法绘制图案解锁手机(预先设置好的解锁图形如上图所示)。login_unl...

weixin_39795065的博客 883

Anthropic三件套重构AI工作流:Claude Code、Design与桌面宠物实战指南

AI协作已从单点工具迈入系统化工作流阶段。理解AI作为‘协作者’而非‘执行器’的本质,是提升工程效率的关键前提;其核心在于对任务调度、自适应推理与人机交互边界的重新定义。Claude Code的xhigh effort机制体现了分层推理的工程智慧,Claude Design以HTML为原生设计语言实现设计-代码一体化,而桌面宠物则将抽象的token消耗具象为可感知的硬件反馈。这些能力共同指向一个趋势:AI工作流正从prompt调参走向契约式委派、从界面割裂走向跨模态统一。本文结合Opus 4.7最新实践,解

a4512138的专栏 484

【文献阅读笔记】之基于注意力机制的深度学习路面裂缝检测

中文,计算机辅助设计与图形学学报,第 32 卷 第 8 期,2020 年 8 月。 DOI: 10.3724/SP.J.1089.2020.18059 摘要: 为实现自动准确地检测路面裂缝, 提升路面裂缝检测效果, 提出了一种基于注意力机制的裂缝检测网络 (attention-based crack networks, ACNet). 该网络采用编码器-解码器网络构架, 编码器采用 ResNet34 为骨干网, 提取路面裂缝特征; 在编码器和解码器间加入基于注意力机制的特征模块(attention-b

qq_44785998的博客 7593

python图案绘制解锁_Python&Appium实现安卓手机图形解锁详解

首先,在解锁状态下,建立一个Session,打开APP。然后,调用press_keycode()方法传入整型数值"26",锁定屏幕。通过implicitly_wait()方法等待两秒后,再次调用press_keycode()方法按下电源键,点亮屏幕。这时候看到的手机界面如下所示: 此时,我们需要调用login_unlock()方法绘制图案解锁手机(预先设置好的解锁图形如上图所示)。login_un...

weixin_39687359的博客 330

基于libVLC的视频播放器之四:直接使用libVLC

一.效果 播放本地文件 播放网络url:rtsp://3.84.6.190/vod/mp4:BigBuckBunny_115k.mov 二.实现 既然有VLC-Qt,为什么还要直接调用libVLC呢,因为直接调用会加深对整个播放流程的理解,方便后面修改VLC-Qt源码。 注意事项: 1.编译报错:error C2065: “libvlc_media_read_cb”: 未声明的标识符。修改如下: 2.libvlc_new(0, nullptr)返回null 将plugins

草上爬的博客 5049

Python&Appium实现安卓手机图形解锁

首先,在解锁状态下,建立一个Session,打开APP。然后,调用press_keycode()方法传入整型数值"26",锁定屏幕。通过implicitly_wait()方法等待两秒后,再次调用press_keycode()方法按下电源键,点亮屏幕。这时候看到的手机界面如下所示: 此时,我们需要调用login_unlock()方法绘制图案解锁手机(预先设置好的解锁图形如上图所示)。 l...

aihuanshang9340的博客 252

微信小程序 - 详细实现可移动悬浮按钮,全屏悬浮元素图标可拖动拖拽并自动吸附边缘,微信小程序实现悬浮球吸附边缘+计算靠边靠拢效果(详细代码,拖拽中途放手,靠左就自动跑到屏幕左侧,反之靠右跑到屏幕右侧)

微信小程序,vue2,vue3,微信小程序悬浮功能小按钮,自动吸附边缘效果,微信小程序之可拖动悬浮按钮的实现,如何实现靠近边缘自动吸住功能,小程序右下角的悬浮效果,实现可拖动悬浮图标,自动向两边靠拢,悬浮按钮的实现,微信小程序悬浮球效果,微信小程序(可拖动悬浮按钮)当靠近屏幕边缘时会磁吸靠近,如何实现全局悬浮按钮,悬浮球判断吸附在左右,全屏悬浮能拖着走,小程序怎么做悬浮图标靠近左右两侧能吸附住,悬浮菜单按钮,悬浮球可拖拽,全局悬浮球,全局悬浮框,实现悬浮按钮可拖动,自动吸附边缘效果,若按钮此时位于页面中间偏

🏆 前端领域优质创作者 1万+

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

PyQt 实现Android的图案密码(图形解锁)源码分享

本文分享了使用PyQt6实现Android风格图案解锁功能的Python源码。该实现包含动态背景粒子效果、九宫格手势识别和动画反馈,完整还原了Android系统的图形解锁体验。核心功能包括:1)支持绘制手势图案并验证;2)正确/错误状态动画反馈;3)可自定义正确密码;4)重置和忘记密码功能。代码采用面向对象设计,通过QPropertyAnimation实现流畅动画,包含详细的注释说明,适合PyQt初学者学习自定义控件开发和动画实现。

本博客分享软硬件一体化开发实战。硬件涵盖 PCB 设计、STM32 等 MCU 底层开发;软件包含 C++、Rust,Qt/QML、PyQt、Slint、TouchGFX、LVGL 各类 GUI 框架。方便软硬件开发者查阅学习。欢迎关注! 1379

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

python图案绘制解锁_Python&Appium实现安卓手机图形解锁案例

首先,在解锁状态下,建立一个Session,打开APP。然后,调用press_keycode()方法传入整型数值"26",锁定屏幕。通过implicitly_wait()方法等待两秒后,再次调用press_keycode()方法按下电源键,点亮屏幕。这时候看到的手机界面如下所示:此时,我们需要调用login_unlock()方法绘制图案解锁手机(预先设置好的解锁图形如上图所示)。login_unl...

weixin_39907762的博客 240

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

QML 实现Android的图案密码(图形解锁)源码分享

本文分享了使用QML实现的Android风格图案密码解锁功能源码。核心组件包括Main.qml主窗口和PatternLock.qml解锁逻辑。PatternLock实现了9点图案绘制功能,支持自定义正确密码(示例为[0,1,2,4,8]),提供成功/失败状态反馈。界面包含动态粒子背景、发光连接线效果和状态提示文字,支持最少连接4个点的校验规则。当用户绘制完成时,会通过inputResSignal信号返回校验结果。整体采用深色主题设计,具有流畅的动画效果,完美复现了Android系统的图形解锁体验。

本博客分享软硬件一体化开发实战。硬件涵盖 PCB 设计、STM32 等 MCU 底层开发;软件包含 C++、Rust,Qt/QML、PyQt、Slint、TouchGFX、LVGL 各类 GUI 框架。方便软硬件开发者查阅学习。欢迎关注! 1797

Android图形解锁的绘制

先上图: 其实很简单,不用过多解释,一点点注释就够了。 Java代码: package com.example.graphicunlock; import android.os.Bundle; import android.os.Handler; import android.app.Activity; import android.c

IJUST的专栏 1933
上一篇: Android 系统源码网盘下载
下一篇: coding git 初始化与项目远程连接(一)
木槿花雨
博客等级 码龄11年 20粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值