我的编程空间,编程开发者的网络收藏夹
学习永远不晚

android实现滑动解锁

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

android实现滑动解锁

效果图

  

需要用到的画笔, 整体灰色的背景,  滑块, 滑动之后绿色背景, 字体 


       mSliPaint = new Paint();
        mSliPaint.setColor(Color.parseColor("#4a4c5b"));
        mSliPaint.setAntiAlias(true);
        mBgPaint = new Paint();
        mBgPaint.setColor(Color.parseColor("#a6a6a6"));
        mBgPaint.setAntiAlias(true);
        mBluePaint = new Paint();
        mBluePaint.setColor(Color.parseColor("#009496"));
        mBluePaint.setAntiAlias(true);
        mPaint = new Paint();
        mPaint.setColor(Color.WHITE);
        mPaint.setTextSize(mTextSize);
        //该方法即为设置基线上那个点究竟是left,center,还是right
        mPaint.setTextAlign(Paint.Align.LEFT);

在onDraw中绘制  mMovex为手指滑动的X坐标


 @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        //背景色
        RectF oval = new RectF(margin, margin, width - margin, height - margin);// 设置个新的长方形
        canvas.drawRect(oval,mBgPaint);
        //划过去背景色
        RectF ovalBlue= new RectF(margin,margin,mMoveX+margin,mR*2+margin*3);
        canvas.drawRect(ovalBlue,mBluePaint);
        //文字
        Paint.FontMetrics fontMetrics = mPaint.getFontMetrics();
        float top = fontMetrics.top;//为基线到字体上边框的距离
        float bottom = fontMetrics.bottom;//为基线到字体下边框的距离
        int baseLineY = (int) (height / 2 - top / 2 - bottom / 2);//基线中间点的y轴计算公式
        canvas.drawText(mText, mTextLeft, baseLineY, mPaint);
        //滑块
        RectF oval2 = new RectF(mMoveX+margin,margin,mMoveX+mR*3+margin*3,mR*2+margin*3);// 设置个新的长方形
        canvas.drawRect(oval2,mSliPaint);//方形
        //三个小箭头
        Bitmap bitmap = BitmapFactory.decodeResource(this.getContext().getResources(), R.mipmap.arrow_right_small);
        canvas.drawBitmap(bitmap,mMoveX+(mMoveX+mR*3+margin*3-mMoveX)/2-15,mR-margin,mSliPaint);
        canvas.drawBitmap(bitmap,mMoveX+(mMoveX+mR*3+margin*3-mMoveX)/2,mR-margin,mSliPaint);
        canvas.drawBitmap(bitmap,mMoveX+(mMoveX+mR*3+margin*3-mMoveX)/2+15,mR-margin,mSliPaint);
    }

onTouch中进行滑动监听 负值


    @Override
    public boolean onTouchEvent(MotionEvent event) {
//        Log.e(event.getAction()+"");
        // 点击是否在滑块上
        if (event.getAction() != MotionEvent.ACTION_DOWN
                && !mSliderRect.contains((int) mStartX, (int) mStartY)) {
            if (event.getAction() == MotionEvent.ACTION_UP
                    || event.getAction() == MotionEvent.ACTION_CANCEL) {
                mHandler.sendEmptyMessageDelayed(MSG_REDRAW, DRAW_INTERVAL);
            }
            return super.onTouchEvent(event);
        }
        acquireVelocityTrackerAndAddMovement(event);
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                mStartX = event.getX();
                mStartY = event.getY();
                mLastX = mStartX;
                mHandler.removeMessages(MSG_REDRAW);
//                L.e("按下");
                Log.e("SlideU","按下");
                break;
            case MotionEvent.ACTION_MOVE:
                Log.e("SlideU","移动");
                mLastX = event.getX();
                if (mLastX > mStartX) {
                    if (mLastX - mStartX > mSlidableLength) {
                        mLastX = mStartX + mSlidableLength;
                        mMoveX = mSlidableLength;
                    } else {
                        mMoveX = (int) (mLastX - mStartX);
                    }
                } else {
                    mLastX = mStartX;
                    mMoveX = 0;
                }
                invalidate();
                break;
            case MotionEvent.ACTION_UP:
            case MotionEvent.ACTION_CANCEL:
                Log.e("SlideU","超出或抬起");
                mVelocityTracker.computeCurrentVelocity(1000, mMaxVelocity);
                float velocityX = mVelocityTracker.getXVelocity();
                Log.e("SlideU","速度"+velocityX);
                if (mLastX - mStartX > mEffectiveLength || velocityX/2 > mEffectiveVelocity) {
                    startAnimator(mLastX - mStartX,  mSlidableLength, velocityX, true);
                } else {
                    startAnimator(mLastX - mStartX,  0, velocityX, false);
                    mHandler.sendEmptyMessageDelayed(MSG_REDRAW, DRAW_INTERVAL);
                }
                releaseVelocityTracker();
                break;
        }
        return super.onTouchEvent(event);
    }

