安卓程序锁

原创 2015年11月20日 15:09:55

安卓程序锁
现在主流的安卓APP都带有自己的程序锁,在学习完安卓之后自己开发了属于自己的安卓程序锁,代码简单而又有注释

资源下载:
安卓程序锁 资源下载地址

看如下图:
1.进入正常界面:
初始化界面:
2.绘制界面
绘制界面
3.密码错误界面
密码绘制错误界面
4.密码绘制成功后进入主界面
成功绘制进入主界面


锁屏主要代码摘要:

import java.util.ArrayList;
import java.util.List;

import com.infohold.lockpoint.R;

import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
/**
 * Email 1107438082@.com
 * @author 志鸿思荣
 *
 */
@SuppressLint({ "ClickableViewAccessibility", "DrawAllocation" })
public class LockPatternView extends View {
    //监听器
    private OnPatterChangeListner onPatterChangeListner;
    private static int POINT_SIZE = 5;
    // 画笔
    private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
    // 定义九个点
    public Point[][] points = new Point[3][3];
    // 矩阵
    private Matrix matrix = new Matrix();
    private boolean isInit, isSelect, isFinish, movingNoPoint;
    private float width, height, offsetX, offsetY, bitmapR, movingX, movingY;
    private Bitmap pointsNomal, pointsPressed, pointsError, linePressed,
            lineError;
    private List<Point> pointList = new ArrayList<Point>();

    public LockPatternView(Context context) {
        super(context);
    }

    public LockPatternView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        // TODO Auto-generated constructor stub
    }

    public LockPatternView(Context context, AttributeSet attrs) {
        super(context, attrs);
        // TODO Auto-generated constructor stub
    }

    /**
     * 初始化九个点
     */
    @Override
    protected void onDraw(Canvas canvas) {
        // TODO Auto-generated method stub
        super.onDraw(canvas);
        if (!isInit) {
            initPoints();
        }
        if (pointList.size() > 0) {
            // 绘制九宫格里面的点
            Point a = pointList.get(0);
            for (int i = 0; i < pointList.size(); i++) {
                Point b = pointList.get(i);
                line2Canvas(canvas, a, b);
                a = b;
            }
            // 绘制鼠标坐标点
            if (movingNoPoint) {
                line2Canvas(canvas, a, new Point(movingX, movingY));
            }
        }
        point2Canvas(canvas);
    }

    /**
     * 绘制划线
     * 
     * @param canvas
     *            画布
     * @param a
     *            第一个点
     * @param b
     *            第二个点
     */
    private void line2Canvas(Canvas canvas, Point a, Point b) {
        // 线的长度
        float lineLength = (float) Point.distance(a, b);
        float degrees = getDegree(a, b);
        canvas.rotate(degrees, a.x, a.y);
        if (a.state == Point.STATE_PRESSED) {
            matrix.setScale(lineLength / linePressed.getWidth(), 1);
            // 矩阵处理线的平移动,从第一个点进行平移
            matrix.postTranslate(a.x - linePressed.getWidth() / 2, a.y- linePressed.getHeight() / 2);
            canvas.drawBitmap(linePressed, matrix, paint);
        } else {
            matrix.setScale(lineLength / lineError.getWidth(), 1);
            // 矩阵处理线的平移动,从第一个点进行平移
            matrix.postTranslate(a.x - lineError.getWidth() / 2, a.y- lineError.getHeight() / 2);
            canvas.drawBitmap(lineError, matrix, paint);
        }
        canvas.rotate(-degrees, a.x, a.y);
    }

    /**
     * 将点绘制到画布上
     * 
     * @param canvas
     */
    private void point2Canvas(Canvas canvas) {
        for (int i = 0; i < points.length; i++) {
            for (int j = 0; j < points[i].length; j++) {
                Point point = points[i][j];
                if (point.state == Point.STATE_PRESSED) {
                    canvas.drawBitmap(pointsPressed, point.x - bitmapR, point.y
                            - bitmapR, paint);
                } else if (point.state == Point.STATE_ERROR) {
                    canvas.drawBitmap(pointsError, point.x - bitmapR, point.y
                            - bitmapR, paint);
                } else {
                    canvas.drawBitmap(pointsNomal, point.x - bitmapR, point.y
                            - bitmapR, paint);
                }
            }
        }
    }

密码碎片

package com.weiqiang.lockpoint;

import android.app.Fragment;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.infohold.lockpoint.R;
import com.weiqiang.lockpoint.LockPatternView.OnPatterChangeListner;

/**
 * 密码碎片
 * 
 * @author 志鸿思荣
 * 
 */
public class PasswordFragment extends Fragment implements OnPatterChangeListner, OnClickListener {
    public static final String TYPE_SETTING = "setting";
    public static final String TYPE_CHECK = "check";
    private TextView mainLock;
    private LockPatternView lockPatternView;
    private LinearLayout btnLinearLayout;
    private static final String ARG_TYPE = "type";
    private String passString;

    public PasswordFragment() {
    }