整体代码


public class LoadAwaySlideUnlockView extends View {
    public interface UnlockListener {
        void onLoadAwayUnlock();
    }
    private UnlockListener mUnlockListener;
    public void setUnlockListener(UnlockListener unlockListener) {
        mUnlockListener = unlockListener;
    }
    private static final int MSG_REDRAW = 1;
    private static final int DRAW_INTERVAL = 50;
    private static final int STEP_LENGTH = 10;//速度
    private Paint mPaint;//文字的画笔
    private Paint mSliPaint;//滑块画笔
    private Paint mBgPaint;//背景画笔
    private Paint mBluePaint;//划过去之后蓝色背景的画笔
    private VelocityTracker mVelocityTracker;//滑动速度
    private int mMaxVelocity;
    private LinearGradient mGradient;//渐变色
    private LinearGradient bgGradient;//背景渐变色
//    private LinearGradient sliGradient;//滑块渐变色
//    LinearGradient有两个构造函数;
//
//    public LinearGradient(float x0, float y0, float x1, float y1, int[] colors, float[] positions,Shader.TileMode tile)
//
//    参数:
//
//    float x0: 渐变起始点x坐标
//
//    float y0:渐变起始点y坐标
//
//    float x1:渐变结束点x坐标
//
//    float y1:渐变结束点y坐标
//
//    int[] colors:颜色 的int 数组
//
//    float[] positions: 相对位置的颜色数组,可为null,  若为null,可为null,颜色沿渐变线均匀分布
//
//    Shader.TileMode tile: 渲染器平铺模式
//
//
//
//    public LinearGradient(float x0, float y0, float x1, float y1, int color0, int color1,Shader.TileMode tile)
//
//    float x0: 渐变起始点x坐标
//
//    float y0:渐变起始点y坐标
//
//    float x1:渐变结束点x坐标
//
//    float y1:渐变结束点y坐标
//
//    int color0: 起始渐变色
//    int color1: 结束渐变色
//
//    Shader.TileMode tile: 渲染器平铺模式
    private int[] mGradientColors;
    private int[] bgGradientColors;
    private int mGradientIndex;
    private Interpolator mInterpolator;
    private float mDensity;
    private Matrix mMatrix;
    private ValueAnimator mValueAnimator;
    private int width;
    private int height;
    private String mText;//文字
    private int mTextSize;//文字大小
    private int mTextLeft;//文字距离左边
    private int mR;//滑块的半径
    private float margin;
    private Rect mSliderRect;
    private int mSlidableLength;    // SlidableLength = BackgroundWidth - LeftMagins - RightMagins - SliderWidth
    private int mEffectiveLength;   // Suggested length is 20pixels shorter than SlidableLength
    private float mEffectiveVelocity = 1000;//滑块自动回滚的速度
    private float mStartX;
    private float mStartY;
    private float mLastX;
    private float mMoveX;
    public LoadAwaySlideUnlockView(Context context) {
        this(context, null);
    }
    public LoadAwaySlideUnlockView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }
    public LoadAwaySlideUnlockView(Context context, AttributeSet attrs, int defStyleAttr) {
        this(context, attrs, defStyleAttr, 0);
    }
    public void setText(String text){
        mText = text;
    }
    public LoadAwaySlideUnlockView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        mDensity = getResources().getDisplayMetrics().density;
        ViewConfiguration configuration = ViewConfiguration.get(context);
        mMaxVelocity = configuration.getScaledMaximumFlingVelocity();
        mInterpolator = new AccelerateDecelerateInterpolator();
        setClickable(true);
        setFocusable(true);
        setFocusableInTouchMode(true);
        mSlidableLength = 200;
        mTextSize = 30;//文字大小
        mTextLeft = 10;//文字距离左边
        mMoveX = 0;
        mGradientIndex = 0;
        mSliPaint = new Paint();
        mSliPaint.setColor(Color.parseColor("#4a4c5b"));
        mSliPaint.setAntiAlias(true);
        mBgPaint = new Paint();
        mBgPaint.setColor(Color.parseColor("#a6a6a6"));
        mBgPaint.setAntiAlias(true);
        mBluePaint = new Paint();
        mBluePaint.setColor(Color.parseColor("#009496"));
        mBluePaint.setAntiAlias(true);
        mPaint = new Paint();
        mPaint.setColor(Color.WHITE);
        mPaint.setTextSize(mTextSize);
        //该方法即为设置基线上那个点究竟是left,center,还是right
        mPaint.setTextAlign(Paint.Align.LEFT);
        //  mHandler.sendEmptyMessageDelayed(MSG_REDRAW, DRAW_INTERVAL);
    }
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        int specWidthSize = MeasureSpec.getSize(widthMeasureSpec);//宽
        int specHeightSize = MeasureSpec.getSize(heightMeasureSpec);//高
        mMatrix = new Matrix();
        width = specWidthSize;
        height = specHeightSize;
        mTextLeft = (int) (height * 1.5);
        margin = height / 20;
        mR = (int) (((height-margin*2) / 2)-margin);
        //最大滑动距离
        mSlidableLength = (int) (specWidthSize -(mMoveX+mR*3+margin*3-mMoveX+margin));
        //有效距离
        mEffectiveLength = mSlidableLength-20;
        mSliderRect=new Rect((int)margin, (int)margin, 300, (int)(height - margin));
        mGradientColors = new int[]{Color.argb(255, 120, 120, 120),
                Color.argb(255, 120, 120, 120), Color.argb(255, 255, 255, 255)};
        mGradient = new LinearGradient(0, 0, width/2, 0, mGradientColors,
                new float[]{0, 0.7f, 1}, Shader.TileMode.MIRROR);
        bgGradient = new LinearGradient(
                0, 0, 0, (float) ((height)/2.0),
                Color.argb(80, 0X77, 0X77, 0X77), Color.argb(200, 0X11, 0X11, 0X11),
                Shader.TileMode.CLAMP
        );
        mHandler.removeMessages(MSG_REDRAW);
        mHandler.sendEmptyMessageDelayed(MSG_REDRAW, DRAW_INTERVAL);
    }
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        //背景色
        RectF oval = new RectF(margin, margin, width - margin, height - margin);// 设置个新的长方形
        canvas.drawRect(oval,mBgPaint);
        //划过去背景色
        RectF ovalBlue= new RectF(margin,margin,mMoveX+margin,mR*2+margin*3);
        canvas.drawRect(ovalBlue,mBluePaint);
        //文字
        Paint.FontMetrics fontMetrics = mPaint.getFontMetrics();
        float top = fontMetrics.top;//为基线到字体上边框的距离
        float bottom = fontMetrics.bottom;//为基线到字体下边框的距离
        int baseLineY = (int) (height / 2 - top / 2 - bottom / 2);//基线中间点的y轴计算公式
        canvas.drawText(mText, mTextLeft, baseLineY, mPaint);
        //滑块
        RectF oval2 = new RectF(mMoveX+margin,margin,mMoveX+mR*3+margin*3,mR*2+margin*3);// 设置个新的长方形
        canvas.drawRect(oval2,mSliPaint);//方形
        //三个小箭头
        Bitmap bitmap = BitmapFactory.decodeResource(this.getContext().getResources(), R.mipmap.arrow_right_small);
        canvas.drawBitmap(bitmap,mMoveX+(mMoveX+mR*3+margin*3-mMoveX)/2-15,mR-margin,mSliPaint);
        canvas.drawBitmap(bitmap,mMoveX+(mMoveX+mR*3+margin*3-mMoveX)/2,mR-margin,mSliPaint);
        canvas.drawBitmap(bitmap,mMoveX+(mMoveX+mR*3+margin*3-mMoveX)/2+15,mR-margin,mSliPaint);
    }
    public void reset() {
        if (mValueAnimator != null) {
            mValueAnimator.cancel();
        }
        mMoveX = 0;
        mPaint.setAlpha(255);
        mHandler.removeMessages(MSG_REDRAW);
        mHandler.sendEmptyMessageDelayed(MSG_REDRAW,200);
    }
    @Override
    public boolean onTouchEvent(MotionEvent event) {
//        Log.e(event.getAction()+"");
        // 点击是否在滑块上
        if (event.getAction() != MotionEvent.ACTION_DOWN
                && !mSliderRect.contains((int) mStartX, (int) mStartY)) {
            if (event.getAction() == MotionEvent.ACTION_UP
                    || event.getAction() == MotionEvent.ACTION_CANCEL) {
                mHandler.sendEmptyMessageDelayed(MSG_REDRAW, DRAW_INTERVAL);
            }
            return super.onTouchEvent(event);
        }
        acquireVelocityTrackerAndAddMovement(event);
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                mStartX = event.getX();
                mStartY = event.getY();
                mLastX = mStartX;
                mHandler.removeMessages(MSG_REDRAW);
//                L.e("按下");
                Log.e("SlideU","按下");
                break;
            case MotionEvent.ACTION_MOVE:
                Log.e("SlideU","移动");
                mLastX = event.getX();
                if (mLastX > mStartX) {
                    if (mLastX - mStartX > mSlidableLength) {
                        mLastX = mStartX + mSlidableLength;
                        mMoveX = mSlidableLength;
                    } else {
                        mMoveX = (int) (mLastX - mStartX);
                    }
                } else {
                    mLastX = mStartX;
                    mMoveX = 0;
                }
                invalidate();
                break;
            case MotionEvent.ACTION_UP:
            case MotionEvent.ACTION_CANCEL:
                Log.e("SlideU","超出或抬起");
                mVelocityTracker.computeCurrentVelocity(1000, mMaxVelocity);
                float velocityX = mVelocityTracker.getXVelocity();
                Log.e("SlideU","速度"+velocityX);
                if (mLastX - mStartX > mEffectiveLength || velocityX/2 > mEffectiveVelocity) {
                    startAnimator(mLastX - mStartX,  mSlidableLength, velocityX, true);
                } else {
                    startAnimator(mLastX - mStartX,  0, velocityX, false);
                    mHandler.sendEmptyMessageDelayed(MSG_REDRAW, DRAW_INTERVAL);
                }
                releaseVelocityTracker();
                break;
        }
        return super.onTouchEvent(event);
    }
    private void startAnimator(float start, float end, float velocity, boolean isRightMoving) {
        if (velocity =Integer.MAX_VALUE){
                        mGradientIndex = 0;
                    }
                    mHandler.sendEmptyMessageDelayed(MSG_REDRAW, DRAW_INTERVAL);
                    break;
            }
        }
    };
}

xml布局


activity中 添加提示文字和滑动监听即可


slideUnlock.setText("中间提示文字");
slideUnlock.setSlideListener(this);

作者:smallredzi


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

android实现滑动解锁

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

android实现滑动解锁

效果图需要用到的画笔, 整体灰色的背景,  滑块, 滑动之后绿色背景, 字体 mSliPaint = new Paint();mSliPaint.setColor(Color.parseColor("#4a4c5b"));mSliPaint
2022-06-06

Android自定义view实现滑动解锁九宫格控件

这篇文章主要介绍了Android自定义view实现滑动解锁九宫格控件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
2023-02-09

vue怎么实现滑动解锁功能

本文小编为大家详细介绍“vue怎么实现滑动解锁功能”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue怎么实现滑动解锁功能”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。效果如下话不多说,直接上代码;
2023-06-29

使用Android自定义控件实现滑动解锁九宫格

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

如何使用js实现滑动拼图解锁

这篇文章主要介绍如何使用js实现滑动拼图解锁,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!具体内容如下简单实现滑动解锁,效果图是这样的
2023-06-29

Android studio实现滑动开关

大家好,今天刚学会使用Android Studio实现滑动开关的效果,自己感觉还可以,和大家分享一下,如果觉得可以的可以拿去,然后再给我点个赞,谢谢。本人也是学Android studiok开发不久,是个菜鸟,各位大佬觉得有不好的地方,可以
2022-06-06

怎么在Android中通过自定义view实现滑动解锁效果

怎么在Android中通过自定义view实现滑动解锁效果?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。自定义view如下@SuppressLint("ClickableVi
2023-06-15

Android studio 滑动开关实现

大家好,今天刚学会使用Android Studio实现滑动开关的效果,自己感觉还可以,和大家分享一下,如果觉得可以的可以拿去,然后再给我点个赞,谢谢。本人也是学Android studiok开发不久,是个菜鸟,各位大佬觉得有不好的地方,可以
2022-06-06

android 九宫格滑动解锁开机实例源码学习

效果图由于网站占时不能上传,以后补上。 NinePointLineView.java 代码如下: package org.demo.custon_view; import org.demo.utils.MLog; import andro
2022-06-06

Android自定义滑动解锁控件使用详解

最近的项目里用到了,在网上找不到合适的,于是自己写了个简单的,带回弹效果:可以自定义的属性有:
2023-05-30

android滑动解锁震动效果的开启和取消

如果我们需要根据设置中的触摸震动开关来开启和取消滑动解锁的震动效果,就需要做以下修改了。 在LockScreen.java类中的LockScreen方法中的 代码如下:else if (mUnlockWidget instanc
2022-06-06

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录