    public static android.app.Fragment newInstance(String arg_type) {
        PasswordFragment fragment = new PasswordFragment();
        Bundle args = new Bundle();
        args.putString(ARG_TYPE, arg_type);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    @Nullable
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_password, container, false);
        mainLock = (TextView) v.findViewById(R.id.fragment_password_lock_hint);
        lockPatternView = (LockPatternView) v
                .findViewById(R.id.fragment_password_lock);
        btnLinearLayout = (LinearLayout) v
                .findViewById(R.id.fragment_password_btn_layout);
        // 设置密码
        if (getArguments() != null) {
            if (TYPE_SETTING.equals(getArguments().getString(ARG_TYPE))) {
                btnLinearLayout.setVisibility(View.VISIBLE);
            }
        }
        v.findViewById(R.id.fragment_password_btn_commit).setOnClickListener(this);
        v.findViewById(R.id.fragment_password_btn_forget).setOnClickListener(this);
        lockPatternView.setPatterChangeListner(this);
        return v;
    }

    @Override
    public void onPatterChange(String passString) {
        this.passString = passString;
        if (!TextUtils.isEmpty(passString)) {
            mainLock.setText(passString);
            //没有密码直接进入主页面
            // 检查密码
             if (getArguments() != null) {
                if (TYPE_CHECK.equals(getArguments().getString(ARG_TYPE))) {
                    SharedPreferences sp = getActivity().getSharedPreferences("sp", Context.MODE_PRIVATE);
                    // 检查成功
                    if (passString.equals(sp.getString("password", ""))) {
                        getActivity().startActivity(new Intent(getActivity(), MainActivity.class));
                        getActivity().finish();
                        // 检查失败
                    } else {
                        mainLock.setText("密码错误");
                        lockPatternView.errorPoint();
                    }
                }
            }
        } else {
            mainLock.setText("请设置至少5位密码");
        }
    }

    @Override
    public void onPatterStart(boolean isStart) {
        if (isStart) {
            mainLock.setText("请绘制图案");
        }
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.fragment_password_btn_commit:
            SharedPreferences sp = getActivity().getSharedPreferences("sp",
                    Context.MODE_PRIVATE);
            // 设置密码
            sp.edit().putString("password", passString).commit();
            getActivity().finish();
            break;
        case R.id.fragment_password_btn_forget:
             sp = getActivity().getSharedPreferences("sp",Context.MODE_PRIVATE);
            // 设置密码
            sp.edit().putString("password", "").commit();
            startActivity(new Intent(getActivity(), SettingPasswordActivity.class));
            getActivity().finish();
            break;
        }
    }
}

更多请下载资源安卓程序锁屏或者联系作者1107438082@qq.com

版权声明:本文为博主原创文章,未经博主允许不得转载。

自定义View之粘性下拉刷新效果

PullView.java/** * Created by jian on 17-8-16. */public class PullView extends View { //圆的画笔 ...

使用Bmob云端服务器模拟简单的注册登录

前一阶段看徐宜生写的Android群英传里面介绍的搭建云端服务器,那个时候自己不懂,加上有其他的学习,就没有深入,但是这两天找了资料研究了一下,读了官方文档,感觉挺不错的,服务端不用自己搭建了。(听说...

安卓程序锁(来自91市场)源代码

  • 2015年08月31日 10:19
  • 2.41MB
  • 下载

安卓应用程序密码锁的实现

功能: 1.应用程序程序中设置了密码锁,每当用户打开应用时,要弹出密码输入界面; 2.当用户按住home键,将程序隐在后台而非退出,经过一段时间后,再重新启动,也要弹出密码输入界面; 3.当应用在前台...

Lockdown Pro程序锁 v2.6.4 安卓最新版

Lockdown Pro在Android平台和iPhone平台相比来说,有一个优势就是可定制。用户可以根据自己的需要,很自由的给每个应用程序加上密码锁,...

[cocos2dx]windows上编译安卓程序

首先在exclipe上配置好java的jdk1.6或更高,配置好android环境(最好有android2.1或2.2以及更高版本的sdk)。 在下载个ndk,ndk解压后先放到一边,cygwi...

将自己的应用加入到程序启动列表(安卓)

需求:最近在学习vlc的使用,做了一个简易的app,要实现一个功能,点击某个视频文件的时候,把自己的app加入到可以选择的程序的列表。效果如图:解决方法:第一步 在设定启动的Activity的清单文...

安卓应用开发实战:[2]修改程序名称&标题

 在《安卓应用开发实战:[1]最简单的拨打电话软件》中我们只用了几行代码就亲身体验了一把编写安卓应用的乐趣。在这个代码的基础上,我们学习如何把程序名修改为我们想要的。 百度经验:jingyan...

安卓开发中,release安装包安装后,打开app后再按home键,再次点击程序图标app再次重新启动的解决办法

安卓开发中,release安装包安装后,打开app后再按home键,再次点击程序图标app再次重新启动的解决办法 在开发中我们一般都是直接AS上的安装(Run)按钮,直接安装到真机或模拟器上...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:安卓程序锁
举报原因:
原因补充:

(最多只允许输入30个字)